24小时联系电话:18217114652、13661815404
中文
行业资讯
有限状态机的初始状态与内存辩论
状态机有几种编码,最流行的是二进制,格雷和一键编码。对于人类而言,选择使用哪种编码是一项艰巨的任务。这就是为什么最好让编译器为您选择此项。
设计中的FSM
现在,您可以使用上述技术来设计Mealy和Moore状态机,一旦掌握了这些技巧,就很有趣,也很有趣。
但是,除了学校的项目外,您真的 需要多久使用一种状态机,该状态机具有我们刚刚设计的那种任意行为?几乎总是!乍一看可能并不明显,但是您可以采用自顶向下的方法将系统描述为一系列状态。此序列可以绘制为状态图,也可以记录为状态表。获得该表示后,您就可以自由编写HDL代码。
注意,在我们的示例中,您可能会或可能不会最终使用诸如y之类的输出变量,这很好,因为许多状态机仅指示系统的行为,并且这种行为可以在专用状态下编写。
初始状态如何?
自传统逻辑集成电路(例如74LSXX TTL和40XX CMOS芯片)问世以来,设置初始状态一直是一个棘手的挑战。那时,您依靠 触发器的“预设” 和“清除”输入,这些输入与某些上电复位信号相关联,因此在上电时始终会设置所需的初始状态。
现在,对于FPGA,是否应在系统中使用复位输入信号来充当此类上电复位信号一直存在争议。带有重置输入的我们的Verilog示例如下所示:
module MyFSM(
input
clk,
input
reset,
input
x,
output
y);
reg [1:0] state;
assign y =
state[1]&state[0]&x;
always @ (negedge
clk)
if
(reset)
state
<= 2’b00; // ...or the initial state you want.
else
case (state)
2'b00:
state <= x?2'b01:2'b00;
2'b01:
state <= x?2'b10:2'b00;
2'b10:
state <= x?2'b11:2'b00;
2'b11:
state <= 2'b00;
endcase
endmodule
之所以引起争议,是因为以下事实:大多数(但不是全部)FPGA将其配置存储器实现为易失性的静态RAM(更好地称为SRAM),并且使用外部非易失性存储设备以强大的功率将配置复制到FPGA中-在启动过程中。此启动过程通常使Verilog初始 块可合成!
这意味着,当您具有某种语言的初始化方法时,可能不需要复位输入信号即可初始化变量。使用原始的Verilog示例,只需要一行代码:
initial state <= 2’b00; //
...或您想要的初始状态。
但是,并非所有的FPGA都将其内部配置存储器实现为SRAM。一些FPGA(如Lattice
MachXO2系列)具有内部非易失性配置存储器,因此无需启动任何东西,从而使初始 块不可用于合成,仅对初始化测试平台模块有效。
通常,初始块无法合成的主要原因是Verilog用于许多目标技术,包括ASIC(没有启动序列)。无论如何,您应该始终考虑遵循FPGA制造商的建议。是否使用复位输入,或者如果您决定偏离,至少找到一个很好的理由。
软处理器中的FSM
您可能知道,所有CPU的控制逻辑在某处都有一个状态机。状态可能具有描述性名称,例如“获取”,“解码”,“执行”和“回写”,或者可以简单地将其视为执行周期,例如周期1,周期2等。关键是,CPU内核是Verilog中FSM令人惊讶的易于实现的应用程序。
如果您希望使用本文中介绍的技术在Verilog中实现软处理器的实现。
首先,用Verilog编写FSM似乎令人生畏,但是如果让综合工具通过将代码作为案例语句输入来帮助您,则可以轻松启动并运行应用程序。