有段verilog代码看不懂,是夏宇闻书上的,求大牛指点

//main FSM
always @(posedge sda)
if (scl == 1)
stop_W_R;
else
begin
casex(state)
2'b01: begin

read_in;

if (ctrl_byte == w7 || ctrl_byte == w6 || ctrl_byte == w5
||ctrl_byte == w4 || ctrl_byte == w3 || ctrl_byte == w2
||ctrl_byte == w1 || ctrl_byte ==w0)
begin
state = 2'b10;
write_to_eeprom;
end
else
state = 2'b00;
end
2'b11: read_from_eeprom; // read operation
default:
state = 2'b00;

endcase
end

一开始sda信号上升沿到来,触发这个always块。进入always块后,read in 这个任务会利用sda信号的变化,不断从sda信号读取数据。那么我的问题是,在执行read in 这个任务时,sda 信号会变化就会重新触发这个always块。这样这个read in这个任务可以执行完吗?好像陷入了死锁。大家是怎么理解的,可以解释下吗。先表示感谢

第1个回答  2014-09-04
虽然不太明白你问的是什么?但是我猜你还是和C语言或者matlab里面那种for循环有混淆。HDL里面这些边沿触发都是在某一时刻一次性的,而且也都是寄存器来说的,每次触发重新对寄存器进行一次赋值,然后等待下一次边沿触发,而不是像for循环那种不停执行的。本回答被提问者采纳
第2个回答  2020-06-15
根据条件不同,会转到不同的状态机里去,case state 最终会到stop或者idle状态
相似回答