【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)。

对应的真值表如下:

【FPGA实验3】双优先编码器_第1张图片
【FPGA实验3】双优先编码器_第2张图片

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:fy
		integer i;
		St_flag=1'b0;
		Nd_flag=1'b0;
		$display(datain[1]);

		for(i=7;i>=0;i=i-1)begin

			if(datain[i]==1&&St_flag==0)begin
				St_pri=i;
				St_flag=1'b1;
			end
			else if(datain[i]==1&&St_flag==1&&Nd_flag==0)begin
				Nd_pri=i;
				Nd_flag=1'b1;
			
			end
		end
				$display(St_priority,Nd_priority);
//			if(Nd_flag==1'b0) Nd_pri=3'b111;
		end
		
		assign St_priority=St_pri;
		assign Nd_priority=Nd_pri;
		

endmodule

得到的RTL图如下:
【FPGA实验3】双优先编码器_第3张图片

3、测试代码
`timescale 1ns/100ps

module 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 begin
	datain_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);
end

always @(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】,把文件添加进去即可

【FPGA实验3】双优先编码器_第4张图片
【FPGA实验3】双优先编码器_第5张图片

【FPGA实验3】双优先编码器_第6张图片
【FPGA实验3】双优先编码器_第7张图片

添加完成后,【Tools】➡️【Run Simulation Tool】➡️【RTL Simulation】

【FPGA实验3】双优先编码器_第8张图片

仿真结果如下所示,
当输入的8位信号是00011011时,最高优先位是4(第5位),次优先位为3(第4位),符合双优先编码器的功能。
【FPGA实验3】双优先编码器_第9张图片

当输入的8位信号是00000011时,最高优先位是1(第2位),次优先位为0(第1位),符合双优先编码器的功能。
【FPGA实验3】双优先编码器_第10张图片

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:fy
		integer i;
		led=8'b11111111;
		St_flag=1'b0;
		Nd_flag=1'b0;


		for(i=7;i>=0;i=i-1)begin

			if(key[i]==1&&St_flag==0)begin
				St_pri=i;
				St_flag=1'b1;
			end
			else if(key[i]==1&&St_flag==1&&Nd_flag==0)begin
				Nd_pri=i;
				Nd_flag=1'b1;
			
			end
		end
			 if(St_flag==1)  led[St_pri]=0;
			 if(Nd_flag==1) led[Nd_pri]=0; 
		end

endmodule

(2)对应的RTL图

Quartus 12对应的RTL图:
【FPGA实验3】双优先编码器_第11张图片

Quartus 18.0对应的RTL图:
【FPGA实验3】双优先编码器_第12张图片
(3)引脚分配与接线

引脚分配接线如下
【FPGA实验3】双优先编码器_第13张图片

JP1连接到JX5或JX6,JP5连接到JX22。
(为什么这样接线可参考《【FPGA实验2】二进制转为格雷码》➡️三、试验箱实验➡️3、引脚分配)

(3)实验现象:

【FPGA实验3】双优先编码器

你可能感兴趣的:(#,FPGA学习笔记,fpga开发)