您的位置:首页 > 房产 > 建筑 > 时钟、复位与上电初始化

时钟、复位与上电初始化

2025/1/25 9:11:16 来源:https://blog.csdn.net/Starry__/article/details/139332793  浏览:    关键词:时钟、复位与上电初始化

目录

  • 1. 复位
    • 2.1. 异步复位 同步释放
    • 2.2. Xilinx FPGA复位设计
      • 尽量少用复位
      • reg信号初始值
      • 基于PLL锁定(locked)复位设计
  • 2. 时钟


1. 复位

FPGA中复位设计总结
深入理解复位—同步复位,异步复位,异步复位同步释放(含多时钟域)

  • 同步复位:优点是时序简单,不受毛刺影响。缺点是大部分逻辑器件库内的DFF都只有异步复位端口,同步复位需要额外加入组合逻辑,整个芯片设计会消耗大量组合逻辑资源。

  • 异步复位:优点是实现简单,无需额外组合逻辑,复位启动不受时钟影响。缺点是复位释放的时候,时钟若采样复位信号跳变时刻,寄存器信号容易出现亚稳态。

例如

always@(posedge clk or negedge rst_n) beginif(!rst_n) b <= 1'b0;else b <= a;
end

在这里插入图片描述

因此为了保证全局复位不消耗太多组合逻辑,也能保证避免异步复位释放导致的亚稳态,如何作?

2.1. 异步复位 同步释放

  • 异步复位,同步释放:复位信号到来的时候不受时钟信号影响,复位信号释放的时候受到时钟信号的同步。

例如下面代码中rst_sync_n就实现了异步置0、同步置1

// rst_async_n为异步复位信号
always@(posedge clk or negedge rst_async_n) beginif(!rst_async_n) beginrst_s1     <= 1'b0;rst_sync_n <= 1'b0;endelse beginrst_s1     <= 1'b1;rst_sync_n <= rst_s1;end
end//由于rst_sync_n复位启动还是异步的,所以必须加入敏感列表中always@(posedge clk or negedge rst_sync_n) beginif (!rst_sync_n) dout <= 1'b0;else          dout <= din;end

出现亚稳态的波形图如下

在这里插入图片描述

如上图所示:

  • T1时刻:rst_async_n异步复位启动,rst_s1和rst_sync_n全部拉低,与clk无关

注意T1时刻是异步的,不涉及clk采样,因此rst_s1和rst_sync_n不会出亚稳态

  • T2时刻:rst_async_n异步复位释放,此时clk采样rst_async_n边沿,采样值不定,因此rst_s1出现0、1之间的亚稳态。rst_sync_n仍然保持0
  • T3时刻:rst_s1可能恢复也可能还是亚稳态,但clk采样到rst_async_n为1,因此rst_s1恢复为1。rst_sync_n则相当于对T2时刻的rst_async_n打两拍处理,因此会稳定至0或1两种状态,并处于clk时钟域下!

发现没有T2时刻本质上是对rst_async_n作电平同步!!!那么rst_sync_n一定会稳定在clk时钟域下的高电平。
参考异步时钟亚稳态 的解决方案——单bit信号

即T2时刻的逻辑可以看成:

always@(posedge clk) beginrst_s1     <= rst_async_n;rst_sync_n <= rst_s1;
end

2.2. Xilinx FPGA复位设计

Xilinx FPGA异步复位同步释放——同步后的复位当作同步复位还是异步复位?【FPGA探索者】

Xilinx复位准则:

  • 尽量少用复位
  • FPGA上电后所有触发器和RAM均有初始值
  • 确保高电平复位
  • 采用同步复位

尽量少用复位

全局复位信号高扇出会造成布局布线困难,部分逻辑是无需复位的,例如数据流中间信号

reg信号初始值

Vivado寄存器初始值问题
不得不读的 FPGA 设计白皮书——Xilinx FPGA 复位策略白皮书翻译(WP272)【FPGA探索者】

Xilinx FPGA上电后,所有触发器和RAM都具备初始值,比任何的逻辑复位都要全面,不需要全局复位。

