本题是一个实际的应用问题,一个水库,有三个传感器S1、S2、S3提供输入,经过控制电路,四个输出给到四个流量阀。也就是说,本题想让我们根据水位去控制流量阀。
问题的关键在于把什么抽象成state,答案是:水位的高低。根据题意,我们知道水位高低有四种状态,可以用传感器检测。
在第一个always块中,把三个传感器输入的值,作为next_state。
在第二个always块中,用next_state判断,输出什么信号给四个流量阀。
在第三个always块中,把next_state赋给state。
在第四个always块中,给dfr赋值。因为dfr第四个水阀判断条件比较特殊,所以不跟另外三个水阀写在一起判断。
cs
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
reg [2:0] state, next_state;
parameter A=3'b111, B=3'b011, C=3'b001, D=3'b000;
//根据输入决定下一个状态
always@(*)begin
case(s)
A: next_state = A;
B: next_state = B;
C: next_state = C;
D: next_state = D;
default: next_state = D;
endcase
end
always@(posedge clk)begin
if(reset)
{fr3,fr2,fr1} <= 3'b111;
else
case(next_state) //这里要想清楚判断条件是state还是next_state
A : {fr3,fr2,fr1} <= 3'b000;
B : {fr3,fr2,fr1} <= 3'b001;
C : {fr3,fr2,fr1} <= 3'b011;
D : {fr3,fr2,fr1} <= 3'b111;
endcase
end
always@(posedge clk)begin
if(reset)
state <= D;
else
state <= next_state;
end
always@(posedge clk)begin
if(reset)
dfr <= 1;
else if(next_state < state)
dfr <= 1;
else if(next_state > state)
dfr <= 0;
else
dfr <= dfr;
end
endmodule