数码管显示译码及Verilog 代码实现
在上节内容中介绍了数码管的显示原理,本节内容根据显示原理进行Verilog代码的实现。设计要求如下,根据开发板FII-PRA006/010的硬件资源,输入采用开关sw1–sw3输入4位16进制数。输出在SEG1的6位数码管的最右边一个显示。开关sw1-sw4的图纸如图1,

图1
开关SW,LED与FPAG的对应关系如表1,
表1
| 程序信号名 | 网络标号 | FPGA管脚 | 端口说明 |
| SW[3] | SW3_LED3 | 87 | sw第3位 |
| SW[2] | SW2_LED2 | 86 | sw第2位 |
| SW[1] | SW1_LED1 | 83 | sw第1位 |
| SW[0] | SW0_LED0 | 80 | sw第0位 |
数码管的局部图纸如图2:
在图2中可以看出,最右边的数码管对应网络标号为SEG_3V3_D0。本实验中只用到一个数码管,而且是共阳极驱动,因此SEG_3V3_D0应为低电平,Q14(NDS336P)才会导通。

图2
图2中8段数码管的各段的译码表如表2,
表2
| 段选信号 | DP | G | F | E | D | C | B | A |
| · | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
| 2 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 3 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
| 5 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
| 6 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 7 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
| 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 9 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| A | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| B | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| C | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
| D | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| E | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
| F | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
根据图1,图2,表1,表2的资源描述,Quartus II 下Verilog 的设计流程及代码如下:
- 新建工程
工程名SW_8SEG,顶层实体名称(top level entity)的名称为SW_8SEG,顶层文件的名称为 SW_8SEG.v。
2. 数码管显示译码
SW_8SEG.v的源文件如下:
/*
mapping :
SEVEN_SEG[0] SEVEN_SEG[1] SEVEN_SEG[2] SEVEN_SEG[3] SEVEN_SEG[4] SEVEN_SEG[5] SEVEN_SEG[6]
****A******* ******B***** ******C***** *****D****** ******E***** ******F**** *****G*****
*/
module SW_8SEG
(
input [ 3: 0 ] SW,
output reg[ 6: 0 ] SEVEN_SEG,
output DP,
output [ 5: 0 ] SEL
);
assign SEL = 6'b111110; //固定显示最右边的数码管,NDS336P 为P沟道MOS管,因此
assign DP = 1'b1; //小数点非点亮
always@( * )
case ( SW )
0: SEVEN_SEG = 7'b100_0000;
1: SEVEN_SEG = 7'b111_1001;
2: SEVEN_SEG = 7'b010_0100;
3: SEVEN_SEG = 7'b011_0000;
4: SEVEN_SEG = 7'b001_1001;
5: SEVEN_SEG = 7'b001_0010;
6: SEVEN_SEG = 7'b000_0010;
7: SEVEN_SEG = 7'b111_1000;
8: SEVEN_SEG = 7'b000_0000;
9: SEVEN_SEG = 7'b001_0000;
4'ha: SEVEN_SEG = 7'b000_1000;
4'hb: SEVEN_SEG = 7'b000_0011;
4'hc: SEVEN_SEG = 7'b100_0110;
4'hd: SEVEN_SEG = 7'b010_0001;
4'he: SEVEN_SEG = 7'b000_0110;
4'hf: SEVEN_SEG = 7'b000_1110;
default: SEVEN_SEG = 7'b111_1111;
endcase
endmodule
3. 编译,管脚锁定:FPGA管脚映射如表3
表3
| 程序信号名 | 网络标号 | FPGA管脚 | 端口说明 |
| SEL[5] | SEG_3V3_D5 | 124 | 位选信号第5位 |
| SEL[4] | SEG_3V3_D4 | 127 | 位选信号第4位 |
| SEL[3] | SEG_3V3_D3 | 129 | 位选信号第3位 |
| SEL[2] | SEG_3V3_D2 | 141 | 位选信号第2位 |
| SEL[1] | SEG_3V3_D1 | 142 | 位选信号第1位 |
| SEL[0] | SEG_3V3_D0 | 136 | 位选信号第0位 |
| SEVEN_SEG[6] | SEG_PG | 135 | 段选信号G |
| SEVEN_SEG[5] | SEG_PF | 138 | 段选信号F |
| SEVEN_SEG[4] | SEG_PE | 126 | 段选信号E |
| SEVEN_SEG[3] | SEG_PD | 125 | 段选信号D |
| SEVEN_SEG[2] | SEG_PC | 133 | 段选信号C |
| SEVEN_SEG[1] | SEG_PB | 137 | 段选信号B |
| SEVEN_SEG[0] | SEG_PA | 132 | 段选信号A |
| DP | SEG_DP | 128 | 段选信号DP |
按照表3的映射关系锁定管脚(如何锁定管脚请参照),如图3:
图3
4. 重新编译,下载,在FII-PRA006学习板上进行验证。FPGA程序下载相关信息请参照FII-PRA006/010板载实验。拨动SW从0–F看看数码管是否正常译码。
练习题:如果要将译码结果显示在第二数码管上,如何修改源代码?

老师能帮忙看下这段程序码,quartus编译综合过了,但是数码管一直不计数,停留在8
module seg_led(
input clk,
input rst,
output [5:0]sel,
output reg [7:0]seven_seg,
output dp
);
reg [25:0]count;
reg [3:0] counter;
reg flag;
parameter CNT=49_999_999;
assign dp=1’b0;
assign sel=6’b1111_01;
//always@(posedge clk or posedge rst)
// if(rst)
// count<=26'b0;
// else if(count==CNT-26'b1)
// count<=26'b0;
// else
// count<=count+1;
always@(posedge clk or posedge rst)
if(rst)
begin
count<=26'd0;
flag<=1'b0;
end
else if(count==CNT-26'b1) begin
flag<=1'b1;
count<=26'd0;
end
else begin
count<=count+1;
flag<=1'b0;
end
always@(posedge clk or posedge rst)
if(rst)
counter<=4'b0;
else if (flag)
begin
if (counter==4'd9)
counter<=4'd0;
end
else begin
counter<=counter+1;
end
always@(*)
case(counter)
0: seven_seg=7'b1000_000;
1: seven_seg=7'b1111_001;
2: seven_seg=7'b0100_100;
3: seven_seg=7'b0110_000;
4: seven_seg=7'b0011_001;
5: seven_seg=7'b0010_010;
6: seven_seg=7'b0000_010;
7: seven_seg=7'b1111_000;
8: seven_seg=7'b0000_000;
9: seven_seg=7'b001_0000;
default:seven_seg=7'b1000_000;
endcase
endmodule
你好,代码中有两个错误,见下图所示:
