Verilog专题(三十四)两输入的Mealy状态机
HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page
题目 考虑输入为s和w的有限状态机,假定FSM以称为A的复位状态开始。只要s = 0,FSM就会保持状态A,而当s = 1时,FSM会进入状态B。一旦进入状态B,FSM就会在接下来的三个时钟周期中检查输入w的值,如果恰好在这些时钟周期中的两个时钟周期中w = 1,则FSM必须在下一个时钟周期中将输出z设置为1,否则z必须为0。FSM在接下来的三个时钟周期中继续检查w,依此类推。下面的时序图说明了不同w值所需的z值。
使用尽可能少的状态,请注意,s输入仅在状态A中使用,因此只需要考虑w输入。
文章图片
Module Declaration 【Verilog专题(三十四)两输入的Mealy状态机】module top_module (
input clk,
input aresetn,// Asynchronous active-low reset
input x,
output z );
我的设计
文章图片
根据状态机转移图和题目描述,代码如下:
module top_module (
input clk,
input reset,// Synchronous reset
input s,
input w,
output z
);
parameter A = 1'b0, B = 1'b1;
reg current_state;
reg next_state;
always@(posedge clk)begin
if(reset)begin
current_state <= A;
end
else begin
current_state <= next_state;
end
end
always@(*)begin
case(current_state)
A:begin
next_state = s ? B : A;
end
B:begin
next_state = B;
end
endcase
end
reg w_reg1;
reg w_reg2;
always@(posedge clk)begin
if(reset)begin
w_reg1 <= 1'b0;
w_reg2 <= 1'b0;
end
else if(next_state == B)begin
w_reg1 <= w;
w_reg2 <= w_reg1;
end
else begin
w_reg1 <= 1'b0;
w_reg2 <= 1'b0;
end
end
always@(posedge clk)begin
if(reset)begin
z <= 1'b0;
end
else if(next_state == B && counter == 2'd0)begin
if(~w & w_reg1 & w_reg2 | w & ~w_reg1 & w_reg2 | w & w_reg1 & ~w_reg2)begin
z <= 1'b1;
end
else begin
z <= 1'b0;
end
end
else begin
z <= 1'b0;
end
end
reg [1:0] counter;
always@(posedge clk)begin
if(reset)begin
counter <= 2'd0;
end
else if(counter == 2'd2)begin
counter <= 2'd0;
end
else if(next_state == B)begin
counter <= counter + 1'b1;
end
end
endmodule
?
微信公众号 建立了一个微信公众号“Andy的ICer之路”,此公众号主要分享数字IC相关的学习经验,做公众号的目的就是记录自己的学习过程,很多东西回过头来可能就忘记了,为了记住知识和分享知识,希望自己可以保持更新,有兴趣的朋友可以关注一下!
文章图片
推荐阅读
- 为什么文章被4个专题收录了阅读量却是个位数()
- 【专题】怎样才能消除妊娠纹
- 遇见第三十四天
- 诗专题/秋花迎月
- 部署专题集合
- 文献阅读专题
- 职场江湖(三十四)好记性不如烂笔头
- 我是来搞笑的|我是来搞笑的|专题投稿直男
- 第二百三十四章|第二百三十四章 十里亭(5)
- B|B 【小组记事】230-6组 专题会议---家庭教育