译码器是一类多输入多输出组合逻辑电路器件,其可以分为变量译码和显示译码两类。 变量译码器一般是一种较少输入变为较多输出的器件,如3-8译码器,显示译码器用来将数值转换成要显示的对应的符号。
任务描述
根据所学的组合逻辑及数字电路的知识利用VerilogHDL描述完成一个16进制7段数码显示译码器的设计,并进行验证测试。
熟悉Verilog HDL文本设计流程,掌握组合逻辑电路的设计仿真和硬件测试的方法。最后完善一个16进制7段数码显示译码器电路的功能描述风格Verilog HDL 代码。
实验目的
进一步学习和掌握使用Verilog HDL描述电路功能的编写,练习使用条件判断语句进行译码。
实验原理
十六进制数七段LED显示译码器也称为七段数码管,其示意图如下所示,包括七个LED管和一个圆形 LED小数点。按 LED单元连接方式可以分为共阳数码管和共阴数码管,共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到逻辑高电平,当某一字段发光二极管的阴极为低电平时,相应字段就点亮;当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到逻辑低电平,当某一字段发光二极管的阳极为高电平时,相应字段就点亮;当某字段的阳极为低电平时,相应字段就不亮。
在开发板电路上常用共阳极驱动数码管,要求设计对应的译码电路,其对应的显示译码器功能表如下所示,为了完整,将小数点也计算在内,如果不用小数点时,将其不点亮即可,即默认共阳极dp为高电平。规定seg_d[7:0] = {dp,g,f,e,d,c,b,a}。
实验过程及步骤
1、新建工程,工程名为shumaguanyimaqi
2、新建Verilog Module文件,命名为:shumaguanyimaqi
编写代码
module shumaguanyimaqi(
input[3:0]data_in,
input rst_n,
output [7:0]LED
);
reg [7:0]smg_duan;
always@(*)begin
case(data_in)
0:smg_duan=8'hc0;//c0
1:smg_duan=8'hf9;
2:smg_duan=8'ha4;
3:smg_duan=8'hb0;
4:smg_duan=8'h99;
5:smg_duan=8'h92;
6:smg_duan=8'h82;
7:smg_duan=8'hf8;
8:smg_duan=8'h80;
9:smg_duan=8'h90;
10:smg_duan=8'h88;
11:smg_duan=8'h83;
12:smg_duan=8'hc6;
13:smg_duan=8'ha1;
14:smg_duan=8'h86;
15:smg_duan=8'h8e;
endcase
end
assign LED=smg_duan;
3、运行正确之后,查看RTL图
双击放大:
4、右击,选择New Source,选择Verilog Test Fixture,命名为shuziyima
编写仿真代码:
仿真测试代码
module shuziyima;
// Inputs
reg [3:0] data_in;
reg rst_n;
// Outputs
wire [7:0] LED;
// Instantiate the Unit Under Test (UUT)
shumaguanyimaqi uut (
.data_in(data_in),
.rst_n(rst_n),
.LED(LED)
);
initial begin
// Initialize Inputs
data_in = 0;
rst_n = 0;
// Wait 100 ns for global reset to finish
#100;
rst_n=1;
data_in = 0;
// Add stimulus here
#5
data_in=0000;
#5
data_in=0001;
#5
data_in=0010;
#5
data_in=0011;
#5
data_in=0100;
#5
data_in=0101;
#5
data_in=0110;
#5
data_in=0111;
#5
data_in=1000;
#5
data_in=1001;
#5
data_in=1010;
#5
data_in=1011;
#5
data_in=1100;
#5
data_in=1101;
#5
data_in=1110;
#5
data_in=1111;
end
endmodule
根据上面显示译码器功能表可知,
进行行为仿真,得到波形图如下:
5、完成引脚标注,下载到开发板上进行实物实验
NET "data_in[0]" LOC = L5;
NET "data_in[1]" LOC = M3;
NET "data_in[2]" LOC = L4;
NET "data_in[3]" LOC = L3;
NET "LED[0]" LOC = L10;
NET "LED[1]" LOC = P9;
NET "LED[2]" LOC = N9;
NET "LED[3]" LOC = M9;
NET "LED[4]" LOC = L7;
NET "LED[5]" LOC = N8;
NET "LED[6]" LOC = P8;
NET "LED[7]" LOC = M7;