Verilog状态机基于开关输入和按钮按下

时间:2013-11-20 07:56:47

标签: verilog

我遇到了一些实现可合成状态机的问题,以便从我已经实现的几个较低级别的模块输出结果。据我所知,到目前为止我所拥有的结构需要嵌套的始终块,但这在Verilog中无法完成。我不知道如何规避这个问题。

编辑:由于至少有一位同学已将我自己的代码中的相同(且无功能,lol)部分转换为代码而被删除。

2 个答案:

答案 0 :(得分:1)

如果您认为需要嵌套的始终块,那么您可能不会考虑硬件设计,而RTL会从电子组件中抽象出一些必须编写的抽象来代表可能的硬件行为。

always @*表示组合块 always @(posdege clk)表示顺序逻辑,其中输出由触发器驱动。

总是阻止告诉模拟器何时触发模拟块,因为一切都在同时发生,它是全部并行的。模拟器无法知道何时安排这些块中未包含的代码。

您需要always @(posedge KEY[0]always @(posedge KEY[1],其中每个都包含case语句。如果他们不为特定情况做任何事情,则保持或清零当前值。您可以将default:案例作为未指定的所有案例。

<强>更新 关于旋转功能,您应该能够使MSB指示是否为负。 使用>>>保留符号位。您可能需要声明已分配的reg / wire或添加$ signed function

reg signed [msb:0] data_in;

always @(posedge clk) begin
  if (data_in[msb] == 1'b0) begin
    data_out <= data_in <<< 1;
  end
  else begin
    data_out <= data_in >>> 1;
  end
end
// or use $signed(data_in) >>> 1;

答案 1 :(得分:0)

您似乎拥有initial块内的所有内容,因此寻找posedge甚至没有意义。通常,initial块不可合成。

不,你不能嵌套always块,你不应该这样做。 您应该只有一个always @(posedge KEY[1]),其中包含STATE的所有可能分配。您无法在不同的reg块中对相同的always进行分配。请务必使用非阻止分配。

为其他always信号创建其他reg块,理想情况下每个信号使用一个always块。