verilog可综合有限状态机的4种写法(夏文宇书注)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

verilog可综合有限状态机的4种写法(夏文宇书注)

第一种:自然编码

module fsm1(

input i_clk,

input rst_n,

input A,

output reg K1,

output reg K2,

output reg [1:0] state

);

parameter Idle=2'b00,

Start=2'b01,

Stop=2'b10,

Clear=2'b11;

[email=always@(posedge]always@(posedge[/email] i_clk)

if(!rst_n)

begin

state<=Idle;

K2<=0;

K1<=0;

end

else

case(state)

Idle:if(A)

begin

state<=Start;

K1<=0;

end

else

begin

state<=Idle;

K2<=0;

K1<=0;

end

Start:if(!A)

state<=Stop;

else

state<=Start;

Stop:if(A)

begin

state<=Clear;

K2<=1;

else

begin

state<=Stop;

K2<=0;

K1<=0;

end

Clear:if(!A)

begin

state<=Idle;

K1<=1;

K2<=0;

end

else

begin

state<=Clear;

K2<=0;

K1<=1;

end

default:

state<=Idle;

endcase

endmodule

这种大家应该都熟悉的

第二种:采用独热编码,据说其可靠性和速度都不错module fsm2(

input i_clk,

input rst_n,

input A,

output reg K1,

output reg K2,

output reg [3:0] state

);

parameter Idle=4'b1000;

parameter Start=4'b0100;

parameter Stop=4'b0010;

parameter Clear=4'b0001;

always@(posedge i_clk)

begin

if(!rst_n)

state<=Idle;

K2<=0;

K1<=0;

end

else

case(state)

Idle:if(A)

begin

state<=Start;

K1<=0;

end

else

begin

state<=Idle;

K2<=0;

K1<=0;

end

Start:if(!A)

state<=Stop;

else

state<=Start; Stop:if(A)

begin

state<=Clear;

K2<=1;

end

else

begin

state<=Stop;

K1<=0;

K2<=0;

end

Clear:if(!A)

begin

state<=Idle;

K2<=0;

K1<=1;

end

else

begin

state<=Clear;

K2<=0;

K1<=0;

end

default:state<=Idle;

endcase

end

endmodule

第三种:把输出直接指定为状态码,即把状态码的指定和状态机的输出联系起来,状态的变化直接用做输出

据说可以提高输出信号的开关速度并节省电路资源(希望了解其机理的高手们能够解说下时怎样提高开关速度的?)

module fsm3(

input i_clk,

input rst_n,

input A,

output K1,

output K2,

output reg [4:0] state

);

assign K2=state[4];

assign K1=state[0];

parameter Idle =5'b00000;

parameter Start =5'b00010;

parameter Stop =5'b00100;

parameter StopToClear =5'b11000;

parameter Clear =5'b01010;

parameter ClearToIdle =5'b00111;

always@(posedge i_clk)

if(!rst_n)

begin

state<=Idle;

end

相关文档
最新文档