Verilog同步状态机

Verilog同步状态机,verilog,state,fsm,Verilog,State,Fsm,我试图用verilog设计这个状态机: 我有: `timescale 1ns/1ns module labEightMachine(y, x,clk,clr) output y; input [1:2] x; input clk, clr; reg [1:2] q; reg y; reg nX; always @ (po

我试图用verilog设计这个状态机:

我有:

   `timescale 1ns/1ns
module labEightMachine(y, x,clk,clr)
        output      y;
        input [1:2] x;
        input       clk, clr;
        reg [1:2]   q;
        reg         y;
        reg         nX;
        always @ (posedge clk)
            begin
            if(clr)
                {q}<=2'b00;

            else
                q<= {nX}
            end
        always @(y,x)
        begin
        if(q==2'b00)
            if(x==2'b00)
                q<=2'b00;
            else
                q<=2'b01;
                y<=1;
        if(q==2'b01)
            if((x==2'b00)||(x==2'b01))
                q<=2'b00;
                y<=0;
            else
                q<=2'b11;
                y<=0;
        if(q==2'b11)
            if(x==2'b10)
                q<=2'b10;
                y<=1;
            else
                q<=2'b00;
                y<=0;
        if(q==2'b10)
            q<=2'b00;
                y<=0;
        end
endmodule
`时标1ns/1ns
模块标签机(y、x、clk、clr)
输出y;
输入[1:2]x;
输入时钟,clr;
reg[1:2]q;
注册y;
reg-nX;
始终@(posedge clk)
开始
如果(clr)

{q} 应用刺激始终是检查代码的更好方法。撇开分号/begin-end的语法错误以及所有这些,我可以看到以下几个直接的逻辑错误

声明
reg nX
声明一个单位宽度的变量。相反,
q
被声明为
reg[1:2]q
,宽度为两位

其次,
q
由两个始终块驱动。如果
clr
较低,则
q
nX
驱动。而,
nX
从不由任何信号驱动。因此,在大多数情况下,输出将是
x
(离开那些竞争条件)。多个驱动程序问题

第三,最好使用
if--else-if--else
梯形图,而不是多个
if
s。这将使下一状态逻辑清晰

更好的FSM可能有两个
始终
块和一个输出逻辑块。一个用于顺序逻辑,另一个用于组合逻辑。顺序块用于用下一个_状态值更新当前_状态值。而组合块用于根据输入更新下一状态值。输出逻辑必须具有单独的连续赋值块或程序块

另外,在下一个状态逻辑中使用
case
语句可能会很方便。当单个FSM中有太多状态相互作用时,这将非常有用。在case语句中使用默认值是不可避免的


有关高效FSM编码样式的更多信息,请参阅纸张和纸张。

有关更易于理解的FSM用例语句。