(原創) 如何以16進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)

Abstract
七段顯示器在DE2可當成Verilog的console,做為16進位的輸出結果。

Introduction
使用環境:Quartus II 7.2 SP1 + DE2(Cyclone II EP2C35F627C6)

簡單的使用switch當成2進位輸入,並用8位數的七段顯示器顯示16進位的結果。

Verilog / SWITCH_SEG7.v

 1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : SWITCH_SEG7.v
 5 Compiler    : Quartus II 7.2 SP1
 6 Description : Demo how to use 8 bit 7 segment display
 7 Release     : 04/16/2008 1.0
 8 */
 9 module SWITCH_SEG7 (
10   //Host side
11   input         CLOCK_50, // 50 MHz
12   input  [3:0]  KEY,
13   input  [17:0] SW,
14   output [6:0]  HEX0,
15   output [6:0]  HEX1,
16   output [6:0]  HEX2,
17   output [6:0]  HEX3,
18   output [6:0]  HEX4,
19   output [6:0]  HEX5,
20   output [6:0]  HEX6,
21   output [6:0]  HEX7
22 );
23 
24 SEG7_LUT_8 u0 (
25   .oSEG0(HEX0),
26   .oSEG1(HEX1),
27   .oSEG2(HEX2),
28   .oSEG3(HEX3),
29   .oSEG4(HEX4),
30   .oSEG5(HEX5),
31   .oSEG6(HEX6),
32   .oSEG7(HEX7),
33   .iDIG(SW),
34   .iWR(1'b1),
35   .iCLK(CLOCK_50),
36   .iRESET_n(KEY[0])
37 );
38 
39 endmodule

這是top module,主要將switch的值傳入iDIG,iWR是個enable,這裡沒特別用到,就傳1'b1即可。

Verilog / SWITCH_LUT.v

 1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : SWITCH_LUT.v
 5 Compiler    : Quartus II 7.2 SP1
 6 Description : Demo how to use 8 bit 7 segment display
 7 Release     : 04/16/2008 1.0
 8 */
 9 module SEG7_LUT (
10   input [3:0] iDIG,
11   output reg [6:0] oSEG
12 );
13 
14 always@(iDIG) begin
15   case(iDIG)
16     4'h1: oSEG = 7'b1111001;  // ---t----
17     4'h2: oSEG = 7'b0100100;  // |      |
18     4'h3: oSEG = 7'b0110000;  // lt    rt
19     4'h4: oSEG = 7'b0011001;  // |      |
20     4'h5: oSEG = 7'b0010010;  // ---m----
21     4'h6: oSEG = 7'b0000010;  // |      |
22     4'h7: oSEG = 7'b1111000;  // lb    rb
23     4'h8: oSEG = 7'b0000000;  // |      |
24     4'h9: oSEG = 7'b0011000;  // ---b----
25     4'ha: oSEG = 7'b0001000;
26     4'hb: oSEG = 7'b0000011;
27     4'hc: oSEG = 7'b1000110;
28     4'hd: oSEG = 7'b0100001;
29     4'he: oSEG = 7'b0000110;
30     4'hf: oSEG = 7'b0001110;
31     4'h0: oSEG = 7'b1000000;
32   endcase
33 end
34 
35 endmodule


這是一個七段顯示器的lookup table。

Verilog / SWITCH_LUT8.v

 1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : SWITCH_LUT8.v
 5 Compiler    : Quartus II 7.2 SP1
 6 Description : Demo how to use 8 bit 7 segment display
 7 Release     : 04/16/2008 1.0
 8 */
 9 module SEG7_LUT_8 (
10   output [6:0]  oSEG0,
11   output [6:0]  oSEG1,
12   output [6:0]  oSEG2,
13   output [6:0]  oSEG3,
14   output [6:0]  oSEG4,
15   output [6:0]  oSEG5,
16   output [6:0]  oSEG6,
17   output [6:0]  oSEG7,
18   input  [31:0] iDIG,
19   input         iWR,
20   input         iCLK,
21   input         iRESET_n
22 );
23 
24 reg [31:0] dig;
25 
26 always@(posedge iCLK or negedge iRESET_n) begin
27   if (!iRESET_n)
28     dig <= 0;
29   else begin
30     if (iWR)
31       dig <= iDIG;
32   end
33 end
34 
35 SEG7_LUT u0 (
36   .iDIG(dig[3:0]),
37   .oSEG(oSEG0), 
38 );
39 
40 SEG7_LUT u1 (
41   .iDIG(dig[7:4]),
42   .oSEG(oSEG1)
43 );
44 
45 SEG7_LUT u2 (
46   .iDIG(dig[11:8]),
47   .oSEG(oSEG2)
48 );
49 
50 SEG7_LUT u3 (
51   .iDIG(dig[15:12]),
52   .oSEG(oSEG3)
53 );
54 
55 SEG7_LUT u4 (
56   .iDIG(dig[19:16]),
57   .oSEG(oSEG4)
58 );
59 
60 SEG7_LUT u5 (
61   .iDIG(dig[23:20]),
62   .oSEG(oSEG5)
63 );
64 
65 SEG7_LUT u6 (
66   .iDIG(dig[27:24]),
67   .oSEG(oSEG6)
68 );
69 
70 SEG7_LUT u7 (
71   .iDIG(dig[31:28]),
72   .oSEG(oSEG7)
73 );
74 
75 endmodule


由於DE2總共有8個七段顯示器,所以將傳進來的2進位值分段傳給不同的instance,由於程式都很簡單,我就不多做解釋。

完整程式碼下載
switch_seg7_hw_heximal.7z

Conclusion
利用SWITCH_LUT.v與SWITCH_LUT8.v兩個module,就能利用Verilog在DE2上顯示八位數16進位的七段顯示器。

See Also
(原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (DE2) (Nios II)
(原創) 如何在Nios II使用16x2字元液晶顯示器? (SOCDesign) (DE2) (Nios II)
(原創) 如何以2進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)
(原創) 如何以10進位顯示8位數的七段顯示器? (SOC) (Verilog) (DE2)
(原創) 如何設計電子鐘? (SOC) (Verilog) (DE2)

posted on 2008-04-16 01:08 真 OO无双 阅读(3392) 评论(8) 编辑 收藏

评论

#1楼 2008-07-04 15:31 大俠愛吃鮑[未注册用户]

請問一下,有方法可以將2進位的資料用成10進位的顯示法嗎? 謝謝  回复 引用   

#2楼[楼主] 2008-07-20 11:57 真 OO无双      

@大俠愛吃鮑
2進位資料用10進位顯示法請參考這篇
http://www.cnblogs.com/oomusou/archive/2008/07/20/verilog_switch_seg10.html
 回复 引用 查看   

#3楼 2008-08-28 14:52 verilog 新手[未注册用户]

.iDIG(dig[19:16]),
.oSEG(oSEG4)

請問板主 ,.iDIG 前面的點號 是有什麼用途呢?..

謝謝
 回复 引用   

#4楼[楼主] 2008-08-28 22:12 真 OO无双      

--引用--------------------------------------------------
verilog 新手: .iDIG(dig[19:16]),
.oSEG(oSEG4)

請問板主 ,.iDIG 前面的點號 是有什麼用途呢?..

謝謝
--------------------------------------------------------

這只是Verilog的語法規定而已,一定要加
 回复 引用 查看   

#5楼 2008-09-19 22:09 gogowade[未注册用户]

樓主你好:

你的載點似乎無法下載@@
 回复 引用   

#6楼[楼主] 2008-09-19 22:37 真 OO无双      

--引用--------------------------------------------------
gogowade: 樓主你好:

你的載點似乎無法下載@@
--------------------------------------------------------

已更新連結,請參考
 回复 引用 查看   

#7楼 2009-01-03 10:23 光明河      

这里由于只有18个拨动开关,所以只能控制5个7段LEDS,因而值的范围就是:
0X00000~0x3FFFF。这个我实验了,结果就是这样。
 回复 引用 查看   

#8楼 2009-09-25 11:08 ( ⊙o⊙ )哇倪      

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

 回复 引用 查看   

导航

公告

emblem-2010

first2009-011

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

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

随笔分类(2100)