1.原题复现
题目链接:Exams/2014 q3fsm
2.思路和代码
根据题意,可以分为两个部分,第一部分为状态机,包括A和B。第二部分为在状态B的时候,需要对另外一个输入进行计数,且三个时钟周期为一循环。因此,第二部分可以细分为:1.需要一个couter用来对三个周期内的输入w进行计数 2.需要一个counter用来对时钟周期次数进行计数,且每记三次后,重新归1开始计数。
刚开始的思路是用的for循环,后来发现不对,因为在一个时钟上升沿里面,for循环3次是不合题意的,题目要求的是在三个时钟周期内计数,而不是一个时钟周期。
module top_module (
input clk,
input reset, // Synchronous reset
input s,
input w,
output z
);
parameter A=0,B=1;
reg state,next_state;
reg [1:0] cout_w,cout_clock;
always@(*)begin
case(state)
A:next_state = s?B:A;
B:next_state = B;
endcase
end
always@(posedge clk)begin
if(reset)begin
state<=A;
end
else begin
state <= next_state;
end
end
always@(posedge clk) begin
if(state==A|reset) begin
cout_w <=0;
cout_clock <=0;
end
else if(state == B)begin
if(cout_clock == 3)begin //这里是 0(1) 1(2) 2(3) 3(1) 1(2) 2(3) 3 1 2 3 括号外是cot_clock的变化
cout_w <= w; // 括号内的意思是这是cout_clock第几次计数
cout_clock <=1;
end
else begin
cout_w <= cout_w+w;
cout_clock <=cout_clock+1;
end
end
end
assign z = (cout_w ==2 )&& (cout_clock ==3); //这里要求cout_clock等于3,是因为输出总是在一个循环内第三次计数后的下一次才会发生变化。
endmodule
参考博客:
Exams/2014 q3fsm_HDLbits详解(merely状态机典型例题)
[HDLbits]——Exams/2014 q3fsm