【FPGA】Verilog:时序电路设计 二进制计数器 计数器 分频器 时序约束_二进制计数器电路

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

0x01 利用IP核构造计数器

Ⅱ. Verilog实现

0x00 分频器

0x01 时序约束


Ⅰ. 前置知识

0x00 二进制计数器

一个简单的二进制计数器通过二进制序列反复循环实现计数。以两位加法计数为例,每次时钟脉冲信号clk 为上升沿时,计数器会将计数值加1。所以计数值(由Q1Q0组成),依次是 00,01,10,11,00,11…,周而复始。在图中的波形图里,透露了这样几个信息:

[i]  一个两bit计数器,它所能计数的范围是 0~3(即22-1)。同理,n bits的计数器所能计数的范围是0~2n-1。

[ii]  如果将Q0、Q1作为单独信号线引出,由Q0、Q1得到的波形频率是时钟脉冲信号clk的1/2、1/4,亦即是将时钟脉冲信号的clk频率除2、除4。因此图示计数器又常被称为除4计数器。

[iii]  由上讨论推广可知,n bits计数器可获得的信号之多是频率除2n的结果。

参考如下源程序,试分析其分频系数:

module addcounter(clk,Q) ; 
input clk ;
output[1:0] Q ;
reg[1:0] Q ;
always @(posedge clk)begin
Q<=Q+1 ;
end
endmodule
module counter3(clr,clk,Q)
input wire clr; input wire clk;
output reg[2:0] Q;
input wire [2:0] D;
assign D[2] = ~Q[2] & Q[1] & Q[0] | Q[2] & ~Q[1] | Q[2] & ~Q[0]
assign D[1] = ~Q[1] & Q[0] | Q[1] & ~Q[0]
assign D[0] = ~Q[0]
always @ (posedge clk or posedge clr) begin
  if(clr==1)  Q<=0;
  else   Q <=D
end
endmodule

通用型的二进制计数器一般具备更多功能,例如可以增/减计数、预置初值、同步清零、暂停等。74LS161就是一种常用的可预置4位二进制同步加法计数器。其功能表如下图表:

输入输出
0
10
11
11
11
0x01 利用IP核构造计数器

(1)根据上述74LS161的原理和参考代码,在vivado中设计计数电路:

module CNT161( input CR, input CP, input [3:0] D , input LD, input EP, input ET, output wire [3:0] Q);
wire [3:0] Din;
reg [3:0] Dout;
assign Din=D;
assign Q=Dout;
always@(posedge CP or negedge CR)  begin
if (CR==0)  Dout<=0;
else if  (LD==0)  Dout<=Din;
else if  (LD==1 && EP==0 && ET==0)  Dout<=Dout;
else if  (LD==1 && EP==0 && ET==1)  Dout<=Dout;
else if  (LD==1 && EP==1 && ET==0)  Dout<=Dout;
else if  (LD==1 && EP==1 && ET==1)  Dout<=Dout+1;
end
endmodule  

(2)实验板时钟为100MHZ,利用计数器构造分频输出1H:

