一个变量在两个always 赋值有没有好的步骤解决

一个变量在两个always 赋值有没有好的方法解决
经常遇到一个变量在两个always 赋值的情况,总是没有很好的方法解决,请大侠分享一下有没有什么好的方法呢?



always @(posedge  ct)
     begin
         count <=0;
     end

always (posedge clk)
      begin
          count <= count +1'b1;
     end
功能:ct上升沿计数复位,否则不停计数


------解决方案--------------------
你上面的代码通不过编译的。实现你要的功能很简单:用系统快速时钟检测出ct上升沿,形成计数器的异步复位脉冲。VHDL如下:
process (sys_clk)
begin
  if (sys_clk'event and sys_clk ='1') then
      ct_s1 <= ct;
      ct_s2 <=  ct_s1;
  end if;
end

ct_rising_edge <= not ct_s2 and ct_s1;

process (ct_rising_edge, clk)
begin
if ( ct_rising_edge = '1') then
   count <= (others => '0');

elsif (clk'event and clk ='1') then
  count <= count +'1';
 end if;
end

------解决方案--------------------
你这么写是要产生竞争冒险 的   如果要进行两个敏感信号的触发   可以考虑将两个信号触发一个新的敏感信号    然后通过新的敏感信号触发最终的这个变量
------解决方案--------------------
引用:
经常遇到一个变量在两个always 赋值的情况,总是没有很好的方法解决,请大侠分享一下有没有什么好的方法呢?



always @(posedge  ct)
     begin
         count <=0;
     end

always (posedge clk)
      begin
          count <= count +1'b1;
     end
功能:ct上升沿计数复位,否则不停计数

一个变量肯定能在一个always块里写完的,否则就是设计问题了。你这个就是一个复位一个始终,只不过复位信号是上升沿而已,可以写成

rst<=~ct;
always@ (negedge rst or posedge clk)
begin
if (!rst)
count<=0'b0;
else
count<=count+1;
end

verilog很多年没写了,可能有错误

相关内容推荐