在Verilog中使用2D数组作为转换表实现一个状态机



我正在尝试在Verilog中实现一个非常简单的Mealy状态机。我已经用caseif语句完成了它,但为了清晰起见,我希望能够使用2D数组作为过渡表做同样的事情。

代码如下:

module ex10_1_2(
// output
output reg o,

// debug output to see the current state
output [1:0] s,

// input, clk signal
input i, clk);

// states
localparam A = 2'b00, B=2'b01, C = 2'b10, D = 2'b11;

// transition table
reg [3:0] ttable [1:0][2:0];

// current state
reg [1:0] cs;

initial begin

// initial values: state A, output 0.
cs <= A;
o <= 0;

// curr. state|input|next st.|output
ttable[A][0] = {B, 1'b0};
ttable[A][1] = {A, 1'b1};
ttable[B][0] = {C, 1'b1};
ttable[B][1] = {A, 1'b0};
ttable[C][0] = {D, 1'b0};
ttable[C][1] = {C, 1'b0};
ttable[D][0] = {A, 1'b1};
ttable[D][1] = {C, 1'b0};
end

always @ (posedge clk)
begin
cs <= ttable[cs][i][2:1];
o <= ttable[cs][i][0];
end

assign s = cs;

endmodule

可以看到,转换表是4行* 2列。每个cell包含3位,2个msb表示下一个状态,LSB是下一个输出。

我已经尝试了阻塞和非阻塞分配的实现,但它仍然不起作用。

我使用EPWave和EDAPlayground与Icarus Verilog作为模拟器。我得到的是o(输出)大部分时间是不确定的,r(这是用于查看内部电流状态的调试线,如0,1,2,X,并在模拟的其余部分保持在X中)

我错过了什么?

PD。:模拟

这里是一个链接,应该允许您模拟代码:edaplayground。注意这里有两个模块:第一个是case/if模块,它已经可以工作了。我要调试的模块是ex10_1_2

我用下面的语句替换了矩阵声明:

reg [2:0] ttable [3:0][1:0];

似乎我有一个出界错误,因为以前的[1:0]。我很困惑,因为我认为我有足够的2位,因为这是国家代码所需要的。然而,这是一个数组索引,因此我需要4个位置,每个状态一个。

最新更新