题目
地址:HDLBits - 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).
Module Declaration
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
分析
- 三段式状态机,第一段组合逻辑判断状态转移条件,描述状态转移规律;第二段时序逻辑描述状态转移;第三段描述状态输出(可以是组合电路,也可是时序电路)。
- 第一段,本例中,输入s是下一状态的另一种表述,所以直接将s“翻译”成状态即可。
- 第二段:常规写法,reset则重置为s0,否则将next_state赋值给state。
- 第三段第一部分:输出fr3,fr2和fr1的描述,其结果与当前状态有关,将上面图片中表格的water level一栏看作状态,nominal一栏则为输出。
- 第三段第二部分:时序电路描述,在时钟上升沿时刻,next_state的值表述上升沿之后的current level,state的值表述上升沿之后的previous level(时钟沿采样旧值,时钟沿之后next_state和state才更新为新值)。故时钟上升沿时比较两者大小可得到dfr的输出。根据debug的波形,dfr应重置为1。其他情况下dfr保持不变存疑,以符合波形为准。
代码
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
// state definition
parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;
reg [1:0] state,next_state;
// state transition
always @(*) begin
case (s)
3'b000: next_state = s0;
3'b001: next_state = s1;
3'b011: next_state = s2;
3'b111: next_state = s3;
default: next_state = s0;
endcase
end
//
always @(posedge clk) begin
if (reset) begin
state <= s0;
end
else begin
state <= next_state;
end
end
// outputs
always @(*) begin
case (state)
s0: {fr3,fr2,fr1} = 3'b111;
s1: {fr3,fr2,fr1} = 3'b011;
s2: {fr3,fr2,fr1} = 3'b001;
s3: {fr3,fr2,fr1} = 3'b000;
default: {fr3,fr2,fr1} = 3'b111;
endcase
end
always @(posedge clk) begin
if (reset)
dfr <= 1'b1;
else if (state>next_state)
dfr <= 1'b1;
else if (state<next_state)
dfr <= 1'b0;
else
dfr <= dfr;
end
endmodule