Altera MAX10: LED流水燈
在時(shí)鐘分頻實(shí)驗中我們練習了如何處理時(shí)鐘,接下來(lái)我們要學(xué)習如何利用時(shí)鐘來(lái)完成時(shí)序邏輯。
====硬件說(shuō)明====
流水燈實(shí)現是很常見(jiàn)的一個(gè)實(shí)驗,雖然邏輯比較簡(jiǎn)單,但是里面也包含了實(shí)現時(shí)序邏輯的基本思想。要用FPGA實(shí)現流水燈有很多種方法,在這里我們會(huì )用兩種不同的方法實(shí)現。
1,模塊化設計:在之前的實(shí)驗中我們做了3-8譯碼器和時(shí)鐘分頻,如果把這兩個(gè)結合起來(lái),我們就能搭建一個(gè)自動(dòng)操作的流水LED顯示??驁D如下:
2,循環(huán)賦值:這是一種很簡(jiǎn)潔的實(shí)現流水燈效果邏輯,就是定義一個(gè)8位的變量,在每個(gè)時(shí)鐘上升沿將最低位賦值給最高位,其他位右移一位,這就實(shí)現了循環(huán)賦值。這8位輸出到LED就能實(shí)現流水燈。
====Verilog代碼====
模塊化設計是用硬件描述語(yǔ)言進(jìn)行數字電路設計的精髓,代碼可重復利用。而且模塊化的設計使得程序的結構也很清晰。這里我們首先看看流水燈的模塊化設計。利用了之前的3-8譯碼器和分頻器,你需要把這兩個(gè)程序也拷貝到一個(gè)工程。
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : flashled.v // Module name : flashled // 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:流水燈的模塊化設計 module flashled (clk,rst,led); input clk,rst; output [7:0] led; reg [2:0] cnt ; //定義了一個(gè)3位的計數器,輸出可以作為3-8譯碼器的輸入 wire clk1h; //定義一個(gè)中間變量,表示分頻得到的時(shí)鐘,用作計數器的觸發(fā) //例化module decode38,相當于調用 decode38 u1 ( .sw(cnt), //例化的輸入端口連接到cnt,輸出端口連接到led .led(led) ); //例化分頻器模塊,產(chǎn)生一個(gè)1Hz時(shí)鐘信號 divide #(.WIDTH(32),.N(12000000)) u2 ( //傳遞參數 .clk(clk), .rst_n(rst), //例化的端口信號都連接到定義好的信號 .clkout(clk1h) ); //1Hz時(shí)鐘上升沿觸發(fā)計數器,循環(huán)計數 always @(posedge clk1h or negedge rst) if (!rst) cnt <= 0; else cnt <= cnt +1; endmodule
模塊化設計結構清晰,verilog語(yǔ)言是很靈活的。對于流水燈還有一種很簡(jiǎn)潔的實(shí)現方法。
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : flashled.v // Module name : flashled // 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:流水燈的模塊化設計 module flashled (clk,rst,led); input clk,rst; output [7:0] led; wire clk1h; //定義一個(gè)中間變量,表示分頻得到的時(shí)鐘,用作計數器的觸發(fā) //例化分頻器模塊,產(chǎn)生一個(gè)1Hz時(shí)鐘信號 divide #(.WIDTH(32),.N(12000000)) u2 ( //傳遞參數 .clk(clk), .rst_n(rst), //例化的端口信號都連接到定義好的信號 .clkout(clk1h) ); //1Hz時(shí)鐘上升沿觸發(fā)循環(huán)賦值 reg [7:0] led; always@(posedge clk1h or negedge rst) begin if(!rst) led <= 8'b11111110; // <=為非阻塞賦值 else led <= {led[0],led[7:1]}; //當時(shí)鐘上升沿來(lái)一次,執行一次賦值,賦值內容是led[0]與led[7:1]重新拼接成8位賦給led,相當于循環(huán)右移 end
引腳分配
按照下面表格定義輸入輸出信號
信號 | 引腳 | 信號 | 引腳 |
---|---|---|---|
clk | J5 | led[3] | M12 |
rst | J9 | led[4] | L15 |
led[0] | N15 | led[5] | K12 |
led[1] | N14 | led[6] | L11 |
led[2] | M14 | led[7] | K11 |
配置好以后編譯下載程序??梢哉{整例化分頻器時(shí)傳遞的參數來(lái)調整流水燈的速度。
====小結====
掌握了verilog里面例化module的用法,采用模塊化設計程序。模塊化設計是非常重要的FPGA設計思想。在下一節我們會(huì )學(xué)習按鍵的另外用法按鍵消抖。
評論