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的輸入為S1,S2和S3。輸出為FR1,FR2,FR3和ΔFR。
解題思路
這裡我把四個水閥的狀態合併成一個四位元二進位,根據題目中的提供的資訊,可以得到下面圖中的水閥狀態一共是有S0-S7一共8種,但是S1和S6實際上是不存在的狀態,從狀態跳轉圖也可以很清楚看出來是不穩定的。
最主要的是輔助流量閥ΔFR的值,這裡需要注意的是,如果水位從4變到5,即其依舊保持在S2與S3之間,這個時候表示感測器其實是沒有探測到水位變化的,所以說ΔFR的值是並不會變化的。
具體的水閥開關和狀態跳轉在下圖中給了明確表示,為了避免看起來複雜,我把每個狀態分開了。雖然S1和S6狀態不存在,但是我還是畫出來方便理解。可以看到他們會自動跳轉到S0和S7。代碼中我也會列出方便理解。
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
沒有留言:
張貼留言