Verilog同步状态机
我试图用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
`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用例语句。