关注 望森FPGA 查看更多FPGA资讯
这是望森的第 20 期分享
作者 | 望森
来源 | 望森FPGA
目录
[1 Q6b: FSM next-state logic | Q6b:FSM 下一状态逻辑](#1 Q6b: FSM next-state logic | Q6b:FSM 下一状态逻辑)
[2 Q6c: FSM one-hot next-state logic | Q6c:FSM 独热下一状态逻辑](#2 Q6c: FSM one-hot next-state logic | Q6c:FSM 独热下一状态逻辑)
[3 Q6: FSM](#3 Q6: FSM)
[4 Q2a: FSM](#4 Q2a: FSM)
[5 Q2b: One-hot FSM equations| Q2b:独热 FSM 方程](#5 Q2b: One-hot FSM equations| Q2b:独热 FSM 方程)
[6 Q2a: FSM](#6 Q2a: FSM)
[7 Q2b: Another FSM | Q2b:另一个 FSM](#7 Q2b: Another FSM | Q2b:另一个 FSM)
本文中的代码都能够正常运行,请放心食用😋~
练习的官方网站是:https://hdlbits.01xz.net/
注:作者将每个练习的知识点都放在了题目和答案之后
1 Q6b: FSM next-state logic | Q6b:FSM 下一状态逻辑
题目:
考虑下面所示的状态机,它有一个输入 w 和一个输出 z。
假设您希望使用三个触发器和状态代码 y[3:1] = 000、001、...、101 分别实现 FSM,分别表示状态 A、B、...、F。显示此 FSM 的状态分配表。为触发器 y[2] 推导下一状态表达式。
仅为 y[2] 实现下一状态逻辑。(这更像是一个 FSM 问题,而不是 Verilog 编码问题。)
答案:
module top_module (
input [3:1] y,
input w,
output Y2);
parameter A = 3'b000;
parameter B = 3'b001;
parameter C = 3'b010;
parameter D = 3'b011;
parameter E = 3'b100;
parameter F = 3'b101;
reg [3:1] next_state;
wire A2B,A2A;
wire B2C,B2D;
wire C2E,C2D;
wire D2F,D2A;
wire E2E,E2D;
wire F2C,F2D;
//状态跳转控制
always @(*) begin
case(y)
A : begin
if (A2B)begin
next_state = B;
end
else if (A2A)begin
next_state = A;
end
end
B : begin
if (B2C)begin
next_state = C;
end
else if (B2D)begin
next_state = D;
end
end
C : begin
if (C2E)begin
next_state = E;
end
else if (C2D)begin
next_state = D;
end
end
D : begin
if (D2F)begin
next_state = F;
end
else if (D2A)begin
next_state = A;
end
end
E : begin
if (E2E)begin
next_state = E;
end
else if (E2D)begin
next_state = D;
end
end
F : begin
if (F2C)begin
next_state = C;
end
else if (F2D)begin
next_state = D;
end
end
default next_state = A;
endcase
end
//状态跳转控制条件
assign A2B = w == 0;
assign A2A = w == 1;
assign B2C = w == 0;
assign B2D = w == 1;
assign C2E = w == 0;
assign C2D = w == 1;
assign D2F = w == 0;
assign D2A = w == 1;
assign E2E = w == 0;
assign E2D = w == 1;
assign F2C = w == 0;
assign F2D = w == 1;
//输出信号赋值
always @(*) begin
Y2 = next_state[2];
end
endmodule
2 Q6c: FSM one-hot next-state logic | Q6c:FSM 独热下一状态逻辑
题目:
考虑下面所示的状态机,它有一个输入 w 和一个输出 z。
对于此部分,假设使用独热码,状态分配为 'y[6:1] = 000001、000010、000100、001000、010000、100000,分别表示状态 A、B、...、F。
为下一状态信号 Y2 和 Y4 编写逻辑表达式。(通过检查得出逻辑方程,假设独热编码。测试台将使用非独热输入进行测试,以确保您不会尝试执行更复杂的操作)。
答案:
module top_module (
input [6:1] y,
input w,
output Y2,
output Y4);
//y[1] = A;
//y[2] = B;
//y[3] = C;
//y[4] = D;
//y[5] = E;
//y[6] = F;
reg [6:1] next_state;
//状态跳转控制
always @(*) begin
next_state[1] = (y[1] && w == 1) || (y[4] && w == 1);
next_state[2] = (y[1] && w == 0);
next_state[3] = (y[2] && w == 0) || (y[6] && w == 0);
next_state[4] = (y[2] && w == 1) || (y[3] && w == 1) ||
(y[5] && w == 1) || (y[6] && w == 1);
next_state[5] = (y[5] && w == 0) || (y[3] && w == 0);
next_state[6] = (y[4] && w == 0);
end
//输出信号赋值
always @(*) begin
Y2 = next_state[2];
Y4 = next_state[4];
end
endmodule
3 Q6: FSM
题目:
考虑下面所示的状态机,它有一个输入 w 和一个输出 z。
实现状态机。
答案:
module top_module (
input clk,
input reset, // synchronous reset
input w,
output z);
parameter A = 3'b000;
parameter B = 3'b001;
parameter C = 3'b010;
parameter D = 3'b011;
parameter E = 3'b100;
parameter F = 3'b101;
reg [2:0] state, next_state;
wire A2B,A2A;
wire B2C,B2D;
wire C2E,C2D;
wire D2F,D2A;
wire E2E,E2D;
wire F2C,F2D;
//状态跳转
always @(posedge clk) begin
if(reset)begin
state <= A;
end
else begin
state <= next_state;
end
end
//状态跳转控制
always @(*) begin
case(state)
A : begin
if (A2B)begin
next_state = B;
end
else if(A2A)begin
next_state = A;
end
end
B : begin
if (B2C)begin
next_state = C;
end
else if(B2D)begin
next_state = D;
end
end
C : begin
if (C2E)begin
next_state = E;
end
else if(C2D)begin
next_state = D;
end
end
D : begin
if (D2F)begin
next_state = F;
end
else if(D2A)begin
next_state = A;
end
end
E : begin
if (E2E)begin
next_state = E;
end
else if(E2D)begin
next_state = D;
end
end
F : begin
if (F2C)begin
next_state = C;
end
else if(F2D)begin
next_state = D;
end
end
default next_state = A;
endcase
end
//状态跳转控制条件
assign A2B = w == 0;
assign A2A = w == 1;
assign B2C = w == 0;
assign B2D = w == 1;
assign C2E = w == 0;
assign C2D = w == 1;
assign D2F = w == 0;
assign D2A = w == 1;
assign E2E = w == 0;
assign E2D = w == 1;
assign F2C = w == 0;
assign F2D = w == 1;
//输出信号
assign z = (state == E) || (state == F);
endmodule
4 Q2a: FSM
题目:
考虑下面显示的状态图。
编写表示此 FSM 的完整 Verilog 代码。使用单独的 always 块表示状态表和状态触发器,如课程中所做的那样。使用连续赋值语句或 always 块(由您自行决定)描述 FSM 输出(称为 z)。分配您希望使用的任何状态代码。
答案:
module top_module (
input clk,
input reset, // synchronous reset
input w,
output z);
parameter A = 3'b000;
parameter B = 3'b001;
parameter C = 3'b010;
parameter D = 3'b011;
parameter E = 3'b100;
parameter F = 3'b101;
reg [2:0] state, next_state;
wire A2A,A2B;
wire B2D,B2C;
wire C2D,C2E;
wire D2A,D2F;
wire E2D,E2E;
wire F2D,F2C;
//状态跳转
always @(posedge clk) begin
if(reset)begin
state <= A;
end
else begin
state <= next_state;
end
end
//状态跳转控制
always @(*) begin
case(state)
A : begin
if (A2A)begin
next_state = A;
end
else if(A2B)begin
next_state = B;
end
end
B : begin
if (B2D)begin
next_state = D;
end
else if(B2C)begin
next_state = C;
end
end
C : begin
if (C2D)begin
next_state = D;
end
else if(C2E)begin
next_state = E;
end
end
D : begin
if (D2A)begin
next_state = A;
end
else if(D2F)begin
next_state = F;
end
end
E : begin
if (E2D)begin
next_state = D;
end
else if(E2E)begin
next_state = E;
end
end
F : begin
if (F2D)begin
next_state = D;
end
else if(F2C)begin
next_state = C;
end
end
default next_state = A;
endcase
end
//状态跳转控制条件
assign A2A = w == 0;
assign A2B = w == 1;
assign B2D = w == 0;
assign B2C = w == 1;
assign C2D = w == 0;
assign C2E = w == 1;
assign D2A = w == 0;
assign D2F = w == 1;
assign E2D = w == 0;
assign E2E = w == 1;
assign F2D = w == 0;
assign F2C = w == 1;
//输出信号
assign z = (state == E) || (state == F);
endmodule
5 Q2b: One-hot FSM equations| Q2b:独热 FSM 方程
题目:
该问题的状态图如下所示。
假设使用独热编码,状态分配为 y[5:0] = 000001(A)、000010(B)、000100(C)、001000(D)、010000(E)、100000(F)
为信号 Y1 写一个逻辑表达式,它是状态触发器 y[1] 的输入。
为信号 Y3 写一个逻辑表达式,它是状态触发器 y[3] 的输入。
(通过检查得出逻辑方程,假设使用独热编码。测试台将使用非独热输入进行测试,以确保您没有尝试执行更复杂的事情)。
答案:
module top_module (
input [5:0] y,
input w,
output Y1,
output Y3
);
//y[0] = A;
//y[1] = B;
//y[2] = C;
//y[3] = D;
//y[4] = E;
//y[5] = F;
reg [5:0] next_state;
//状态跳转控制
always @(*) begin
next_state[0] = (y[0] && w == 0) || (y[3] && w == 0);
next_state[1] = (y[0] && w == 1);
next_state[2] = (y[1] && w == 1) || (y[5] && w == 1);
next_state[3] = (y[1] && w == 0) || (y[2] && w == 0) ||
(y[4] && w == 0) || (y[5] && w == 0);
next_state[4] = (y[2] && w == 1) || (y[4] && w == 1);
next_state[5] = (y[3] && w == 1);
end
//输出信号赋值
always @(*) begin
Y1 = next_state[1];
Y3 = next_state[3];
end
endmodule
知识点:
提示:通过查看状态转换图的入边,可以推导出独热状态转换逻辑的逻辑方程。
注意:本题的信号声明为"input [5:0] y"。
6 Q2a: FSM
题目:
思考下面所示的状态图描述的 FSM:
此 FSM 充当仲裁电路,控制三个请求设备对某种资源的访问。每个设备通过设置信号 r[i] = 1 来请求资源,其中 r[i] 是 r[1]、r[2] 或 r[3]。每个 r[i] 都是 FSM 的输入信号,代表三个设备之一。只要没有请求,FSM 就保持在状态 A。当发生一个或多个请求时,FSM 决定哪个设备获得使用资源的授权,并切换到将该设备的 g[i] 信号设置为 1 的状态。每个 g[i] 都是 FSM 的输出。有一个优先级系统,其中设备 1 的优先级高于设备 2,而设备 3 的优先级最低。因此,例如,当 FSM 处于状态 A 时,如果设备 3 是唯一发出请求的设备,则设备 3 仅会收到授权。一旦设备 i 获得 FSM 的授权,只要其请求 r[i] = 1,该设备就会继续收到授权。
编写表示此 FSM 的完整 Verilog 代码。使用单独的 always 块表示状态表和状态触发器,如课程中所述。使用连续赋值语句或 always 块(由您自行决定)描述 FSM 输出 g[i]。分配您希望使用的任何状态代码。
答案:
优先级:
设备 1 > 设备 2 > 设备 3
代码:
module top_module (
input clk,
input resetn, // active-low synchronous reset
input [3:1] r, // request
output [3:1] g // grant
);
parameter A = 2'b00;
parameter B = 2'b01;
parameter C = 2'b10;
parameter D = 2'b11;
reg [1:0] state, next_state;
wire B2B,B2A;
wire C2C,C2A;
wire D2D,D2A;
//状态跳转
always @(posedge clk) begin
if(!resetn)begin
state <= A;
end
else begin
state <= next_state;
end
end
//状态跳转控制
always @(*) begin
case(state)
A : begin
if(r == 3'b000)begin
next_state = A;
end
else if(r[1])begin
next_state = B;
end
else if(r[2])begin
next_state = C;
end
else if(r[3])begin
next_state = D;
end
end
B : begin
if (B2B)begin
next_state = B;
end
else if(B2A)begin
next_state = A;
end
end
C : begin
if (C2C)begin
next_state = C;
end
else if(C2A)begin
next_state = A;
end
end
D : begin
if (D2D)begin
next_state = D;
end
else if(D2A)begin
next_state = A;
end
end
default next_state = A;
endcase
end
//状态跳转控制条件
assign B2B = (r[1]);
assign B2A = (~r[1]);
assign C2C = (r[2]);
assign C2A = (~r[2]);
assign D2D = (r[3]);
assign D2A = (~r[3]);
//输出信号
assign g[1] = (state == B);
assign g[2] = (state == C);
assign g[3] = (state == D);
endmodule
知识点:
注意:本题为复位信号为"resetn"。
7 Q2b: Another FSM | Q2b:另一个 FSM
题目:
思考一个用于控制某种电机的有限状态机。FSM 具有来自电机的输入 x 和 y,并产生控制电机的输出 f 和 g。还有一个时钟输入,称为 clk,以及一个复位输入,称为 resetn。
FSM 必须按如下方式工作。只要复位输入有效,FSM 就保持在起始状态,称为状态 A。当复位信号无效时,在下一个时钟沿之后,FSM 必须在一个时钟周期内将输出 f 设置为 1。然后,FSM 必须监视 x 输入。当 x 在三个连续的时钟周期内产生值 1、0、1 时,应在下一个时钟周期将 g 设置为 1。在保持 g = 1 的同时,FSM 必须监视 y 输入。如果 y 在最多两个时钟周期内具有值 1,则 FSM 应永久保持 g = 1(即,直到复位)。但如果 y 在两个时钟周期内没有变为 1,那么 FSM 应该永久设置 g = 0(直到重置)。
答案:
1.状态转换图
2.代码
module top_module (
input clk,
input resetn, // active-low synchronous reset
input x,
input y,
output f,
output g
);
parameter A = 4'd0;
parameter START = 4'd1;
parameter S0 = 4'd2;
parameter S1 = 4'd3;
parameter S2 = 4'd4;
parameter S3 = 4'd5;
parameter S4 = 4'd6;
parameter S5 = 4'd7;
parameter S6 = 4'd8;
reg [3:0] state, next_state;
wire S02S0,S02S1;
wire S12S2,S12S1;
wire S22S0,S22S3;
wire S32S4,S32S5;
wire S42S6,S42S5;
//状态跳转
always @(posedge clk) begin
if(!resetn)begin
state <= A;
end
else begin
state <= next_state;
end
end
//状态跳转控制
always @(*) begin
case(state)
A : begin
next_state = START;
end
START : begin
next_state = S0;
end
S0 : begin
if (S02S0)begin
next_state = S0;
end
else if(S02S1)begin
next_state = S1;
end
end
S1 : begin
if (S12S2)begin
next_state = S2;
end
else if(S12S1)begin
next_state = S1;
end
end
S2 : begin
if (S22S0)begin
next_state = S0;
end
else if(S22S3)begin
next_state = S3;
end
end
S3 : begin
if (S32S4)begin
next_state = S4;
end
else if(S32S5)begin
next_state = S5;
end
end
S4 : begin
if (S42S6)begin
next_state = S6;
end
else if(S42S5)begin
next_state = S5;
end
end
S5 : begin
next_state = S5;
end
S6 : begin
next_state = S6;
end
default next_state = A;
endcase
end
//状态跳转控制条件
// wire S02S0,S02S1;
// wire S12S2,S12S1;
// wire S22S0,S22S3;
// wire S32S4,S32S5;
// wire S42S6,S42S5;
assign S02S0 = x == 0;
assign S02S1 = x == 1;
assign S12S2 = x == 0;
assign S12S1 = x == 1;
assign S22S0 = x == 0;
assign S22S3 = x == 1;
assign S32S4 = y == 0;
assign S32S5 = y == 1;
assign S42S6 = y == 0;
assign S42S5 = y == 1;
//输出信号
assign f = (state == START);
assign g = (state == S3) || (state == S4) || (state == S5);
endmodule
知识点:
提示:
直到 f 为 1 之后的周期,FSM 才开始监视 x 输入。
- END -
公z号/CSDN/知乎搜索【望森FPGA】,查看更多FPGA资讯~
相关推荐文章,点击跳转: