Problem 120 Fsm2
这是一个具有两个状态、两个输入和一个输出的摩尔状态机。实现这个状态机。这个练习与fsm2s相同,但是使用异步重置。
module top_module(
input clk,
input areset, // Asynchronous reset to OFF
input j,
input k,
output out); //
parameter OFF=0, ON=1;
reg state, next_state;
always @(*) begin
// State transition logic
case(state)
OFF:next_state=j?ON:OFF;
ON:next_state=k?OFF:ON;
endcase
end
always @(posedge clk, posedge areset) begin
// State flip-flops with asynchronous reset
if(areset)
state<=OFF;
else
state<=next_state;
end
// Output logic
assign out = (state == ON);
endmodule
Problem 121 Fsm2s
这是一个具有两个状态、两个输入和一个输出的摩尔状态机。实现这个状态机。这个练习与fsm2相同,但是使用同步重置。
module top_module(
input clk,
input reset, // Synchronous reset to OFF
input j,
input k,
output out); //
parameter OFF=0, ON=1;
reg state, next_state;
always @(*) begin
// State transition logic
case(state)
OFF:next_state=j?ON:OFF;
ON:next_state=k?OFF:ON;
endcase
end
always @(posedge clk) begin
// State flip-flops with synchronous reset
if(reset)
state<=OFF;
else
state<=next_state;
end
// Output logic
assign out = (state == ON);
endmodule
Problem 122 Fsm3comb
下面是具有一个输入、一个输出和四个状态的Moore状态机的状态转换表。使用以下状态编码:A=2'b00, B=2'b01, C=2'b10, D=2'b11。
仅为此状态机实现状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态(state),根据状态转换表计算next_state和输出(out)。
module top_module(
input in,
input [1:0] state,
output [1:0] next_state,
output out); //
parameter A=2'b00, B=2'b01, C=2'b10, D=2'b11;
always @(*)
begin
case(state)
A:next_state=in?B:A;
B:next_state=in?B:C;
C:next_state=in?D:A;
D:next_state=in?B:C;
endcase
end
assign out=(state==D);
// State transition logic: next_state = f(state, in)
// Output logic: out = f(state) for a Moore state machine
endmodule
Problem 123 Fsm3onehot
下面是具有一个输入、一个输出和四个状态的Moore状态机的状态转换表。使用以下单热状态编码:A=4'b0001, B=4'b0010, C=4'b0100, D=4'b1000。
通过假设单热编码的检验,推导出状态转换和输出逻辑方程。仅为此状态机实现状态转换逻辑和输出逻辑(组合逻辑部分)。(测试台架将使用非一个热输入进行测试,以确保您没有尝试做更复杂的事情)。
独热编码:对于n个状态采用n个bit位编码,每个状态编码中只有一个bit位为1;如:0001,0010,0100,1000,增加了触发器的个数,但方便译码。
module top_module(
input in,
input [3:0] state,
output [3:0] next_state,
output out); //
parameter A=0, B=1, C=2, D=3;
// State transition logic: Derive an equation for each state flip-flop.
assign next_state[A] =(state[A]|state[C])&in==1'b0;
assign next_state[B] =(state[A]|state[B]|state[D])&in==1'b1;
assign next_state[C] =(state[B]|state[D])&in==1'b0;
assign next_state[D] =state[C]&in==1'b1;
// Output logic:
assign out = state[D];
endmodule
Problem 124 Fsm3
另请参见:此FSM的状态转换逻辑
下面是具有一个输入、一个输出和四个状态的Moore状态机的状态转换表。实现这个状态机。包括异步重置,将FSM重置到状态A。
module top_module(
input clk,
input in,
input areset,
output out); //
parameter A=2'b00,B=2'b01,C=2'b10,D=2'b11;
reg [1:0]state,next_state;
// State transition logic
always@(*)
begin
case(state)
A:next_state=in?B:A;
B:next_state=in?B:C;
C:next_state=in?D:A;
D:next_state=in?B:C;
endcase
end
// State flip-flops with asynchronous reset
always @(posedge clk,posedge areset)
begin
if(areset)
state<=A;
else
state<=next_state;
end
// Output logic
assign out=state==D;
endmodule
Problem 125 Fsm3s
这是与Fsm3相同的问题,但是是同步复位
module top_module(
input clk,
input in,
input reset,
output out); //
parameter A=2'b00,B=2'b01,C=2'b10,D=2'b11;
reg [1:0]state,next_state;
// State transition logic
always@(*)
begin
case(state)
A:next_state=in?B:A;
B:next_state=in?B:C;
C:next_state=in?D:A;
D:next_state=in?B:C;
endcase
end
// State flip-flops with asynchronous reset
always @(posedge clk)
begin
if(reset)
state<=A;
else
state<=next_state;
end
// Output logic
assign out=state==D;
endmodule
Problem 126 水库
题目内容翻译:
大型水库可为多个用户提供服务。为了使水位足够高,三个传感器以5英寸的间隔垂直放置。当水位高于最高传感器(S3)时,输入流量应为零。当液位低于最低传感器(S1)时,流量应最大(标称流量阀和辅助流量阀均打开)。当水位在上下传感器之间时,流速由两个因素决定:水位和最后一个传感器变化之前的水位。每种水位都有一个与之相关的标称流速,如下表所示。如果传感器变化表明先前的液位低于当前的液位,则应进行标称流速。如果先前的水平高于当前水平,则应通过打开辅助流量阀(由ΔFR控制)来增加流量。
绘制水库控制器的摩尔模型状态图。清楚地指出每个状态的所有状态转换和输出。 FSM的输入为S1,S2和S3。输出为FR1,FR2,FR3和ΔFR。
注意:reset高电平同步重置,它将状态机重置到与水位长时间处于低电平状态相等的状态。
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
parameter W_L=2'b00,W_M1=2'b01,W_M2=2'b10,W_H=2'b11;
reg [1:0] state;
wire [1:0] next_state;
reg state_lower;//判断dfr状态
wire [3:1] S={s[3],s[2],s[1]};
reg [2:0] out_fr;
//同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
always@(posedge clk)
begin
if(reset)
begin
state<=W_L;
// dfr<=1'b0;
end
else
begin
state<=next_state;
// if(state==W_L||state>next_state)
// dfr<=1'b1;
// else dfr<=1'b0;
end
end
//组合逻辑always模块,描述状态转移条件判断
always @(state,S)
begin
case(state)
W_L:
case(S)
3'b000:next_state=W_L;
3'b001:next_state=W_M1;
3'b011:next_state=W_M2;
3'b111:next_state=W_H;
default:next_state=W_L;
endcase
W_M1:
case(S)
3'b000:next_state=W_L;
3'b001:next_state=W_M1;
3'b011:next_state=W_M2;
3'b111:next_state=W_H;
default:next_state=W_M1;
endcase
W_M2:
case(S)
3'b000:next_state=W_L;
3'b001:next_state=W_M1;
3'b011:next_state=W_M2;
3'b111:next_state=W_H;
default:next_state=W_M2;
endcase
W_H:
case(S)
3'b000:next_state=W_L;
3'b001:next_state=W_M1;
3'b011:next_state=W_M2;
3'b111:next_state=W_H;
default:next_state=W_H;
endcase
endcase
end
//同步时序always模块,格式化描述次态寄存器输出
always @(posedge clk)
if(reset)
out_fr<=3'b111;
else
case(next_state)//次态寄存器
W_L: out_fr<=3'b111;
W_M1:out_fr<=3'b011;
W_M2:out_fr<=3'b001;
W_H: out_fr<=3'b000;
endcase
always @(posedge clk)begin
if (reset || state > next_state)
state_lower <= 1'b1;
else if (state < next_state)
state_lower <= 1'b0;
end
assign dfr =state_lower;
assign fr3=out_fr[2];
assign fr2=out_fr[1];
assign fr1=out_fr[0];
endmodule