微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > always结构里面的Count0_out[怎么自动变成敏感变量啊

always结构里面的Count0_out[怎么自动变成敏感变量啊

时间:10-02 整理:3721RD 点击:

always @(Result_en)
begin
if (Result_en == 1)
    Result <= Count0_out[15:0];
else
   Result <= Count0_out[31:16];
end
这样的话,Count0_out一有更新Result 就跟着变化。但是我也没有把Count0_out作为敏感变量,
实际上我希望result_en跳变一次(上升或者下降沿),result变化一次。
附:其他地方的always都是用的上升沿出发,敢问这会有影响嘛。

为什么要这么写?

这个写的是啥啊?在时序电路中推荐非阻塞,组合逻辑为阻塞

改成阻塞式的,结果还是一样啊
always @(Result_en)
begin
if (Result_en == 1)
    Result = Count0_out[15:0];
else
   Result = Count0_out[31:16];
end
Count0_out一有更新Result 就跟着变化。
附:其他地方的always都是用的上升沿出发,敢问这会有影响嘛

解决不了,自己顶一下

Count0_out一有更新Result 就跟着变化。
这句话怎么解释?
你可以按照组合逻辑的写法,把两个输入都放到always里面

是想对Count0_out进行采样保持。不希望result变的太快

小编是不是这个意思?见下面的代码。
always @(Result_en,Count0_out)
begin
if (Result_en == 1)
    Result = Count0_out[15:0];
else
   Result = Count0_out[31:16];
end

想采样保持的话,就得用时序电路了,你现在写的是组合逻辑是瞬时变化的,改成时序电路就OK了
always @ (posedge clk or negedge rst_n)
  if (!rst_n)
   Result <= 16'h0;
   else if (Result_en)
      Result <= Count0_out[15:0];
     else
        Result <= Count0_out[31:16];

Count0_out变化的频率比较高,基本上和clk差不多。
这样的clk作为敏感变量的话,使得result的变化频率和clk一样,就起不到采样保持的作用了。
在result_en高电平时候,result还在不断变化

如果你仅仅是写个逻辑玩玩,想仿真一下,可以这么写:
always@(posedge a or negedge a)
begin
     if (a==1)    b = c[15:0]
     else           b = c[31:16]
end
但是如果你是想写一个真实的电路,那么你可能要从结构上重新考虑。

用synplify 综合一下 看看rtl图就明白了。在敏感信号表里没用用沿触发,综合出来的是个多路复用器。当然是不会保持的。

你这个可以采用计数器解决的嘛 计数周期为你采样的周期

always @ (posedge clk or negedge rst_n)
begin
      if(!rst_n)
        Result_en_d1 <= 1'b0;
      else
        Result_en_d1 <= Result_en;
end
assign Result_en_pos = !Result_en_d1 && Result_en;
assign Result_en_neg = !Result_en && Result_en_d1;
always @ (posedge clk or negedge rst_n)
begin
      if(!rst_n)
             flag <= 1'b0;
      else if (Result_en_pos)
             flag <= 1'b1;
       else if(Result_en_neg)
             flag <= 1'b0;
       else
             flag <= flag;
end
assign Result[15:0] = flag ? Count0_out[15:0] : Count0_out[31:16];

如果Result_en 变化频率很快.
就用下面的:
always @ (posedge Result_en or negedge rst_n)
begin
      if(!rst_n)
       Count0_out_d1[15:0] <= 16'h0000;
      else
        Count0_out_d1[15:0] <= Count0_out[15:0] ;
end
assign Result[15:0] = Result_en ? Count0_out_d1[15:0] : Count0_out[31:16];

12楼正解!
组合逻辑如何实现“保持”?

always @(posedge clk)
begin
   Old_Result_en <= Result_en;
end
always @(posedge clk or posedge rst)
begin
   if(rst==1'b1)   Result <= 0;
   else if((Old_Result_en==1'b0)&(Result_en==1'b1)) Result <= Count0_out[15:0];
   else if((Old_Result_en==1'b1)&(Result_en==1'b0)) Result <= Count0_out[31:16];
   else Result <= Result;
end
Am I right?

1# wufpga
从电路上考虑问题,verilog只是表现形式

zerowel ,您是我的贵人啊!非常感谢
你的第二段程序意思也是Count0_out变换太快的写法。
assign Result[15:0] = Result_en? Count0_out[15:0] : Count0_out[31:16];
和下面这个always的区别到底有多大啊。
always @(Result_en)
begin
    if(Result_en == 1)
      Result = Count0_out_d1[15:0];
     else  
      Result =Count0_out[31:16];
     
end
*/

jerry365说的非常对,最好能够有verilog映射成电路。但是本人的电路知识不是很扎实。

想保持的话就要用时序电路了

可以尝试用always@*的方法解决。或者把count—out[31:0]各位用or敏感链表示出来!

那两段代码尽管写法不一样,但是综合器综合过后的RTL线路是一样的。都是一个二选一的MUX,Result_en当选择线。

最好不这样写,这样子仿真与综合的结果是不一样的,
综合会把所有条件当成敏感量,

以综合后的电路为准

建议使用上升沿或下降沿出发,这么理解,你的results_en相当于使能信号,高有效时,电路相当于是组合逻辑,会实时变化,低时起到保持的效果,是这个意思吧。
如果是这样,你采用下降沿触发不就满足要求了,在高变低的瞬间采样,一个周期的保持时间。
个人建议,仅供参考

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top