FPGA学习(第10节)-模块的例化-Verilog层次化设计实现LED流水灯

一、回顾

之前我们学习了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电路:

FPGA学习(第10节)-模块的例化-Verilog层次化设计实现LED流水灯_第1张图片

二、现在采用模块的例化,实现层次化设计。

(1)分为三个.v文件来实现。

第一个是顶层文件top.v,里面只是负责例化模块,并连线。

第二个是分频模块freq.v,里面负责分频产生1秒的时钟。

第三个是LED状态机模块led.v,实现LED的操作。

(2)框图

FPGA学习(第10节)-模块的例化-Verilog层次化设计实现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图:

FPGA学习(第10节)-模块的例化-Verilog层次化设计实现LED流水灯_第3张图片

FPGA学习(第10节)-模块的例化-Verilog层次化设计实现LED流水灯_第4张图片

你可能感兴趣的:(FPGA)