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电路:


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

(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图:



  • 37
    点赞
  • 208
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值