关于verilog 中always块的总线与敏感列表问题

2024-11-05 16:33:50
推荐回答(1个)
回答1:

你这个key_out跟你那个sum_in是两个信号。
always的模块有两种用法,一个是时序logic,在时延posedge 或者是negedge来的时候,进行相关的工作。需要注意的时候,这个logic在实际电路上只能是一个d触发器,所以只能有一个时钟。另外一个是组合logic,在这种情况下,那个敏感列表是可以有多个信号的,但是不能是单独检查某个信号的posedge或者是negedge。做组合logic的话,你还需要注意敏感列表和下面的logic是有关系的,因为组合logic就是当信号有变化的时候,引起输出变化。
回到你说的第一个没有问题的情况,综合器把你的电路认为是一个时序logic,而key_out【1】就是相应的时钟。对于你第二个情况的话,综合器就没法处理了,因为d触发器只有一个时钟信号。
从你的描述,我觉得你其实是希望做一个时序logic,我觉得你可以考虑先用一个时钟去采样key_out[0]和key_out【1】的上升沿,然后利用那个信号驱动sum_in 增加。
always @(posedge clk)begin
key_out_b[1] <=key_out[1];
key_out_b[0] <=key_out[0];
end
always @(posedge clk)begin
if ((key_out_b[1] !=key_out[1]) and (key_out[1] ==1) and (key_out[0] ==0))
sum <=sum+1;//key_out[1] 上升沿加1
else if ((key_out_b[0] !=key_out[0]) and (key_out[0] ==1) and (key_out[1] ==0))
sum <=sum+1; //key_out[0] 上升沿加1
else if ((key_out_b[0] !=key_out[0]) and (key_out[0] ==1) and (key_out_b[1] !=key_out[1]) and (key_out[1] ==1))
sum <=sum+2; //两个信号同时都变化时,加2
end