always结构里面的Count0_out[怎么自动变成敏感变量啊
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相当于使能信号,高有效时,电路相当于是组合逻辑,会实时变化,低时起到保持的效果,是这个意思吧。
如果是这样,你采用下降沿触发不就满足要求了,在高变低的瞬间采样,一个周期的保持时间。
个人建议,仅供参考
