Altera MAX10: 2位7段數(shù)碼管顯示
數(shù)碼管顯示
本實(shí)驗(yàn)將會(huì)讓你熟悉小腳丫上最后一種有意思的外設(shè)七段數(shù)碼管。
====硬件說(shuō)明====
數(shù)碼管是工程設(shè)計(jì)中使用很廣的一種顯示輸出器件。一個(gè)7段數(shù)碼管(如果包括右下的小點(diǎn)可以認(rèn)為是8段)分別由a、b、c、d、e、f、g位段和表示小數(shù)點(diǎn)的dp位段組成。實(shí)際是由8個(gè)LED燈組成的,控制每個(gè)LED的點(diǎn)亮或熄滅實(shí)現(xiàn)數(shù)字顯示。通常數(shù)碼管分為共陽(yáng)極數(shù)碼管和共陰極數(shù)碼管,結(jié)構(gòu)如下圖所示:
圖1 共陽(yáng)極、共陰極數(shù)碼管
共陰8段數(shù)碼管的信號(hào)端低電平有效,而共陽(yáng)端接高電平有效。當(dāng)共陽(yáng)端接高電平時(shí)只要在各個(gè)位段上加上相應(yīng)的低電平信號(hào)就可以使相應(yīng)的位段發(fā)光。比如:要使a段發(fā)光,則在a段信號(hào)端加上低電平即可。共陰極的數(shù)碼管則相反。 可以看到數(shù)碼管的控制和LED的控制有相似之處,在小腳丫STEP-Max10開(kāi)發(fā)板上有兩位共陰極數(shù)碼管,
數(shù)碼管所有的信號(hào)都連接到FPGA的管腳,作為輸出信號(hào)控制。FPGA只要輸出這些信號(hào)就能夠控制數(shù)碼管的那一段LED亮或者滅。這樣我們可以通過(guò)開(kāi)關(guān)來(lái)控制FPGA的輸出,和3-8譯碼器實(shí)驗(yàn)一樣,通過(guò)組合邏輯的輸出來(lái)控制數(shù)碼管顯示數(shù)字,下面是數(shù)碼管顯示的表格:
這其實(shí)是一個(gè)4-16譯碼器,如果我們想數(shù)碼管能顯示16進(jìn)制可以全譯碼,如果只想顯示數(shù)字,可以只利用其中10個(gè)譯碼,下面看看如果用Verilog來(lái)實(shí)現(xiàn)。
====Verilog代碼====
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : segment.v // Module name : segment // Author : STEP // Description : segment initial // Web : www.stepfpga.com // // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2017/03/02 |Initial ver // -------------------------------------------------------------------- // Module Function:數(shù)碼管的譯碼模塊初始化 module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2); input [3:0] seg_data_1; //數(shù)碼管需要顯示0~9十個(gè)數(shù)字,所以最少需要4位輸入做譯碼 input [3:0] seg_data_2; //小腳丫上第二個(gè)數(shù)碼管 output [8:0] seg_led_1; //在小腳丫上控制一個(gè)數(shù)碼管需要9個(gè)信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A output [8:0] seg_led_2; //在小腳丫上第二個(gè)數(shù)碼管的控制信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A reg [8:0] seg [9:0]; //定義了一個(gè)reg型的數(shù)組變量,相當(dāng)于一個(gè)10*9的存儲(chǔ)器,存儲(chǔ)器一共有10個(gè)數(shù),每個(gè)數(shù)有9位寬 initial //在過(guò)程塊中只能給reg型變量賦值,Verilog中有兩種過(guò)程塊always和initial //initial和always不同,其中語(yǔ)句只執(zhí)行一次 begin seg[0] = 9'h3f; //對(duì)存儲(chǔ)器中第一個(gè)數(shù)賦值9'b00_0011_1111,相當(dāng)于共陰極接地,DP點(diǎn)變低不亮,7段顯示數(shù)字 0 seg[1] = 9'h06; //7段顯示數(shù)字 1 seg[2] = 9'h5b; //7段顯示數(shù)字 2 seg[3] = 9'h4f; //7段顯示數(shù)字 3 seg[4] = 9'h66; //7段顯示數(shù)字 4 seg[5] = 9'h6d; //7段顯示數(shù)字 5 seg[6] = 9'h7d; //7段顯示數(shù)字 6 seg[7] = 9'h07; //7段顯示數(shù)字 7 seg[8] = 9'h7f; //7段顯示數(shù)字 8 seg[9] = 9'h6f; //7段顯示數(shù)字 9 end assign seg_led_1 = seg[seg_data_1]; //連續(xù)賦值,這樣輸入不同四位數(shù),就能輸出對(duì)于譯碼的9位輸出 assign seg_led_2 = seg[seg_data_2]; endmodule
引腳分配
小腳丫上正好有4路按鍵和4路開(kāi)關(guān),可以用來(lái)作為輸入信號(hào)分別控制數(shù)碼管的輸出。按照下面表格定義輸入輸出信號(hào)
信號(hào) | 引腳 | 信號(hào) | 引腳 |
---|---|---|---|
segdata1(0) | J12 | segdata2(0) | J9 |
segdata1(1) | H11 | segdata2(1) | K14 |
segdata1(2) | H12 | segdata2(2) | J11 |
segdata1(3) | H13 | segdata2(3) | J14 |
信號(hào) | 引腳 | 信號(hào) | 引腳 |
---|---|---|---|
segled1(0) | E1 | segled2(0) | A3 |
segled1(1) | D2 | segled2(1) | A2 |
segled1(2) | K2 | segled2(2) | P2 |
segled1(3) | J2 | segled2(3) | P1 |
segled1(4) | G2 | segled2(4) | N1 |
segled1(5) | F5 | segled2(5) | C1 |
segled1(6) | G5 | segled2(6) | C2 |
segled1(7) | L1 | segled2(7) | R2 |
segled1(8) | E2 | segled2(8) | B1 |
配置好以后編譯下載程序。這樣可以通過(guò)按鍵或者開(kāi)關(guān)來(lái)控制相應(yīng)的數(shù)碼管顯示數(shù)字。如果你想顯示16進(jìn)制的AbCDeF在數(shù)碼管,可以試試修改程序。這時(shí)候一定要定義一個(gè)16*9的存儲(chǔ)器來(lái)初始化。
====小結(jié)====
了解了小腳丫數(shù)碼管的工作原理,在下個(gè)實(shí)驗(yàn)我們將進(jìn)行到有趣的時(shí)序邏輯。首先是如何控制時(shí)鐘分頻。
評(píng)論