新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 零基礎學FPGA(七)淺談狀態(tài)機

零基礎學FPGA(七)淺談狀態(tài)機

—— 零基礎學FPGA(八)淺談狀態(tài)機
作者: 時間:2015-01-10 來源:網(wǎng)絡 收藏

  下面是另一種寫法,叫做輸出指定的碼表示狀態(tài)的

本文引用地址:http://butianyuan.cn/article/267960.htm

  //***********************************************************

  //由輸出指定的碼表示狀態(tài)的

  //小墨同學于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; //當前狀態(tài)寄存器

  assign k1 =State[0];

  assign k2 =State[4];

  parameter Idle = 5'b00000, //采用毒熱編碼(每個狀態(tài)只有一個寄存器置位的狀態(tài)機這樣用的組合電路省一些,而且速度也快)

  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) //狀態(tài)判斷與組合邏輯賦值

  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語句已經(jīng)指定了所有狀態(tài),這樣綜合器就會刪除不需要的譯碼電路,使生成的電路簡單

  endcase

  endmodule

  //**************************************************

  這樣寫就是把狀態(tài)碼的指定與狀態(tài)機控制的輸出聯(lián)系起來,把狀態(tài)的變化直接作用于輸出,這樣做可以提高輸出信號的開關素的并節(jié)省電路器件。但這種方法也有缺點,就是快關的維持時間必須與狀態(tài)維持的時間一致,這種設計方法常用在告訴狀態(tài)機中。

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

  //***********************************************************

  //***************************************************

  //多輸出狀態(tài)時的狀態(tài)機

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

  //*********************************************

  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; //每一個時鐘產(chǎn)生一個可能的變化,即時序邏輯部分

  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) //產(chǎn)生輸出k1的組合邏輯

  if(!rst_n) k1=0;

  else if(state ==clear && !A)

  k1=1;

  else k1=0;

  always @(state or A or rst_n) //產(chǎn)生輸出k2的組合邏輯

  if(!rst_n) k2=0;

  else if(state ==stop && A)

  k2=1;

  else k2=0;

  endmodule

  //**************************************************

fpga相關文章:fpga是什么



上一頁 1 2 下一頁

評論


相關推薦

技術專區(qū)

關閉