
有段verilog代码看不懂,是夏宇闻书上的,求大牛指点
//mainFSMalways@(posedgesda)if(scl==1)stop_W_R;elsebegincasex(state)2'b01:beginread_i...
//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这个任务可以执行完吗?好像陷入了死锁。大家是怎么理解的,可以解释下吗。先表示感谢 展开
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这个任务可以执行完吗?好像陷入了死锁。大家是怎么理解的,可以解释下吗。先表示感谢 展开
展开全部
虽然不太明白你问的是什么?但是我猜你还是和C语言或者matlab里面那种for循环有混淆。HDL里面这些边沿触发都是在某一时刻一次性的,而且也都是寄存器来说的,每次触发重新对寄存器进行一次赋值,然后等待下一次边沿触发,而不是像for循环那种不停执行的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询