(原創) 如何以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

1 /* 
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

1 /* 
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

1 /* 
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)

posted on 2008-07-20 10:47  真 OO无双  阅读(8647)  评论(7编辑  收藏  举报

导航