Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)

这篇具有很好参考价值的文章主要介绍了Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关阅读

Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序的,然而Verilog标准并没有将这些事件调度的顺序定死,而是给予了仿真器厂商一定的自由去实现自己的产品,这就导致了设计者如果不遵循一定的编程习惯,会导致意想不到的仿真结果,下面是一些相关的规则。

2、在创建分频时钟时,使用阻塞赋值

        在描述一个对时钟沿敏感的时序逻辑时,普遍的建议是使用非阻塞赋值去描述寄存器操作。但这不是绝对的,当这个寄存器操作的对象是生成时钟时,如果使用了非阻塞赋值,就有可能造成仿真出现错误,下面就是一个时钟竞争的例子。

`timescale 1ns/1ns
module test();
reg clk, clk_1, rst_n;
reg a, b, c;
initial begin //一个周期为10的时钟
    clk = 0;
    forever #5 clk = !clk;
end

//第一个always块
always@(posedge clk, negedge rst_n) begin //一个分频时钟,周期为20
    if(!rst_n) begin
        clk_1 <= 1'b0;
    end
    else begin
        clk_1 <= !clk_1;
    end
end

//第二个always块
always@(posedge clk, negedge rst_n) begin //第一个寄存器使用原时钟触发
    if(!rst_n) begin
        b <= 1'b0;
    end
    else begin
        b <= a;
    end
end

//第三个always块
always@(posedge clk_1, negedge rst_n) begin //第二个寄存器使用分频时钟触发
    if(!rst_n) begin
        c <= 1'b0;
    end
    else begin
        c <= b;
    end
end


initial begin
    rst_n = 0;
    #3 rst_n = 1;
end

initial begin
    a  = 1;
    #24 a = 0;
end
endmodule

        上面是一个很简单的例子,即两个寄存器对输入打两拍,不过第一个寄存器使用10ns的周期,第二个寄存器使用20ns的周期。竞争会出现在两个时钟的上升沿重合时,此时可能的事件调度过程分析如下。

  1. initial块中的clk取反后为高电平,触发第一个always块和第二个always块。如Verilog基础:时序调度中的竞争(一)所说,这两个块的执行顺序是不定的。
  2. 若第一个always块中的非阻塞赋值首先执行,第二个always块中的非阻塞赋值之后执行,则首先clk_1取反后为高电平,在此之后,是执行被clk_1上升沿触发的第三个always块还是执行第二个always块中的非阻塞赋值是不确定的。若先执行第二个always块后再执行第三个always块,则c会直接得到a的值,而不会有任何等待。若先执行第三个always块后执行第二个always块,则是正常打拍。
  3. 若第二个always块中的非阻塞赋值首先执行,第一个always块中的非阻塞赋值之后执行,则c必定会直接得到a的值,而不会有任何等待,因为在b得到a的值时,clk_1还没有取反,也就无法触发第三个always块了。

        因为在25ns时,两个时钟的上升沿重合,所以在24ns时我们将a拉低,测试波形如图1所示。

Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值),Verilog基础,fpga开发,数字IC,硬件工程,Verilog,前端

图1 一个有竞争的波形图

        可以看到在a=0后的下一个上升沿,b和c同时被拉低,这就是竞争所导致的结果。解决这个问题也很简单,只需要将第一个always块中的非阻塞赋值改为阻塞赋值即可,如下所示。

always@(posedge clk, negedge rst_n) begin //一个分频时钟,周期为20
    if(!rst_n) begin
        clk_1 = 1'b0;
    end
    else begin
        clk_1 = !clk_1;
    end
end

         这样做有什么用?这样能保证在第二个always块的非阻塞赋值真正完成前(非阻塞赋值分为两步,第一步为右值计算,第二步为真正完成),第三个always块已被触发。下面是修改后没有竞争的波形。

Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值),Verilog基础,fpga开发,数字IC,硬件工程,Verilog,前端文章来源地址https://www.toymoban.com/news/detail-751682.html

到了这里,关于Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「Verilog学习笔记」任意奇数倍时钟分频

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

    2024年01月23日
    浏览(36)
  • Verilog-实现时钟分频(1KHZ、奇、偶分频,占空比为50%)

    代码如下 1khz分频代码 1khz分频-testbench 仿真图如下 通过计数器实现,进行N倍偶数分频,通过时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,以此循环下去。(占空比为50%) ,以下代码实现8分频,可根据实际需求改变参数输出需要的时钟。 代码如下 偶

    2024年02月08日
    浏览(48)
  • 【实验室学习】时钟分频器,2、3、4、8分频 verilog实现

    记录时钟分频器的Verilog代码编写,主要掌握分频器设计思路 2、4、8分频设计较为容易: 2分频—设计一个1位的寄存器,当原时钟上升沿时取反即可 代码展示: 4分频与8分频—设计一个两位的计数器,4分频只需在计数器计数到00B或者10B时跳变电平即可,8分频只需在计数器计

    2024年02月11日
    浏览(41)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(58)
  • 时序逻辑基础之D触发器&分频器

    D触发器原理如下 D触发器模拟波形图如下 由图可知Q值不仅与D有关,同时需要考虑到clk上升沿到来后有效 输入一个时钟信号,将输出的信号的时钟周期变为输入信号的时钟周期的N倍,我们将这种器件叫做N分频器。 我们的目的是生成一个N分频器,可以实现任意比例分频。需

    2024年02月06日
    浏览(54)
  • 偶分频和奇分频 FPGA verilog 基础练习4

    发现问题,用技术解决问题。兴趣是自己的源动力 ! 分频器的练习就是计数器的一个应用分支,用设立来检验自己对计数器的使用使用熟练。真实上板代码,都是使用IP核来进行的。核心的点就是要明白计数器使用的两个关键: 清零条件 递增条件 偶数分频,计数器具有对称

    2024年02月04日
    浏览(34)
  • 13.Verilog中的时钟(clk)的产生方法

    clk的产生主要应用在验证中,产生目前主流的就是两种方法,一个是always块,一个是适合用forever语句,接下来将分别进行介绍: ①使用always块来产生时钟,如下所示。 ②另外一种是用forever语句(UVM常用) 非常简单,产生时钟的方法学会了么?出一个思考题 思考:#10 和##

    2024年02月06日
    浏览(27)
  • fpga时钟分频——奇数分频

    相比偶数分频,奇数分频相对复杂,下面我总结一下如何用verilog实现。以N(奇数)为例。 总结如下: a. 上升沿计数器和信号寄存器 : 设置一个计数长度为N的上升沿计数器(pos_cnt),并且设置一个信号寄存器(pos_clk)。 当上升沿计数器计数到时,信号寄存器翻转。 当上升沿计

    2024年04月17日
    浏览(59)
  • 一文弄懂Verilog静态时序分析中的建立时间和保持时间

           在对Verilog代码进行静态时序分析的时候,建立时间和保持时间是需要我们重点关注的指标。 建立时间(Setup Time): 指采样时钟边沿到来之前,数据需要保持稳定的时间。如果数据在采样时钟的边沿到来之前的建立时间内这段时间变化,可能会造成时钟采样的数据在

    2024年01月16日
    浏览(44)
  • 分频时钟、使能时钟、门控时钟的概念和使用

            FPGA的时钟和时序以及功能息息相关,下面将介绍分频时钟,使能时钟以及门控时钟。         有些时候设计需要将主时钟进行分频以降低频率使用,对于有足够PLL和MMCM资源的FPGA,可以使用PLL或MMCM进行分频,但是没有这些资源的FPGA要想降低时钟频率就得靠逻辑来

    2024年02月12日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包