数码管显示译码及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的源文件如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/* 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看看数码管是否正常译码。
练习题:如果要将译码结果显示在第二数码管上,如何修改源代码?
