免费网站建设域名,网站开发人员,黄岩建设局网站,如何修改WordPress备份中的网址https://www.cnblogs.com/icparadigm/p/12794483.html https://www.cnblogs.com/icparadigm/p/12794422.html 亚稳态
是什么
时序逻辑在跳变时#xff0c;由于异步信号、跨时钟域等原因#xff0c;不满足setup或hold条件#xff0c;输出在0和1之间产生振荡。
原因
D触发… https://www.cnblogs.com/icparadigm/p/12794483.html https://www.cnblogs.com/icparadigm/p/12794422.html 亚稳态
是什么
时序逻辑在跳变时由于异步信号、跨时钟域等原因不满足setup或hold条件输出在0和1之间产生振荡。
原因
D触发器的内部是一个主从锁存器(master-slave latch)依靠背靠背的反相器锁存数据。
时钟为低电平时主锁存器更新输入值从锁存器保持上一个输出值不变。 时钟为高电平时主锁存器保持上一个输出值不变从锁存器更新输入。 由于反相器需要一定时间才能锁定若时钟跳变前后未完成锁存时钟就改变最后输出的电平高低会不稳定这就是亚稳态。
危害
错误的逻辑会一直传递下去导致系统错误。
指标
MTBF-- mean time between failure. 两次失效之间的平均时间。 MTBF(TMET)eTMETC1∗1C2∗fclk∗fdataMTBF(T_{MET})\frac{e^{T_{MET}}}{C_1} * \frac{1}{C_2*f_{clk}*f_{data}} MTBF(TMET)C1eTMET∗C2∗fclk∗fdata1 C1 和C2 是常数依赖于器件工艺和操作环境。 fCLK 和fDATA 参数取决于设计规格fCLK 是接收异步信号的时钟域的时钟频率fDATA 是异步数据的翻转频率toggling frequency。 TMET 参数是亚稳态转稳定的时间Metastability setting time,或者说时序裕量大于寄存器Tco可以让潜在的亚稳态信号达到稳定的值的时间。TMET 对同步链来说就是链中每个寄存器输出时序裕量的和。
减少亚稳态的方法
1. 改善工艺
2. 降低时钟速率和数据翻转。
3. 增大时序裕量使用多级同步器打拍单bit情况
1.慢时钟域到快时钟域目标时钟频率必须是源时钟频率1.5倍或者以上
电平同步直接打拍。 /*--------- --------- ---------asynch_in | | meta1 | | meta2 | | synch_out---------- D Q -------- D Q ------- D Q -------| | | | | |clk_b | | clk_b | | clk_b| |---------- CLK | ------ CLK | ----- CLK || R | | | R | | | |-------- | -------- | --------| | || | || | |-------------------------------------------------*/always (posedge clk_b or posedge rst) beginif(rst) beginmeta10;meta20;synch_out0;endelse beginmeta1asynch_in;meta2meta1;synch_outmeta2;endendassign pos_out_bsynch_out~meta2;//高电平跳变沿assign neg_out_b~synch_outmeta2;//低电平跳变沿2.快时钟域到慢时钟域
脉冲同步器即加握手信号通过组合逻辑把脉冲展宽为电平信号再向clkb传递当确认clkb已经“看见”信号同步过去之后再清掉clka下的电平信号。在应答信号到来之前不允许源信号改变,可能漏采。 module pluse_sync(input rst_n,input clk_a,input clk_b,input pulse_a_in,output pulse_b_out,output level_b_out);reg q;//展宽脉冲信号reg q1_a2b,q2_a2b,sync_out;//a向b同步信号reg q1_b2a,q2_b2a;//b向a同步信号//q的置位与清零always (posedge clk_a or negedge rst_n) beginif(~rst_n)q0;else if(pulse_a_in)q1;else if(q2_b2a)q0; end//always (posedge clk_b or negedge rst_n) beginif(~rst_n) beginq1_a2b0;q2_a2b0;sync_out0;endelse beginq1_a2bq;q2_a2bq1_a2b;sync_outq2_a2b;endend//always(posedge clk_a or negedge rst_n) beginif(~rst_n) beginq1_b2a0;q2_b2a0;endelse beginq1_b2async_out;q2_b2aq1_b2a;endassign pulse_b_outsync_out(~q2_a2b);assign level_b_outsync_out;endmodule在使用同步器同步信号时要求输入信号必须是源时钟域的寄存输出。即Asynch_in必须是clk_a的DFF信号中间不能经过组合逻辑。 原因根据FF的特性输出在一个时钟周期内是不会改变的数据的变化频率不会超过时钟频率这样就能降低跨时钟信号变化的频率减小亚稳态发生的概率 应用 输入去抖debounce //可以滤掉的宽度是两个clk的cycle对于大于两个cycle而小于三个cycle的信号有些可以滤掉有些不能滤掉这与signal_i相对clk的相位有关。
parameter BIT_NUM 4 ;
reg [BIT_NUM-1 : 0] signal_deb ;
always (posedge clk or negedge rst_n)
beginif (rst_n 1b0)signal_deb {BIT_NUM{1b0}} ;elsesignal_deb # DLY {signal_deb[BIT_NUM-2:0],signal_i} ;
endalways (posedge clk or negedge rst_n)
beginif (rst_n 1b0)signal_o 1b1 ;else if (signal_deb[3:1]3b111) signal_o # DLY 1b1 ;else if (signal_deb[3:1]3b000)signal_o # DLY 1b0 ;else ;
end根据希望滤除的宽度换算到clk下是多少个cycle数从而决定使用多少级DFF。 如果希望滤除的宽度相对cycle数而言较大可以先在clk下做一个计数器产生固定间隔的脉冲再在脉冲信号有效时使用多级DFF去抓signal_i或者直接将clk分频后再使用。 也不一定全为1或0才判断有效/无效见project/uart_tx 输入去抖。
多bit情况 多个信号合并 如果可能将多个信号合为一个传递。 多周期路径法 常见于单bit同步多bit一般用AFIFO 使用格雷码传递多个CDC位 格雷码最常见的应用是在异步FIFO中,相邻的状态只变化一位转化为单bit情况。 **格雷码必须是计数到2n才是每次改变一个bit。**如果计数器是从0~5计数那么从5-0的计数不止一个bit改变就失去了只改变一个bit的初衷。所以就算浪费面积也需要把FIFO深度设置为2N。 使用异步FIFO来传递多位信号
Valid-Ready握手协议 https://blog.csdn.net/maowang1234588/article/details/100065072 VALID信号由源设备控制READY信号由宿设备控制。源设备拉起VALID信号表示其把数据或地址等信号放上了总线等待宿设备接收在宿设备接收数据以前源设备必须要保持住总线上的数据不变。宿设备只有在可以接收数据时才可以拉起READY信号否则只能拉低READY信号。只有当VALID和READY信号同时有效时一次数据传输才算完成。
AXI协议保障数据正确传输使用了该握手协议所有的通道都采用同样的握手协议。
Valid-Ready信号产生有两种情况。 Ready-Before-Valid Ready-Before-Valid是Ready信号在Valid信号之前有效。在数据来临之前通道已准备好接收数据可以保持通道的最大吞吐量因为Ready先产生这个通道保持刷新等待数据。通道作为接受数据端采用这样的设计。 Valid-before-Ready Valid-before-Ready是Valid信号在Ready信号之前有效。通道作为数据输出端采用这样的设计。收到下游接收端的准备接收信号才开始传输数据。 Stalemate 死锁 输出端用Ready-Before-Valid而接受端使用Valid-before-Ready就会出现输出端等待接受端给出的Ready来输出数据但是接收端也在等待输出端给出Valid信号来接受数据。两者都在等待却没有一方先给所以这个时候这个通道就是无效的被“锁住”了。 verilog实现 无缓存见典型电路 带缓存用同步FIFO实现 assign valid_o ~fifo_empty;
assign ready_o ~fifo_full;
assign wr_en ready_o valid_i;
assign rd_en ready_i valid_o;