Altera MAX10: LED流水燈

 行業(yè)動(dòng)態(tài)     |      2023-11-03 13:40:26    |      作者

在時(shí)鐘分頻實(shí)驗(yàn)中我們練習(xí)了如何處理時(shí)鐘,接下來(lái)我們要學(xué)習(xí)如何利用時(shí)鐘來(lái)完成時(shí)序邏輯。

流水燈實(shí)現(xiàn)是很常見(jiàn)的一個(gè)實(shí)驗(yàn),雖然邏輯比較簡(jiǎn)單,但是里面也包含了實(shí)現(xiàn)時(shí)序邏輯的基本思想。要用FPGA實(shí)現(xiàn)流水燈有很多種方法,在這里我們會(huì)用兩種不同的方法實(shí)現(xiàn)。1,模塊化設(shè)計(jì):在之前的實(shí)驗(yàn)中我們做了3-8譯碼器和時(shí)鐘分頻,如果把這兩個(gè)結(jié)合起來(lái),我們就能搭建一個(gè)自動(dòng)操作的流水LED顯示??驁D如下:

2,循環(huán)賦值:這是一種很簡(jiǎn)潔的實(shí)現(xiàn)流水燈效果邏輯,就是定義一個(gè)8位的變量,在每個(gè)時(shí)鐘上升沿將最低位賦值給最高位,其他位右移一位,這就實(shí)現(xiàn)了循環(huán)賦值。這8位輸出到LED就能實(shí)現(xiàn)流水燈。

模塊化設(shè)計(jì)是用硬件描述語(yǔ)言進(jìn)行數(shù)字電路設(shè)計(jì)的精髓,代碼可重復(fù)利用。而且模塊化的設(shè)計(jì)使得程序的結(jié)構(gòu)也很清晰。這里我們首先看看流水燈的模塊化設(shè)計(jì)。利用了之前的3-8譯碼器和分頻器,你需要把這兩個(gè)程序也拷貝到一個(gè)工程。

//******************************************************************** //>>>>>>>>>>>>>>>>>>>>>>>>>COPYRIGHTNOTICE<<<<<<<<<<<<<<<<<<<<<<<<< //******************************************************************** //Filename:flashled.v //Modulename:flashled //Author:STEP //Description:segmentinitial //Web:www.stepfpga.com // //-------------------------------------------------------------------- //CodeRevisionHistory: //-------------------------------------------------------------------- //Version:|Mod.Date:|ChangesMade: //V1.0|2017/03/02|Initialver //-------------------------------------------------------------------- //ModuleFunction:流水燈的模塊化設(shè)計(jì) moduleflashled(clk,rst,led); inputclk,rst; output[7:0]led; reg[2:0]cnt;//定義了一個(gè)3位的計(jì)數(shù)器,輸出可以作為3-8譯碼器的輸入 wireclk1h;//定義一個(gè)中間變量,表示分頻得到的時(shí)鐘,用作計(jì)數(shù)器的觸發(fā) //例化moduledecode38,相當(dāng)于調(diào)用 decode38u1( .sw(cnt),//例化的輸入端口連接到cnt,輸出端口連接到led .led(led) );//例化分頻器模塊,產(chǎn)生一個(gè)1Hz時(shí)鐘信號(hào) divide#(.WIDTH(32),.N(12000000))u2(//傳遞參數(shù) .clk(clk), .rst_n(rst),//例化的端口信號(hào)都連接到定義好的信號(hào) .clkout(clk1h) );//1Hz時(shí)鐘上升沿觸發(fā)計(jì)數(shù)器,循環(huán)計(jì)數(shù) always@(posedgeclk1hornegedgerst) if(!rst) cnt<=0; else cnt<=cnt+1; endmodule

模塊化設(shè)計(jì)結(jié)構(gòu)清晰,verilog語(yǔ)言是很靈活的。對(duì)于流水燈還有一種很簡(jiǎn)潔的實(shí)現(xiàn)方法。

//******************************************************************** //>>>>>>>>>>>>>>>>>>>>>>>>>COPYRIGHTNOTICE<<<<<<<<<<<<<<<<<<<<<<<<< //******************************************************************** //Filename:flashled.v //Modulename:flashled //Author:STEP //Description:segmentinitial //Web:www.stepfpga.com // //-------------------------------------------------------------------- //CodeRevisionHistory: //-------------------------------------------------------------------- //Version:|Mod.Date:|ChangesMade: //V1.0|2017/03/02|Initialver //-------------------------------------------------------------------- //ModuleFunction:流水燈的模塊化設(shè)計(jì) moduleflashled(clk,rst,led); inputclk,rst; output[7:0]led; wireclk1h;//定義一個(gè)中間變量,表示分頻得到的時(shí)鐘,用作計(jì)數(shù)器的觸發(fā) //例化分頻器模塊,產(chǎn)生一個(gè)1Hz時(shí)鐘信號(hào) divide#(.WIDTH(32),.N(12000000))u2(//傳遞參數(shù) .clk(clk), .rst_n(rst),//例化的端口信號(hào)都連接到定義好的信號(hào) .clkout(clk1h) );//1Hz時(shí)鐘上升沿觸發(fā)循環(huán)賦值 reg[7:0]led; always@(posedgeclk1hornegedgerst) begin if(!rst) led<=8'b11111110;//<=為非阻塞賦值 else led<={led[0],led[7:1]}; //當(dāng)時(shí)鐘上升沿來(lái)一次,執(zhí)行一次賦值,賦值內(nèi)容是led[0]與led[7:1]重新拼接成8位賦給led,相當(dāng)于循環(huán)右移 end

按照下面表格定義輸入輸出信號(hào)

信號(hào)引腳信號(hào)引腳
clkJ5led[3]M12
rstJ9led[4]L15
led[0]N15led[5]K12
led[1]N14led[6]L11
led[2]M14led[7]K11

配置好以后編譯下載程序??梢哉{(diào)整例化分頻器時(shí)傳遞的參數(shù)來(lái)調(diào)整流水燈的速度。

掌握了verilog里面例化module的用法,采用模塊化設(shè)計(jì)程序。模塊化設(shè)計(jì)是非常重要的FPGA設(shè)計(jì)思想。在下一節(jié)我們會(huì)學(xué)習(xí)按鍵的另外用法按鍵消抖。