2021年5月1日 星期六

HBLbits_Verilog Basic_Exams/ece241 2013 q4

 HBLbits_Verilog Basic_Exams/ece241 2013 q4

Also include an active-high synchronous reset that resets the state machine to a state equivalent to if the water level had been low for a long time (no sensors asserted, and all four outputs asserted).

題目內容翻譯:

大型水庫可為多個使用者提供服務。為了使水位足夠高,三個感測器以5英寸的間隔垂直放置。當水位高於最高感測器(S3)時,輸入流量應為零。當液位低於最低感測器(S1)時,流量應最大(標稱流量閥和輔助流量閥均打開)。當水位在上下感測器之間時,流速由兩個因素決定:水位和最後一個感測器變化之前的水位。每種水位都有一個與之相關的標稱流速,如下表所示。如果感測器變化表明先前的液位低於當前的液位,則應進行標稱流速。如果先前的水準高於當前水準,則應通過打開輔助流量閥(由ΔFR控制)來增加流量。

繪製水庫控制器的摩爾模型狀態圖。清楚地指出每個狀態的所有狀態轉換和輸出。 FSM的輸入為S1S2S3。輸出為FR1FR2FR3和ΔFR

 

解題思路

這裡我把四個水閥的狀態合併成一個四位元二進位,根據題目中的提供的資訊,可以得到下面圖中的水閥狀態一共是有S0-S7一共8種,但是S1S6實際上是不存在的狀態,從狀態跳轉圖也可以很清楚看出來是不穩定的。

最主要的是輔助流量閥ΔFR的值,這裡需要注意的是,如果水位從4變到5,即其依舊保持在S2S3之間,這個時候表示感測器其實是沒有探測到水位變化的,所以說ΔFR的值是並不會變化的。

具體的水閥開關和狀態跳轉在下圖中給了明確表示,為了避免看起來複雜,我把每個狀態分開了。雖然S1S6狀態不存在,但是我還是畫出來方便理解。可以看到他們會自動跳轉到S0S7。代碼中我也會列出方便理解。


module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    parameter S0 = 4'b0000;
    parameter S1 = 4'b0001;
    parameter S2 = 4'b0010;
    parameter S3 = 4'b0011;
    parameter S4 = 4'b0110;
    parameter S5 = 4'b0111;
    parameter S6 = 4'b1110;
    parameter S7 = 4'b1111;
    reg [3:0] state,next_state;
     always@(*)begin
        case(state)
            S0: next_state<= (s==7)?S0:(s>=3)?S3:(s>=1)?S5:S7;
            S1: next_state<= (s==7)?S1:(s>=3)?S3:(s>=1)?S5:S7;
            S2: next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S5:S7;
            S3: next_state<= (s==7)?S0:(s>=3)?S3:(s>=1)?S5:S7;
            S4: next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S4:S7;
            S5: next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S5:S7;
            S6: next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S4:S7;
            S7: next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S4:S7;
        endcase
    end
    
    always@(posedge clk)begin
        if(reset)begin
            state <= S7;
        end
        else begin
            state <= next_state;
        end
    end
    assign {fr3,fr2,fr1,dfr} = state;
endmodule

沒有留言:

張貼留言

WOKWI LED + MQTT Node-Red SQLite

WOKWI LED + MQTT Node-Red SQLite const char *mqtt_broker = "broker.mqtt-dashboard.com" ; const char *topic1 = "alex9ufo/e...