(原創) 如何以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无双 阅读(2510) 评论(7) 编辑 收藏

评论

#1楼 2008-07-20 12:41 游兆晖      

你好!好不容易才又找到你的blog地址

我找到那本夏宇闻的书了,书上说行为描述的模块需要用synthesis这个软件来综合。

我家里电脑没装synthesis,因为太破,所以没法去验证。我有个疑问,是不是用synthesis综合之后,然后就可以用quartus去再次进行仿真,布线了?
 回复 引用 查看   

#2楼[楼主] 2008-07-20 12:46 真 OO无双      

@游兆晖
或許synthesis有這個能耐吧 我是沒用過 這就是靠合成器的功力了
不過我覺得RTL這關還是得好好打好基礎
光靠合成器不是長遠之道
 回复 引用 查看   

#3楼 2008-07-20 12:58 游兆晖      

谢谢你的指点!

按照你刚才说的RTL,我翻阅了一下那本书,发现是了一点端倪。哈哈,我再仔细瞧瞧。

 回复 引用 查看   

#4楼 2009-01-03 10:55 光明河      

這種寫法不錯,確實是比較好的方法,數表示的範圍還是0x00000~0x3FFFF,
由於是十進位表示,其範圍就是:000000~262143,這是沒問題的。以前就沒有想到用這種方法。
 回复 引用 查看   

#5楼 2009-01-13 04:25 煩腦的小孩[未注册用户]

請問一下,要怎麼在de2的DE2_SD_Card_Audio這個範例中,加上一個濾波器?是要加在niorII還是怎麼樣?能告訴我該怎麼做嗎?
謝謝!!
 回复 引用   

#6楼 2009-09-24 15:00 ( ⊙o⊙ )哇倪      

博主你好:
我有ALTERA-DE2官方开发板的配套摄像头模组和液晶显示模组,有配套的图像采集显示全部源码和和相应的技术支持,可以根据你的要求更换相应型号的sensor,比如OV系列和美光系列。所有模组7天包退,1年保修。想要的话联系我:
QQ: 50186788 注明:DE2
Email: hzh1024n@163.com
博客:http://blog.ednchina.com/hzh1024n/
 回复 引用 查看   

#7楼 2011-12-23 19:17 JUI-MING      

請問
在 switch_lut_8.v
input [31:0] i_dig
為何是 32bits 呢?
 回复 引用 查看   

导航

公告

emblem-2010

first2009-011

我是一個小小的數位IC工程師,從事SOC IP開發,業餘則喜歡研究FPGA、Embedded System、OS、MFC、NET與OOP相關技術。我並不是靠寫Blog或寫書維生,只是記下來怕自己忘記,所以不加任何廣告。所有文章與程式碼歡迎轉載使用。

昵称:真 OO无双
园龄:5年4个月
粉丝:281
关注:0

随笔分类(2100)