我正在尝试生成FSM状态参数或自动。 我尝试了很多方法,似乎没有办法生成我需要的代码。 有人可以帮忙吗?
我需要生成的代码是FSM状态机的一部分,对于ST_DATA_CHECK状态:
always @(posedge ui_clk_sync_rst or posedge ui_clk)
begin
if (rst) begin
s_app_cmd <= 3'b111;
s_app_en <= 1'b0;
end
end else begin
case (ddr3_state)
ST_INIT :
….
ST_DATA_CHECK : // This part of the code, needs to make parameteric
if (~dwfifo_ef[0]) begin
s_data_write_active[0] <= 1'b1 ;
end else if (~dwfifo_ef[1]) begin
s_data_write_active[1] <= 1'b1 ;
end else if (~dwfifo_ef[2]) begin
s_data_write_active[2] <= 1'b1 ;
end else if (~d_rfifo_ef[0]) begin
s_data_read_active[0] <= 1'b1 ;
end else if (~d_rfifo_ef[1]) begin
s_data_read_active[1] <= 1'b1 ;
end
ST_WRITE :
…
endcase
请注意,例如dwfifo_ef [0]和dwfifo_ef [1]位可以同时为0,这就是为什么我需要在这里使用优先级编码器。
欢迎任何有关如何使代码参数化的帮助/想法/建议。
由于 Hayk酒店
答案 0 :(得分:1)
您希望for
循环带有break
语句:
ST_DATA_CHECK :
for (int i=0;i<$bits(dwfifi_ef);i++)
if (~dwfifo_ef[i]) begin
s_data_write_active[i] <= 1'b1 ;
break;
end
答案 1 :(得分:1)
@ dave_59刚刚解决了你的问题,但正如你所说&#34;在我的if语句中有2个信号s_data_write_active和s_data_read_active&#34;,如何尝试类似这个?< / p>
ST_DATA_CHECK :
if (|dwfifo_ef == 1'b1)
for (int i=0;i<$bits(dwfifi_ef);i++)
if (~dwfifo_ef[i]) begin
s_data_write_active[i] <= 1'b1 ;
break;
end
else
for (int i=0;i<$bits(d_rfifo);i++)
if (~d_rfifo[i]) begin
s_data_read_active[i] <= 1'b1 ;
break;
end
(我没有尝试编译,模拟或合成这个,因此我的短语类似。)