【FPGA实验3】双优先编码器
双优先编码器
要求设计输入8位reg信号,输出是双优先级,分别用3位二进制代码表示最高优先级和次最高优先级。
1、列出真值表
2、设计电路、编写代码
3、设计测试电路代码
4、综合
5、用测试代码测试
6、设计实验电路(描述如何在实验室完成电路的硬件测试和验证)
快速导航
-
-
-
-
- 1、真值表
- 2、代码
- 3、测试代码
- 4、用测试代码测试
- 5、用实验箱完成验证
-
-
-
1、真值表
普通的优先编码器就是只对最高的输入响应,最高位无输入才对次高位进行响应,最高位、次高位都无输入才对第三高位进行响应,依次类推。。。
而双优先编码器是对输入中最高的两位进行响应,例如输入是[7:0]=01011010,第7位无输入,第6位有输入,第5位无输入……那么输出最高位为6,输出次高位为4。
考虑到输入只有1位的情况,那么该位作为最高位,次高位输出为7(在输入≥2位的情况下,次高位不可能为7)。
对应的真值表如下:
2、代码
module DualPriorityEncoder(input wire [7:0]datain,output wire [2:0]St_priority,output wire [2:0]Nd_priority);reg St_flag;reg Nd_flag;reg [2:0]St_pri,Nd_pri;always @* begin:fyinteger i;St_flag=1'b0;Nd_flag=1'b0;$display(datain[1]);for(i=7;i>=0;i=i-1)beginif(datain[i]==1&&St_flag==0)beginSt_pri=i;St_flag=1'b1;endelse if(datain[i]==1&&St_flag==1&&Nd_flag==0)beginNd_pri=i;Nd_flag=1'b1;endend$display(St_priority,Nd_priority);
// if(Nd_flag==1'b0) Nd_pri=3'b111;endassign St_priority=St_pri;assign Nd_priority=Nd_pri;endmodule
得到的RTL图如下:
3、测试代码
`timescale 1ns/100psmodule tb_DualPriorityEncoder;reg[7:0]datain_1;
wire[2:0]St_priority_1,Nd_priority_1;
reg St_flag,Nd_flag,clk;
parameter CLK_PER=10;always #(CLK_PER/2) clk=~clk;initial begindatain_1=8'b00000000;
// St_pri=1'b0;
// Nd_pri=1'b0;St_flag=1'b0;Nd_flag=1'b0;clk=1'b0;# 320 $stop(2);
endalways @(posedge clk)datain_1=datain_1+1; DualPriorityEncoder DPE_1(.datain(datain_1),.St_priority(St_priority_1),.Nd_priority(Nd_priority_1)); //实例化被测模块endmodule
4、用测试代码测试
模块【右键】➡️【Settings】➡️【EDA Tools Settings】➡️【Simulation】
【Compile Test Bench】,把文件添加进去即可
添加完成后,【Tools】➡️【Run Simulation Tool】➡️【RTL Simulation】
仿真结果如下所示,
当输入的8位信号是00011011时,最高优先位是4(第5位),次优先位为3(第4位),符合双优先编码器的功能。
当输入的8位信号是00000011时,最高优先位是1(第2位),次优先位为0(第1位),符合双优先编码器的功能。
5、用实验箱完成验证
用8个按键K0~K7表示8路信号的输入,
用8个LED灯L7~L0其中两个的亮起来表示最高位信号和次高位信号。
当只有一个信号输入时,只有一个LED灯亮起;
无信号输入时,所有LED灯保持灭的状态。
(1)修改代码如下:
module DualPriorityEncoder(input wire [7:0]key,output reg [7:0]led );reg St_flag;reg Nd_flag;reg [2:0]St_pri,Nd_pri;always @* begin:fyinteger i;led=8'b11111111;St_flag=1'b0;Nd_flag=1'b0;for(i=7;i>=0;i=i-1)beginif(key[i]==1&&St_flag==0)beginSt_pri=i;St_flag=1'b1;endelse if(key[i]==1&&St_flag==1&&Nd_flag==0)beginNd_pri=i;Nd_flag=1'b1;endendif(St_flag==1) led[St_pri]=0;if(Nd_flag==1) led[Nd_pri]=0; endendmodule
(2)对应的RTL图
Quartus 12对应的RTL图:
Quartus 18.0对应的RTL图:
(3)引脚分配与接线
引脚分配接线如下
JP1连接到JX5或JX6,JP5连接到JX22。
(为什么这样接线可参考《【FPGA实验2】二进制转为格雷码》➡️三、试验箱实验➡️3、引脚分配)
(3)实验现象:
【FPGA实验3】双优先编码器