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

转载自https://blog.csdn.net/fengyuwuzu0519/article/details/72640900

一、回顾

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


————————————————
版权声明:本文为CSDN博主「【星星之火】」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengyuwuzu0519/article/details/72640900

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值