国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

零基礎學FPGA(八)淺談狀態機

發布時間:2015-1-14 14:57    發布者:wp1981
作者:小墨同學

關于狀態機呢,想必大家應該都接觸過,通俗的講就是數電里我們學的狀態轉換圖。狀態機分為兩中類型,一種叫Mealy型,一種叫Moore型。前者就是說時序邏輯的輸出不僅取決于當前的狀態,還取決于輸入,而后者就是時序邏輯的輸出僅僅取決于當前的狀態。下面兩個圖分別表示兩種不同的狀態機。





下面我們就通過代碼來寫一下狀態機,以下面的狀態轉換圖為例



首先,是一種典型的狀態機寫法,這種寫法我們稱為一段時狀態機,用于一些簡單的設計是可以的,但如果是復雜的狀態機,不建議大家用這種寫法。

//***********************************************************
//**********************小墨筆記*****************************
//可綜合的狀態機設計的典型方法

//小墨同學于2014年5月31日在金翰林宿舍作

//實現典型的狀態機設計

//************************小墨筆記,留作回憶**********************

module fsm (clk,rst_n,A,k1,k2,State);

input clk;
input rst_n;
input A;
output k1,k2;
output [1:0] State;
reg k1;
reg k2;
reg [1:0] State;   //當前狀態寄存器

parameter     Idle = 2'b00,
                       Start = 2'b01,
                       Stop = 2'b10,
                       Clear = 2'b11;            //編碼 ,注意,只有在最后一句用分號,其他地方用逗號

always @(posedge clk or negedge rst_n)
  if(!rst_n)  
  begin
     State <= Idle;
k1 <=1'b0;
k2 <=1'b0;
  end
  else case (State)                   //狀態判斷與組合邏輯賦值
  
       Idle :if(A) begin
      State <= Start;
k1 <= 0;
end
else begin
State <= Idle;
k1 <= 0;
k2 <= 0;
end
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 <= Clear;
k2 <= 0;
k1 <= 1;
end
else State <= Clear;
default : State <= 2'bxx;     //告訴綜合器 case語句已經指定了所有狀態,這樣綜合器就會刪除不需要的譯碼電路,使生成的電路簡單
endcase  
endmodule
//************************小墨品牌,你值得擁有~**************************





下面是另一種寫法,叫做輸出指定的碼表示狀態的狀態機




//***********************************************************
//**********************小墨筆記*****************************
//由輸出指定的碼表示狀態的狀態機

//小墨同學于2014年5月21日在金翰林宿舍作

//用于高速狀態機的設計

//************************小墨筆記,留作回憶**********************

module fsm2(clk,rst_n,A,k1,k2,State);
input clk;
input rst_n;
input A;
output k1,k2;
output [4:0] State;
reg [4:0] State;   //當前狀態寄存器
assign k1 =State[0];
assign k2 =State[4];

parameter    Idle = 5'b00000,            //采用毒熱編碼(每個狀態只有一個寄存器置位的狀態機這樣用的組合電路省一些,而且速度也快)
                      Start = 5'b00010,
                      Stop = 5'b00100,
                      StoptoClear = 5'b11000,
                      Clear = 5'b01010,
                     
  CleartoIdle  = 5'b00111;          //編碼 ,注意,只有在最后一句用分號,其他地方用逗號

always @(posedge clk or negedge rst_n)
  if(!rst_n)  
  
     State <= Idle;

  else case (State)                   //狀態判斷與組合邏輯賦值
  
       Idle :if(A)  
      State <= Start;

else
State <= Idle;


Start :if(!A) State <= Stop;
       else State  <=  Start;
Stop  :if(A)
       State <=StoptoClear;


else State <= Stop;
StoptoClear :State <= Stop;

Clear :if(!A)
       State <= Clear;


else State <= Clear;
CleartoIdle :State <= Idle;
default : State <= Idle;//告訴綜合器 case語句已經指定了所有狀態,這樣綜合器就會刪除不需要的譯碼電路,使生成的電路簡單
endcase  

endmodule

//************************小墨品牌,你值得擁有~**************************
這樣寫就是把狀態碼的指定與狀態機控制的輸出聯系起來,把狀態的變化直接作用于輸出,這樣做可以提高輸出信號的開關素的并節省電路器件。但這種方法也有缺點,就是快關的維持時間必須與狀態維持的時間一致,這種設計方法常用在告訴狀態機中。


下面這種寫法應該是以后我們經常要用到的,即三段式狀態機寫法,比較適合于多輸出的狀態機設計。


//***********************************************************
//**********************小墨筆記*****************************
//多輸出狀態時的狀態機

//小墨同學于2014年5月31日在金翰林宿舍作

//用于多輸出時的狀態機設計,也即三段式狀態機的常見寫法,推薦!

//************************小墨筆記,留作回憶**********************
module fsm3 (clk,rst_n,A,k1,k2,state);
input clk,rst_n,A;
output k1,k2;
output [1:0] state;
reg k1,k2;
reg [1:0] state;
reg [1:0] xiaomo;
parameter Idle = 2'b00,
                    start = 2'b01,
                    stop = 2'b10,
                    clear = 2'b11;
always @ (posedge clk or negedge rst_n)   
       if(!rst_n) state <= Idle;
else state <= xiaomo;      //每一個時鐘產生一個可能的變化,即時序邏輯部分



always @ (state or A)      //組合邏輯部分
       begin
case (state)
    Idle : if(A) xiaomo = start;
        else  iaomo = Idle;
start : if(!A)xiaomo = stop;
               else iaomo = start;
stop  : if(A)xiaomo = clear;
            else iaomo = stop;
clear : if(!A) xiaomo =Idle;
               else iaomo = clear;
default : xiaomo = 2'bxx;
     endcase
end
always @ (state or A or rst_n)    //產生輸出k1的組合邏輯
      if(!rst_n) k1=0;
else if(state ==clear && !A)
   k1=1;
else k1=0;
always @(state or A or rst_n)      //產生輸出k2的組合邏輯
      if(!rst_n) k2=0;
else if(state ==stop && A)
    k2=1;
else k2=0;


endmodule  
//************************小墨品牌,你值得擁有~**************************

本文地址:http://www.qingdxww.cn/thread-144621-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩亚洲二区在线 | 久久99精品国产麻豆不卡 | 国产成人亚洲精品2020 | 在线视频 二区 | 国农村精品国产自线拍 | 爱草在线视频 | 精品九九在线 | 国内精品免费 | dizhi91| 日韩手机视频 | 久久这里只有精品任你色 | 九九热在线视频免费观看 | 久久综合丁香激情久久 | 国产aⅴ一区二区 | 欧美成人一区二区三区不卡 | 九九视频在线观看 | 7m视频导航在线视频 | 黄色片免费在线观看视频 | 亚洲精品欧美日本中文字幕 | 羞羞网站在线播放 | 男女网站在线观看 | 色樱桃影院亚洲精品影院 | 四色婷婷婷婷色婷婷开心网 | 久久成人国产精品 | 99久久精品国产麻豆 | 日韩电 影在线播放 | 欧美最爽乱淫视频播放黑人 | 久国产精品久久精品国产四虎 | 日韩一区二区在线播放 | 久久涩视频 | 国内国外精品一区二区 | 人人狠狠综合久久亚洲婷婷 | 日本jizz强视频69视频 | 91色拍| 欧美午夜片 | 亚洲免费在线观看视频 | 麻豆系列 在线视频 | 亚洲国产m3u8在线观看 | 亚洲日本一区二区 | 天天插天天摸 | 韩毛片 |