reg信号上电初始值可配置,可通过reg [2:0] a = 3;配置上电初值。

默认规则如下:

  1. 不赋初始值、不复位,上电后寄存器值为0
  2. 赋初始值、不复位,上电后寄存器值为初始值
  3. 不赋初始值、复位,上电后寄存器值为复位值
  4. 赋初始值、复位,上电后寄存器值为初始值,复位后为复位值

综合后,可在synthesis/schematic网表中点击触发器,Cell Properties/Properties/INIT设置初始值

基于PLL锁定(locked)复位设计

无论是PLL产生的时钟还是外部输入的时钟,同步复位信号按如下产生。注意reg a=1;表示上电后该值为1,复位后可能为其他值

`timescale 1ns / 1psmodule clk_rst_gen(input clk_in,input clk_in2,					output clk_a,					output clk_b,					output clk_c,					output clk_d,					output reg rst_in2,					output reg rst_a,					output reg rst_b,				output reg rst_c,					output reg rst_d,					);//--------------------------------------------------------------------------------------------------------// pll//--------------------------------------------------------------------------------------------------------wire locked;pll		pll(.clk_in1		( clk_in	),.clk_out1       ( clk_a   	),.clk_out2       ( clk_b   	),.clk_out3       ( clk_c 	),.clk_out4       ( clk_d   	),.locked         ( locked    ));//--------------------------------------------------------------------------------------------------------// locked_temp attends to eliminate jitter of signal locked//--------------------------------------------------------------------------------------------------------reg	[15:0]	cnt;always@(posedge clk_in or negedge locked) beginif(!locked)cnt <= 0;else if(cnt[15])cnt <= cnt;elsecnt <= cnt + 1;endwire locked_temp = cnt[15];//--------------------------------------------------------------------------------------------------------// async reset and sync release//--------------------------------------------------------------------------------------------------------reg 		rst_in2_d1 = 1;					reg 		rst_in2_d2 = 1;					always@(posedge clk_in2 or negedge locked_temp) beginif(!locked_temp) beginrst_in2_d1 <= 1'b1;rst_in2_d2 <= 1'b1;rst_in2    <= 1'b1;endelse begin	rst_in2_d1 <= 1'b0;rst_in2_d2 <= rst_in2_d1;rst_in2    <= rst_in2_d2;endendreg 		rst_a_d1 = 1;					reg 		rst_a_d2 = 1;					always@(posedge clk_a or negedge locked_temp) beginif(!locked_temp) beginrst_a_d1 <= 1'b1;rst_a_d2 <= 1'b1;rst_a    <= 1'b1;endelse begin	rst_a_d1 <= 1'b0;rst_a_d2 <= rst_a_d1;rst_a    <= rst_a_d2;endendreg 		rst_b_d1 = 1;					reg 		rst_b_d2 = 1;					always@(posedge clk_b or negedge locked_temp) beginif(!locked_temp) beginrst_b_d1 <= 1'b1;rst_b_d2 <= 1'b1;rst_b    <= 1'b1;endelse begin	rst_b_d1 <= 1'b0;rst_b_d2 <= rst_b_d1;rst_b    <= rst_b_d2;endendreg 		rst_c_d1 = 1;					reg 		rst_c_d2 = 1;					always@(posedge clk_c or negedge locked_temp) beginif(!locked_temp) beginrst_c_d1 <= 1'b1;rst_c_d2 <= 1'b1;rst_c    <= 1'b1;endelse begin	rst_c_d1 <= 1'b0;rst_c_d2 <= rst_c_d1;rst_c    <= rst_c_d2;endendreg 		rst_d_d1 = 1;					reg 		rst_d_d2 = 1;					always@(posedge clk_d or negedge locked_temp) beginif(!locked_temp) beginrst_d_d1 <= 1'b1;rst_d_d2 <= 1'b1;rst_d    <= 1'b1;endelse begin	rst_d_d1 <= 1'b0;rst_d_d2 <= rst_d_d1;rst_d    <= rst_d_d2;endendendmodule

2. 时钟

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com