写了个状态机,我在倒数第二个状态对reg赋值,倒数第一个状态自循环,不赋值,发现reg并不能一直保持那个值(仿真可以,下载到板子上用led显示为全1,原来赋值是10101010)
请问标题的问题,和怎样做才是正确做法?
如果我在倒数第一个状态也对其赋值,他就可以保持我把RTL图看了一遍,reg被综合成锁存器,只在指定的状态时允许修改其值(~ENA = 0),然而我发现这个没有起作用,锁存器一直被赋值,是我看错了么
编译后变量被解释成锁存器,ENA的输入是与状态相关的组合逻辑,按照其逻辑,倒数第一个状态的时候是低电平,也就是数据被锁存。但实际测试中值改变了,不知道是不是和竞争冒险有关
编译后查看RTL Viewer,变量被解释成锁存器,d表示数据,ena是使能端,Q输出。按照大图中说法,倒数第二个状态是ENA = 1,vdl是可以被改变的;倒数第一个状态时ENA=0不可改变,但从试验中发现他是会改变的,现在我想到的是竞争与冒险,不知道是不是这样一回事
能看看你的case语句具体怎么写的吗?
例如:
always @ ( posedge clk or negedge rst)
if (!rst)
state <= 2'b00;
else
state <= next_state;
always @ (*)
begin
case (state)
2'b00: next_state = 2'b01;
2'b01: next_state = 2'b10;
2'b10: next_state = 2'b11;
2'b11:next_state = 2'b00;
endcase
end
always @ (*)
begin
case (state)
2'b00: out_led = 8'b00000000;
2'b01: out_led = 8'b00000000;
2'b10: out_led = 8'b10101010;
2'b11: out_led = 8'b10101010;
endcase
end