FPGA學習(第10節)-模組的例化-Verilog層次化設計實現LED流水燈

【星星之火】發表於2017-05-23

一、回顧

之前我們學習了FPGA學習(第3節)-Verilog實現LED流水燈+計數器+狀態機+分頻

http://blog.csdn.net/fengyuwuzu0519/article/details/72457366

我們將狀態機、計數器、分配模組等放到了一個.V檔案中,實現了流水燈功能。程式碼如下:

module test(clk,rst_n,led);  
  
input clk ;  
input rst_n ;  
output reg [3:0]led ;  
  
reg[1:0] state;  
reg [31:0] counter;  
reg clk_show;  
  
always @ ( posedge clk or negedge rst_n)  
begin  
    if(!rst_n)  
        begin  
            clk_show<=0;  
            counter<=0;  
        end  
    else  
        if(counter<49999999)  
            counter<=counter+1;  
        else  
            begin  
                counter<=0;            
                clk_show=~clk_show;  
            end  
end  
  
always @ ( posedge clk_show or negedge rst_n)  
begin  
    if(!rst_n)  
        begin  
            led<=4'b1111;  
            state<=0;  
        end  
    else  
    begin  
        case(state)  
            0:begin  
                led<=4'b0111;  
                state<=1;  
            end  
            1:begin  
                led<=4'b1011;  
                state<=2;      
            end  
            2:begin  
                led<=4'b1101;      
                state<=3;              
            end  
            3:begin  
                led<=4'b1110;  
                state<=0;      
            end  
            default:   
                state<=0;  
            endcase  
    end  
end  
endmodule  

看一下以上程式碼的RTL電路:


二、現在採用模組的例化,實現層次化設計。

(1)分為三個.v檔案來實現。

第一個是頂層檔案top.v,裡面只是負責例化模組,並連線。

第二個是分頻模組freq.v,裡面負責分頻產生1秒的時鐘。

第三個是LED狀態機模組led.v,實現LED的操作。

(2)框圖


(3)程式碼實現

top.v(負責例化子模組,只進行連線 wire)

module top(clk,rst_n,led);  
input clk ;  
input rst_n ;  
output [3:0]led ;  
  
wire clk_show;  

freq freq(
	.clk(clk),
	.rst_n(rst_n),
	.clk_show(clk_show)
	);

	led(
	.clk(clk_show),
	.rst_n(rst_n),
	.led(led)
	);  
endmodule


freq.v

module freq(clk,rst_n,clk_show);  
  
input clk ;  
input rst_n ;  

output reg clk_show;    

reg [31:0] counter;

always @ ( posedge clk or negedge rst_n)  
begin  
    if(!rst_n)  
        begin  
            clk_show<=0;  
            counter<=0;  
        end  
    else  
        if(counter<49999999)  
            counter<=counter+1;  
        else  
            begin  
                counter<=0;            
                clk_show=~clk_show;  
            end  
end  
endmodule

led.v

module led(clk,rst_n,led);  
  
input clk ;  
input rst_n ;  
output reg [3:0]led ;  
  
reg[1:0] state;  

always @ ( posedge clk or negedge rst_n)  
begin  
    if(!rst_n)  
        begin  
            led<=4'b1111;  
            state<=0;  
        end  
    else  
    begin  
        case(state)  
            0:begin  
                led<=4'b0111;  
                state<=1;  
            end  
            1:begin  
                led<=4'b1011;  
                state<=2;      
            end  
            2:begin  
                led<=4'b1101;      
                state<=3;              
            end  
            3:begin  
                led<=4'b1110;  
                state<=0;      
            end  
            default:   
                state<=0;  
            endcase  
    end  
end  
endmodule  


看下RTL圖:



相關文章