时钟分频引起的问题

该博客讨论了在时钟分频过程中遇到的时序分析警告,分析了由于clk1us激励代码被视为组合逻辑电路造成的问题。作者提出了一种改进方案,通过引入额外的寄存器和边沿检测信号来避免时序不满足条件,从而解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

<textarea cols="87" rows="15" name="code" class="c-sharp">reg[31:0] wait_count; reg[31:0] max_wait_count; //times/1us always @(posedge clk1) max_wait_count &lt;= {sendTickH, sendTickL}; reg clk1us; parameter US_COUNT_OF_25M = 12500; reg[15:0] clk1us_count; always @(posedge clk25 or negedge gblnrst) begin if(!gblnrst) begin clk1us_count &lt;= 16'd0; clk1us &lt;= 1'b0; end else begin if(clk1us_count &lt; US_COUNT_OF_25M) clk1us_count &lt;= clk1us_count + 16'd1; else begin clk1us_count &lt;= 16'd0; clk1us &lt;= ~clk1us; end end end always @(posedge clk1us) begin if(fiber_state2 &lt; FIBER_CALC) begin wait_count &lt;= 32'd0; wait_status_ok &lt;= 1'b0; end else begin if(wait_count &gt;= max_wait_count &amp;&amp; (fiber_state2 == FIBER_CALC || fiber_state2 == FIBER_FILL)) begin wait_count &lt;= 32'd0; end else begin if(wait_count &lt; max_wait_count) wait_count &lt;= wait_count + 32'd1; else wait_status_ok &lt;= 1'b1; end end end </textarea> 

 

 

RTL图

 

STA时序分析工具出现警告时序不满足条件。查看RTL图,发现clk1us激励代码被认为clk25下的组合逻辑电路,最终造成时序不满足条件。后来想到一个办法:

 

 

 

改为:

<textarea cols="87" rows="15" name="code" class="c-sharp">reg[31:0] wait_count; reg[31:0] max_wait_count; //times/1us always @(posedge clk1) max_wait_count &lt;= {sendTickH, sendTickL}; reg clk1us, clk1us_1, clk1us_2; parameter US_COUNT_OF_25M = 12500; reg[15:0] clk1us_count; always @(posedge clk25 or negedge gblnrst) begin if(!gblnrst) begin clk1us_count &lt;= 16'd0; clk1us &lt;= 1'b0; end else begin if(clk1us_count &lt; US_COUNT_OF_25M) clk1us_count &lt;= clk1us_count + 16'd1; else begin clk1us_count &lt;= 16'd0; clk1us &lt;= ~clk1us; end end end always @(posedge clk25) begin clk1us_1 &lt;= clk1us; clk1us_2 &lt;= clk1us_1; end wire clk1us_posedge; assign clk1us_posedge = ~clk1us_2 &amp; clk1us_1; always @(posedge clk25) begin if(fiber_state2 &lt; FIBER_CALC) begin wait_count &lt;= 32'd0; wait_status_ok &lt;= 1'b0; end else begin if(clk1us_posedge) begin if(wait_count &gt;= max_wait_count &amp;&amp; (fiber_state2 == FIBER_CALC || fiber_state2 == FIBER_FILL)) begin wait_count &lt;= 32'd0; end else begin if(wait_count &lt; max_wait_count) wait_count &lt;= wait_count + 32'd1; else wait_status_ok &lt;= 1'b1; end end end end </textarea>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值