1. 程式人生 > >對於狀態機的總結以及Gray碼基本概念

對於狀態機的總結以及Gray碼基本概念

一、狀態機總結

狀態機分為兩種

一種稱為Mealy狀態機,它的時序邏輯輸出不但取決於狀態還取決於輸入;

另外一種稱為Moore狀態機,它的輸出只取決於當前的狀態。實際的設計工作中大部分都是Mealy狀態機。

有限狀態機設計一般步驟:1、邏輯抽象,得出狀態轉換圖;2、狀態化簡;3、狀態分配;4、選定觸發器的型別並求出狀態方程、驅動方程和輸出方程;5、按照方程得出邏輯圖。

1、“111”序列檢測器(米里型)

module fsm111 ( clk,rst,x,z)  ;
input  clk,rst,x;  output  reg z ;
reg[1:0]  state;
parameter  s0=2’b00,s1=2’b01,s2=2’b11;//狀態轉換圖在心中,哈哈

[email protected]
(posedge clk or negedge rst) begin if(!rst) state<=s0; else case(state) s0:begin if(x) state<=s1 ; else state<=s0 ; end s1:begin if(x) state<=s2; else state<=s0 ; end s2:begin if(x) state<=s2 ; else state<=s0 ; end defualt : state<=s0; always @(state) begin case(state) s2: begin if(x) z=1’b1; else z=1’b0; defualt : z=1’b0; end endmodule

2、“101”序列檢測器(摩爾型)

module fsm101 ( clk,rst,x,z)  ;
input  clk,rst,x;  output  reg z ;
reg[1:0]  state,next_state;
parameter  s0=2’b00,s1=2’b01,s2=2’b11,s3=2’b10;//狀態編碼,採用格雷碼

[email protected](posedge clk or negedge rst)
       begin   if(!rst)   state<=s0;
             else      state<=next_state;
       end
       
always(state or x)
begin
case(state)
         s0:begin  if(x)  next_state<=s1 ; 
                  else  next_state<=s0 ; end
         s1:begin  if(x)  next_state<=s1; 
                  else  next_state<=s2 ; end
s2:begin  if(x)  next_state<=s3 ; 
                  else  next_state<=s0 ; end
s3:begin  if(x)  next_state<=s1 ; 
                  else  next_state<=s2 ; end
        default :   state<=s0;
endcase
end

always @(state)
begin  case(state)
        s3:      z=1’b1;
        default:  z=1’b0; 
endcase
end
endmodule

3、“1001”序列檢測器

module fsm1001 ( clk,clr,x,z)  ;
input  clk,clr,x;  output  reg z ;
reg[1:0]  state;
parameter  s0=2’b00,s1=2’b01;
parameter s2=2’b11,s3=2’b10;

always @(posedge clk or posedge clr)
begin  if(clr)  state<=s0;
else  case(state)
s0:begin  if(x) state<=s1 ; 
else  state<=s0 ; end
s1:begin  if(x) state<=s1; 
else  state<=s2 ; end
s2:begin  if(x) state<=s1 ; 
else  state<=s3 ; end
 s3:begin  if(x) state<=s1; 
else  state<=s0 ; end
defualt : state<=s0;

always  @(state)
begin  case(state)
s3: begin  if(x)  z=1’b1;
else  z=1’b0; 
defualt : z=1’b0;
 end
endmodule

二、Gray碼基本概念

1、格雷碼概念
在一組數的編碼中,若任意兩個相鄰的程式碼只有一位二進位制數不同,則稱這種編碼為格雷碼;另外由於最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱迴圈碼或反射碼;

2、優點:
若採用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它程式碼(1100、1111等)。在特定情況下可能導致電路狀態錯誤或輸入錯誤,使用格雷碼可以避免這種錯誤。

3.Gray碼的編碼形式(我們討論四位Gray碼,二位三位方法相同)

十進位制數 4位二進位制碼 四位典型Gray碼
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000