我是靠谱客的博主 傻傻大米,最近开发中收集的这篇文章主要介绍Verilog 三种计数器写法0计数器设计要点1 时序逻辑和组合逻辑彻底分开2最常见的写法3至简设计法4 总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

时钟周期 频率50MHz 倒数为1/(5*108)s=20ns,凑够一秒需要5 * 108个。
ms us ns ps

0计数器设计要点

1 初始值
a) 复位值
b)每轮初始值

2 . 加1 条件

3 . 结束条件
a)返回初始值
b)结束一轮计数的条件,一般为加1条件并列

4 计数器位宽
与2的n次幂相比,如2<3<22,则取上限,2

当不定时计数时,采用自减计数器

1 时序逻辑和组合逻辑彻底分开

//模10计数器,0到10循环累加

module Count_1
(
    input               clk                 ,
    input               rst_n               ,
    output reg [ 3:0]   cnt
);

//----------------------------------------------------------------------
//--   组合电路
//----------------------------------------------------------------------
reg [ 3:0]              cnt_n                ;

always @(*)begin
    if(cnt == 4'd9)
        cnt_n = 4'd0; 
    else
        cnt_n = cnt + 1'b1;
end

//----------------------------------------------------------------------
//--   时序电路
//----------------------------------------------------------------------
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 4'b0;
    else
        cnt <= cnt_n;
end

endmodule

/*
//----------------------------------------------------------------------
//--   组合电路也可以这样写
//----------------------------------------------------------------------
wire [ 3:0]             cnt_n               ;

assign cnt_n = (cnt==4'd9)? 4'd0 : cnt+1'b1;

*/

2最常见的写法


module Count_2
(
    input               clk                 ,
    input               rst_n               ,
    output reg [ 3:0]   cnt
);

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 4'd0;
    else if(cnt==4'd9)
        cnt <= 4'd0;
    else
        cnt <= cnt + 1'b1;
end



endmodule

3至简设计法



module Count_3
//---------------------<端口声明>---------------------------------------
(
input                   clk                 ,
input                   rst_n               ,
output reg [ 3:0]       cnt
);
//---------------------<信号定义>---------------------------------------
wire                    add_cnt             ;
wire                    end_cnt             ;

//----------------------------------------------------------------------
//--   0-9计数
//----------------------------------------------------------------------
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 4'd0;
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 4'd0;
        else
            cnt <= cnt + 1'b1;
    end
    else
        cnt <= cnt;
end

assign add_cnt = 1;
assign end_cnt = add_cnt && cnt==4'd9;




endmodule

在这里插入图片描述

4 总结

由此可见,三种写法对应的RTL视图是完全一致的。

第一种写法优点是时序和组合彻底分开,代码直接映射成电路,非常直观。缺点是写法较为麻烦。第二种写法是最常见的写法,不仅是小梅哥,大多数人都是这种写法。第三种明德杨FPGA教程的写法,把加一条件和结束条件独立出来,非常方便使用。我这里为了保持一致把每一个数字都加了位宽,其实位宽是也是可以省略的。这样第三种写法甚至变成了一种模板:

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 0;
        else
            cnt <= cnt + 1;
    end
end

assign add_cnt = 1;
assign end_cnt = add_cnt && cnt==x-1 ;

ref
https://www.cnblogs.com/xianyufpga/p/10908740.html
计数器用作分频及仿真
https://www.cnblogs.com/IClearner/p/7208871.html

最后

以上就是傻傻大米为你收集整理的Verilog 三种计数器写法0计数器设计要点1 时序逻辑和组合逻辑彻底分开2最常见的写法3至简设计法4 总结的全部内容,希望文章能够帮你解决Verilog 三种计数器写法0计数器设计要点1 时序逻辑和组合逻辑彻底分开2最常见的写法3至简设计法4 总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部