设计一个具有一个输入X、一个复位输入信号RET和一个输出Z的时钟同步状态机(时钟输入clk),Z=1的条件:连续4个时钟脉冲触发沿X的值为1010。否则Z输出为0。
(1)画出状态图、列出状态表。(2)确定最少使用几个D触发器(3)写出状态分配表(4)写出状态方程、激励法方程和输出方程(5)画出电路图(6)用verilog代码实现并写出测试模块
(1) 状态图和状态表如下:
状态表如下:
状态 | X | RET | 下一状态 | Z |
---|---|---|---|---|
S0 | S0 | 0 | ||
S1 | 0 | S2 | 0 | |
S2 | 1 | S3 | 0 | |
S3 | 0 | S4 | 0 | |
S4 | 1 | S5 | 0 | |
S5 | 0 | S6 | 0 | |
S6 | 1 | S7 | 0 | |
S7 | 0 | S8 | 1 | |
S8 | 0 | S2 | 0 |
其中,S0为初始状态,RET为复位输入信号,Z为输出信号,'next state'表示下一状态。
(2) 最少需要3个D触发器来实现。
(3) 状态分配表如下:
当前状态/Z | D2 | D1 | D0 |
---|---|---|---|
S0/0 | 0 | 0 | 0 |
S1/0 | 0 | 0 | 1 |
S2/0 | 0 | 1 | 0 |
S3/0 | 0 | 1 | 1 |
S4/0 | 1 | 0 | 0 |
S5/0 | 1 | 0 | 1 |
S6/0 | 1 | 1 | 0 |
S7/1 | 1 | 1 | 1 |
S8/0 | 0 | 0 | 1 |
(4) 状态方程、激励函数、输出方程如下:
状态方程:D2=RET&Z&(D1)&(D2)|(RET&(~Z)&D1&D2);
激励函数:D1=X;
输出方程:Z=(D2&(D1)&D0&(RET));
(5) 电路图如下:
(6) Verilog代码如下:
module state_machine(input clk, input X, input RET, output reg Z);
reg [2:0] D;
always @(posedge clk) begin
if (RET) begin
D <= #1 3'b0;
Z <= #1 0;
end else begin
D[2] <= #1 RET&Z&(~D[1])&(~D[2]) | (RET&(~Z)&D[1]&D[2]);
D[1] <= #1 X;
Z <= #1 D[2]&(~D[1])&D[0]&(~RET);
D[0] <= #1 D[1];
end
end
endmodule
测试模块:
module testbench;
reg clk, X, RET;
wire Z;
state_machine uut(clk, X, RET, Z);
initial begin
clk = 0;
X = 0;
RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 RET = 1;
#1 RET = 0;
#1 $finish;
end
always #10 clk = ~clk;
endmodule