新聞中心

        Altera MAX10: LED流水燈

        作者: 時間:2023-11-02 來源:電子森林 收藏

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

        本文引用地址:http://www.104case.com/article/202311/452378.htm

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

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

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

        // ********************************************************************
        // >>>>>>>>>>>>>>>>>>>>>>>>> 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:流水燈的模塊化設(shè)計 
        module flashled (clk,rst,led); 	
        input clk,rst;						
        	output [7:0] led;				 
                 reg   [2:0] cnt ;                               //定義了一個3位的計數(shù)器,輸出可以作為3-8譯碼器的輸入         
                 wire clk1h;                                     //定義一個中間變量,表示分頻得到的時鐘,用作計數(shù)器的觸發(fā)                 
                 //例化module decode38,相當(dāng)于調(diào)用
                decode38 u1 (                                   
        			.sw(cnt),                       //例化的輸入端口連接到cnt,輸出端口連接到led  
        			.led(led)
        			);         //例化分頻器模塊,產(chǎn)生一個1Hz時鐘信號		
                divide #(.WIDTH(32),.N(12000000)) u2 (         //傳遞參數(shù)
        			.clk(clk),
        			.rst_n(rst),                   //例化的端口信號都連接到定義好的信號
        			.clkout(clk1h)
        			);                                      //1Hz時鐘上升沿觸發(fā)計數(shù)器,循環(huán)計數(shù)		
                always @(posedge clk1h or negedge rst)
        	     if (!rst)
        		cnt <= 0;
        	     else
        		cnt <= cnt +1;         
        		endmodule

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

        // ********************************************************************
        // >>>>>>>>>>>>>>>>>>>>>>>>> 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:流水燈的模塊化設(shè)計 
        module flashled (clk,rst,led); 	
        input clk,rst;						
        	output [7:0] led;				         
        	wire clk1h;                                 //定義一個中間變量,表示分頻得到的時鐘,用作計數(shù)器的觸發(fā)                 
        	//例化分頻器模塊,產(chǎn)生一個1Hz時鐘信號		
                divide #(.WIDTH(32),.N(12000000)) u2 (         //傳遞參數(shù)
        			.clk(clk),
        			.rst_n(rst),                   //例化的端口信號都連接到定義好的信號
        			.clkout(clk1h)
        			);                                      //1Hz時鐘上升沿觸發(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]};      
        			//當(dāng)時鐘上升沿來一次,執(zhí)行一次賦值,賦值內(nèi)容是led[0]與led[7:1]重新拼接成8位賦給led,相當(dāng)于循環(huán)右移
        	end	

        按照下面表格定義輸入輸出信號

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

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

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



        關(guān)鍵詞: 流水燈 FPGA Lattice Diamond 小腳丫

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 鄂州市| 尉犁县| 方城县| 西盟| 手游| 县级市| 海宁市| 漯河市| 久治县| 商丘市| 腾冲县| 临汾市| 扎兰屯市| 新龙县| 勐海县| 阜康市| 宝鸡市| 奎屯市| 昆山市| 怀远县| 苏州市| 安泽县| 东丽区| 博湖县| 灵山县| 镇平县| 邯郸县| 永善县| 定陶县| 藁城市| 宾阳县| 行唐县| 双桥区| 巴里| 祁连县| 黑河市| 分宜县| 双流县| 佛教| 徐水县| 义乌市|