module slowClock(clk, reset, clk_1Hz);
input clk, reset;
output clk_1Hz;
reg clk_1Hz = 1'b0;  // provide initial condition for this register.
reg [27:0] counter;
// counter size calculation according to input and output frequencies
parameter sys_clk = 100000000;  // 50 MHz system clock
parameter clk_out = 1;  // 1 Hz clock output
parameter max = sys_clk / (2*clk_out); // max-counter size
always@(posedge reset or posedge clk)  begin
    if (reset == 1'b1)  begin
       clk_1Hz <= 0;
       counter <= 0;
    end
    else  begin
       counter <= counter + 1;
       if ( counter == max)  begin
          counter <= 0;
          clk_1Hz <= ~clk_1Hz;
       end
     end
end
endmodule   

Ⅱ. Verilog实现

0x00 分频器

设计代码:


module slowClock(clk, reset,Q);
    input clk, reset;
    output [3:0] Q;
    reg [3:0] Q = 4'b0000;
    // provide initial condition for this register.
    reg [27:0] counter;
    // counter size calculation according to input and output frequencies
parameter sys_clk = 1;  
parameter clk_out = 1;  
parameter max = sys_clk / (2*clk_out); // max-counter size

    always@(posedge reset or posedge clk)  begin
        if (reset == 1'b1)  begin
        Q <= 0;
        counter <= 0;
        end
        else  begin
            counter <= counter + 1;
            if (counter == max)  begin
                counter <= 0;
                Q<=Q+4'b0001;
            end
        end
    end
endmodule

❗ 注:

parameter sys_clk = 1;  
parameter clk_out = 1;  
parameter max = sys_clk / (2*clk_out); // max-counter size

是根据EGO1板子的频率编写的,不同的板子可用设置不同的分频

仿真代码:

module sim_slowClock();
    reg clk ,reset;
    wire [3:0] Q;
    slowClock test(.clk(clk),.reset(reset),.Q(Q));
    initial clk=0;
    initial reset=1;
    always begin
        #10;
        clk=~clk;
        reset=0;
        end
endmodule



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/0f46b61122cca696798f58774eb929a3.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-2weGZdSM-1713341901865)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. BCD计数器Verilog描述: BCD(二进制编码十进制)计数器是一种计数器,它可以在0到9之间循环计数。下面是一个BCD计数器Verilog描述: ```verilog module bcd_counter( input clk, input rst, output reg [3:0] count ); always @(posedge clk or posedge rst) begin if (rst) begin count <= 4'b0000; end else begin if (count == 4'b1001) begin count <= 4'b0000; end else begin count <= count + 1; end end end endmodule ``` 在此Verilog代码中,我们声明了一个名为 "bcd_counter" 的模块,该模块接受时钟信号 "clk"、复位信号 "rst" 和四位输出 "count"。在 "always" 块中,我们使用 "posedge" 来检测时钟上升沿,并在复位上升沿时将计数器 "count" 复位为0。在计数器不被复位时,我们检查计数器的值是否为9,如果是,则将其重置为0,否则将其递增1。 2. 二进制计数器Verilog描述: 二进制计数器是一种计数器,它可以在0到15之间循环计数。下面是一个二进制计数器Verilog描述: ```verilog module binary_counter( input clk, input rst, output reg [3:0] count ); always @(posedge clk or posedge rst) begin if (rst) begin count <= 4'b0000; end else begin if (count == 4'b1111) begin count <= 4'b0000; end else begin count <= count + 1; end end end endmodule ``` 在此Verilog代码中,我们声明了一个名为 "binary_counter" 的模块,该模块接受时钟信号 "clk"、复位信号 "rst" 和四位输出 "count"。在 "always" 块中,我们使用 "posedge" 来检测时钟上升沿,并在复位上升沿时将计数器 "count" 复位为0。在计数器不被复位时,我们检查计数器的值是否为15,如果是,则将其重置为0,否则将其递增1。 3. 分Verilog描述: 分是一种电路,它可以从输入时钟信号的率产生一个较低的输出时钟信号。下面是一个分Verilog描述: ```verilog module divider( input clk, input rst, output reg divided_clk ); reg [7:0] count; always @(posedge clk or posedge rst) begin if (rst) begin count <= 8'b00000000; divided_clk <= 1'b0; end else begin count <= count + 1; if (count == 8'hff) begin divided_clk <= ~divided_clk; count <= 0; end end end endmodule ``` 在此Verilog代码中,我们声明了一个名为 "divider" 的模块,该模块接受时钟信号 "clk"、复位信号 "rst" 和输出时钟信号 "divided_clk"。我们使用一个八位计数器 "count" 来计算时钟周期的数量。在 "always" 块中,我们使用 "posedge" 来检测时钟上升沿,并在复位上升沿时将计数器 "count" 和分输出 "divided_clk" 复位为0。在计数器不被复位时,我们递增计数器 "count",并在计数器计数到255时切换 "divided_clk" 的值。这样,从输入时钟信号产生的输出时钟信号的率就是输入时钟信号率的1/256。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值