(原創) 如何以10進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)
Abstract
七段顯示器在DE2可當成Verilog的console,做為16進位的輸出結果。
Introduction
使用環境:Quartus II 7.2 SP3 + DE2(Cyclone II EP2C35F627C6)
簡單的使用switch當成2進位輸入,並用8位數的七段顯示器顯示10進位的結果。
switch_seg10.v / Verilog
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : switch_seg10.v
5 Compiler : Quartus II 7.2 SP3
6 Description : Demo how to use 8 bit 7 segment display decimal
7 Release : 07/20/2008 1.0
8 */
9 module switch_seg10 (
10 input [17:0] SW,
11 output [6:0] HEX0,
12 output [6:0] HEX1,
13 output [6:0] HEX2,
14 output [6:0] HEX3,
15 output [6:0] HEX4,
16 output [6:0] HEX5,
17 output [6:0] HEX6,
18 output [6:0] HEX7
19 );
20
21 seg7_lut_8 u0 (
22 .i_dig(SW),
23 .o_seg0(HEX0),
24 .o_seg1(HEX1),
25 .o_seg2(HEX2),
26 .o_seg3(HEX3),
27 .o_seg4(HEX4),
28 .o_seg5(HEX5),
29 .o_seg6(HEX6),
30 .o_seg7(HEX7)
31 );
32
33 endmodule
這是top module,負責建立例化seg7_lut8。
switch_lut.v / Verilog
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : switch_lut.v
5 Compiler : Quartus II 7.2 SP3
6 Description : Demo how to use 8 bit 7 segment display decimal
7 Release : 07/20/2008 1.0
8 */
9 module seg7_lut (
10 input [3:0] i_dig,
11 output reg [6:0] o_seg
12 );
13
14 always@(i_dig) begin
15 case(i_dig)
16 4'h1: o_seg = 7'b111_1001; // ---t----
17 4'h2: o_seg = 7'b010_0100; // | |
18 4'h3: o_seg = 7'b011_0000; // lt rt
19 4'h4: o_seg = 7'b001_1001; // | |
20 4'h5: o_seg = 7'b001_0010; // ---m----
21 4'h6: o_seg = 7'b000_0010; // | |
22 4'h7: o_seg = 7'b111_1000; // lb rb
23 4'h8: o_seg = 7'b000_0000; // | |
24 4'h9: o_seg = 7'b001_1000; // ---b----
25 4'ha: o_seg = 7'b000_1000;
26 4'hb: o_seg = 7'b000_0011;
27 4'hc: o_seg = 7'b100_0110;
28 4'hd: o_seg = 7'b010_0001;
29 4'he: o_seg = 7'b000_0110;
30 4'hf: o_seg = 7'b000_1110;
31 4'h0: o_seg = 7'b100_0000;
32 endcase
33 end
34
35 endmodule
36
這是一個七段顯示器的lookup table。
switch_lut_8.v
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : switch_lut_8.v
5 Compiler : Quartus II 7.2 SP3
6 Description : Demo how to use 8 bit 7 segment display decimal
7 Release : 07/20/2008 1.0
8 */
9 module seg7_lut_8 (
10 output [6:0] o_seg0,
11 output [6:0] o_seg1,
12 output [6:0] o_seg2,
13 output [6:0] o_seg3,
14 output [6:0] o_seg4,
15 output [6:0] o_seg5,
16 output [6:0] o_seg6,
17 output [6:0] o_seg7,
18 input [31:0] i_dig
19 );
20
21 seg7_lut u0 (
22 .i_dig(i_dig%10),
23 .o_seg(o_seg0),
24 );
25
26 seg7_lut u1 (
27 .i_dig((i_dig/10)%10),
28 .o_seg(o_seg1)
29 );
30
31 seg7_lut u2 (
32 .i_dig((i_dig/100)%10),
33 .o_seg(o_seg2)
34 );
35
36 seg7_lut u3 (
37 .i_dig((i_dig/1000)%10),
38 .o_seg(o_seg3)
39 );
40
41 seg7_lut u4 (
42 .i_dig((i_dig/10000)%10),
43 .o_seg(o_seg4)
44 );
45
46 seg7_lut u5 (
47 .i_dig((i_dig/100000)%10),
48 .o_seg(o_seg5)
49 );
50
51 seg7_lut u6 (
52 .i_dig((i_dig/1000000)%10),
53 .o_seg(o_seg6)
54 );
55
56 seg7_lut u7 (
57 .i_dig((i_dig/10000000)%10),
58 .o_seg(o_seg7)
59 );
60
61 endmodule
與(原創) 如何以2進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)與(原創) 如何以16進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)相比較,關鍵的差異就在switch_lut_8.v。由於switch輸入的是2進位,顯示2進位就是將每個bit送進一個七段顯示器,顯示16進位就是每4bit送進一個七段顯示器,但10進位怎麼辦呢?
如switch輸入的是10進位的378,若要取的十位的7,將378 / 10 = 37,再將37 % 10 = 7,這樣就能取出10位的7了,其他位數同理。
完整程式碼下載
switch_seg7_hw_decimal.7z
See Also
(原創) 如何以2進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)
(原創) 如何以16進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)
(原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (DE2) (Nios II)