您的位置:网站首页 > 电器维修资料网 > 正文 >
Verilog HDL设计之有限状态机的设计原理及其代码风格
来源: 日期:2013-11-3 17:30:05 人气:标签:
由于寄存器传输级(rtl)描述是以时序逻辑抽象所得到的有限状态机为依据的,所以把一个时序逻辑抽象成一个同步有限状态机是设计可综合风格的verilog hdl模块的关键。
在本章中我们将通过各种实例由浅入深地来介绍各种可综合风格的verilog hdl模块,并把重点放在时序逻辑的可综合有限状态机的verilog hdl设计要点。至于组合逻辑,因为比较简单,只需阅读典型的用verilog hdl描述的可综合的组合逻辑的例子就可以掌握。
为了更好地掌握可综合风格,还需要较深入地了解阻塞和非阻塞赋值的差别和在不同的情况下正确使用这两种赋值的方法。只有深入地理解阻塞和非阻塞赋值语句的细微不同,才有可能写出不仅可以仿真也可以综合的verilog hdl模块。
只要按照一定的原则来编写代码就可以保证verilog模块综合前和综合后仿真的一致性。符合这样条件的可综合模块是我们设计的目标,因为这种代码是可移植的,可综合到不同的fpga和不同工艺的asic中,是具有知识产权价值的软核。
4.4.1 有限状态机(fsm)设计原理
有限状态机是由寄存器组和组合逻辑构成的硬件时序电路。有限状态机的状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。
有限状态机的下一个状态不但取决于各个输入值,还取决于当前所在状态。这里指的是米里mealy型有限状态机,而莫尔moore型有限状态机的下一个状态只决于当前状态。
verilog hdl中可以用许多种方法来描述有限状态机, 常用的方法是用always语句和case语句。如图4.1所示的状态转移图表示了一个有限状态机,例4.1的程序就是该有限状态机的多种verilog hdl模型之一。
图4.1的状态转移图表示了一个四状态的有限状态机。它的同步时钟是clock,输入信号是a和reset,输出信号是f和g。
状态的转移只能在同步时钟(clock)的上升沿时发生,往哪个状态的转移则取决于目前所在的状态和输入的信号(reset和a)。下面的例子是该有限状态机的verilog hdl模型之一。
例4.1:gray码有限状态机模型1。
module fsm (clock, reset, a, f, g); //模块声明
input clock, reset, a;
output f,g;
reg f,g;
reg [1:0] state ;
parameter //状态声明
idle = 2’b00, start = 2’b01,
stop = 2’b10, clear = 2’b11;
always @(posedge clock)
if (!reset) begin
state <= idle; f<=0; g<=0; //默认状态
end
else case (state)
idle: begin //idle状态
if (a) begin
state <= start;
g<=0;
end
elsestate <= idle;
end
start: //start状态
if (!a) state <= stop;
else state <= start;
stop: begin //stop状态
if (a) begin
state <= clear;
f <= 1;
end
else state <= stop;
end
clear: begin //clear状态
if (!a) begin
state <=idle;
f <=0; g <=1;
end
else state <= clear;
end
endcase
endmodule
也可以用下面的verilog hdl模型来表示同一个有限状态。
例4.2:独热码有限状态和模型。
module fsm (clock, reset, a, f, g); //模块声明
input clock, reset, a;
output f,g;
reg f,g;
reg [3:0] state ;
parameter //状态声明
idle = 4’b1000,
start = 4’b0100,
stop = 4’b0010,
clear = 4’b0001;
always @(posedge clock)
if (!reset) begin
state <= idle; f<=0; g<=0; //默认状态
end
else case (state)
idle: begin //idel状态
if (a) begin
state <= start;
g<=0;
end
else state <= idle;
end
start: //start状态
if (!a) state <= stop;
else state <= start;
stop: begin //stop状态
if (a) begin
state <= clear;
f <= 1;
end
else state <= stop;
end
clear: begin //clear状态
if (!a) begin
state <=idle;
f<=0; g<=1;
end
else state <= clear;
end
default: state <=idle; //默认状态
endcase
endmodule
例4.2与例4.1的主要不同点是状态编码方式。例4.2采用了独热编码,而例4.1则采用gray码,究竟采用哪一种编码好要看具体情况而定。
- 1
- 2
- 3
- 下一页
【看看这篇文章在百度的收录情况】