Exams/ece241 2013 q4答案解析

时间:2022-07-22
本文章向大家介绍Exams/ece241 2013 q4答案解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目链接: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