集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

Verilog HDL 夏宇闻--数字系统设计的核心知识

[复制链接]
 楼主| lcytms 发表于 2017-7-24 09:31:56 | 显示全部楼层
表示方法之二

我们还可以用另一个 Verilog HDL模型来表示同一个有限状态,
见下例。(用可综合的Verilog模块设计用独热码表示状态的状态机)

module  fsm (Clock, Reset, A,  K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg [3:0] state ; 
parameter    Idle     =  4’b1000,  
             Start    =  4’b0100,  
             Stop     =  4’b0010,
             Clear    =  4’b0001;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 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;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:34:56 | 显示全部楼层
表示方法之二(续)

    Start:  if (!A)  state <= Stop;
               else  state <= Start;
     Stop:  if (A) begin
                     state <= Clear;
                         K2<= 1;
                    end
              else  state <= Stop;
     Clear:  if (!A)  begin  
                        state <=Idle;
                        K2<=0;  K1<=1;
                      end
               else   state <= Clear;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:36:28 | 显示全部楼层
表示方法之二(续)

          default:  state <= Idle;
     endcase
endmodule
&#160;
[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:39:07 | 显示全部楼层
表示方法之三

在比较复杂的状态机设计过程中,我们往往把状态的变化与输出开关的控制分成两部分来考虑。
就象前面讲过的Mealy状态机输出部分的组合逻辑。为了调试方便,还常常把每一个输出开关写成一个个独立的always组合块。
在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。
建议同学们在设计复杂的多输出状态机时采用下面的风格举例,说明如下:
总结:
        1、第一个always块描述状态随时钟转换
                【state<=nextstate】 <仅与时钟有关>
        2、第二个always块描述状态转换路径即下一个状态变为什么状态【nextstate<=??】<与当前状态、控制信号有关>
        3、剩余的对各个输出进行单独描述,因为描述的是一个变化的过程,因此需要<当前状态和控制信号,可加入RESET,因为复位也会产生输出>

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:43:23 | 显示全部楼层
表示方法之三(续)

module  fsm (Clock, Reset, A,  K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg [1:0] state, nextstate ;
&#160;
parameter   
Idle     =  2'b00,  
Start    =  2'b01,  
Stop     =  2'b10,
Clear    =  2'b11;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:45:02 | 显示全部楼层
表示方法之三(续)

//-------- 每一个时钟沿产生一次可能的状态变化-----------
always @(posedge Clock)
  begin
     if (!Reset)
            state <= Idle;
    else
        state <= nextstate;
  end
//-------------------------------------------------------

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:47:02 | 显示全部楼层
表示方法之三(续)

//------ 产生下一状态的组合逻辑 -------------------------      
always @(state or A)
     case (state)
        Idle:  if (A)   
                 nextstate = Start;      
                else  nextstate = Idle;
       Start:  if (!A)  nextstate = Stop;
                  else   nextstate = Start;
       Stop:  if (A)  nextstate = Clear;
                else  nextstate = Stop;
       Clear:  if (!A)   nextstate = Idle;
                else   nextstate = Clear;
      default:  nextstate =2'bxx;
  endcase

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 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
&#160;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-7-24 09:51:14 | 显示全部楼层
表示方法之四
用输出指定的码表示状态的状态机


方法四采用了另一种方法:直接把状态码定义为输出。
也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电路器件。
这种设计方法常用在高速状态机中。
建议同学们在设计高速状态机时采用方法四的风格。
例中state[3] 和state[0]分别表示前面两个例子中的输出K2和K1。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-4-25 14:40 , Processed in 0.069284 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表