题目链接:https://hdlbits.01xz.net/wiki/Exams/ece241_2013_q4
题目的意思就是输入s表示着当前水位的状态,s1为1就表示水位在s1之上,这时就需要打开两个阀门fr1,fr2,然后如果之前的水阀数量比当前的多,那么dfr就是1,如果比现在的少,那dfr么就是0. 如果水位保持不变呢,dfr也保持不变。由于最低状态只能比当前得多,所以dfr一直都会是1,就算是水位不变,也要保持dfr1是1;同理最高水位一定是比之前的高,所以dfr一直是0.
module top_module (
input clk,
input reset,
input [3:1] s,
output reg fr3,
output reg fr2,
output reg fr1,
output reg dfr
);
//这六种状态分别是什么呢,A表示的是水位低于S1,D表示水位高于S3
//B1表示的是高于S1但是低于S2,同时,dfr是0,相对于B2是用来表示从C状态转换过来的,dfr是1的状态。C1,C2同理
parameter A = 0, B1=1,B2=2,C1=3,C2=4,D=5;
reg[2:0] state, next;
//注意只有这里的always是用的clk,其他的都是星号。
always@(posedge clk)begin
if(reset)
state <= A;
else
state <=next;
end
//这里就是状态转换,注意B1,B2,C1,C2的区别
always@(*)begin
case(state)
A:next <= s[1]?B1:A;
B1:next <= s[2]?C1:(s[1]?B1:A);
B2:next <= s[2]?C1:(s[1]?B2:A);
C1:next <= s[3]?D:(s[2]?C1:B2);
C2:next <= s[3]?D:(s[2]?C2:B2);
D:next <= s[3]?D:C2;
default:next <= A;
endcase
end
//这里是输出结果,根据不同的状态开不同的阀门和赋值不同的dfr
always@(*)begin
case(state)
A: {fr3,fr2,fr1,dfr} = 4'b1111;
B1: {fr3,fr2,fr1,dfr} = 4'b0110;
B2: {fr3,fr2,fr1,dfr} = 4'b0111;
C1: {fr3,fr2,fr1,dfr} = 4'b0010;
C2: {fr3,fr2,fr1,dfr} = 4'b0011;
D: {fr3,fr2,fr1,dfr} = 4'b0000;
default: {fr3, fr2, fr1, dfr} = 'x;
endcase
end
endmodule