lcytms
发表于 2017-7-24 09:31:56
表示方法之二
我们还可以用另一个 Verilog HDL模型来表示同一个有限状态,
见下例。(用可综合的Verilog模块设计用独热码表示状态的状态机)
modulefsm (Clock, Reset, A,K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg state ;
parameter Idle =4’b1000,
Start =4’b0100,
Stop =4’b0010,
Clear =4’b0001;
lcytms
发表于 2017-7-24 09:33:35
表示方法之二(续)
always @(posedge clock)
if (!Reset)
begin
state <= Idle;K2<=0; K1<=0;
end
else
case (state)
Idle:if (A)begin
state <= Start;
K1<=0;
end
else state <= Idle;
lcytms
发表于 2017-7-24 09:34:56
表示方法之二(续)
Start:if (!A)state <= Stop;
elsestate <= Start;
Stop:if (A) begin
state <= Clear;
K2<= 1;
end
elsestate <= Stop;
Clear:if (!A)begin
state <=Idle;
K2<=0;K1<=1;
end
else state <= Clear;
lcytms
发表于 2017-7-24 09:36:28
表示方法之二(续)
default:state <= Idle;
endcase
endmodule
[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。
lcytms
发表于 2017-7-24 09:39:07
表示方法之三
在比较复杂的状态机设计过程中,我们往往把状态的变化与输出开关的控制分成两部分来考虑。
就象前面讲过的Mealy状态机输出部分的组合逻辑。为了调试方便,还常常把每一个输出开关写成一个个独立的always组合块。
在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。
建议同学们在设计复杂的多输出状态机时采用下面的风格举例,说明如下:
总结:
1、第一个always块描述状态随时钟转换
【state<=nextstate】 <仅与时钟有关>
2、第二个always块描述状态转换路径即下一个状态变为什么状态【nextstate<=??】<与当前状态、控制信号有关>
3、剩余的对各个输出进行单独描述,因为描述的是一个变化的过程,因此需要<当前状态和控制信号,可加入RESET,因为复位也会产生输出>
lcytms
发表于 2017-7-24 09:43:23
表示方法之三(续)
modulefsm (Clock, Reset, A,K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg state, nextstate ;
parameter
Idle =2'b00,
Start =2'b01,
Stop =2'b10,
Clear =2'b11;
lcytms
发表于 2017-7-24 09:45:02
表示方法之三(续)
//-------- 每一个时钟沿产生一次可能的状态变化-----------
always @(posedge Clock)
begin
if (!Reset)
state <= Idle;
else
state <= nextstate;
end
//-------------------------------------------------------
lcytms
发表于 2017-7-24 09:47:02
表示方法之三(续)
//------ 产生下一状态的组合逻辑 -------------------------
always @(state or A)
case (state)
Idle:if (A)
nextstate = Start;
elsenextstate = Idle;
Start:if (!A)nextstate = Stop;
else nextstate = Start;
Stop:if (A)nextstate = Clear;
elsenextstate = Stop;
Clear:if (!A) nextstate = Idle;
else nextstate = Clear;
default:nextstate =2'bxx;
endcase
lcytms
发表于 2017-7-24 09:48:18
表示方法之三(续)
//---- 产生输出K1的组合逻辑 --------------
always @(state or Reset or A)
if (!Reset) K1=0;
else
if (state == Clear && !A)//从Clear转向 Idle
K1=1;
else K1= 0;
//--- 产生输出K2的组合逻辑 ---------------
always @(state or Reset or A )
if (!Reset) K2 = 0;
else
if (state == Stop && A)// 从Stop转向 Clear
K2 = 1;
else K2 = 0;
//------------------------------------------
endmodule
lcytms
发表于 2017-7-24 09:51:14
表示方法之四
用输出指定的码表示状态的状态机
方法四采用了另一种方法:直接把状态码定义为输出。
也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电路器件。
这种设计方法常用在高速状态机中。
建议同学们在设计高速状态机时采用方法四的风格。
例中state 和state分别表示前面两个例子中的输出K2和K1。
页:
1
2
3
4
5
[6]
7
8
9
10
11