HDLBits_review 2015fsm

题目:

我们将要创建一个计时器:

1. 在检测到特定模式1101时启动;

2. 再移动4位以确定延时时间;

3. 等待计数器计数完成;

4. 通知用户,并等待用户确认定时。

在这个题目里,只实现控制计时器的有限状态机。这里不包括数据路径(计数器和一些比较器)。

串行数据从数据输入引脚获取。当接收到1101时,状态机输出shift_ena4个时钟周期。

之后,状态机开始计数输出,等待计数。等待输入done_counting为1.

此时,状态机断言计数完成。并等待ack为1,然后重置,等待下一个1101。

复位后进入初始状态,用来等待接收1101序列。

下面时预期的输入,输出时序。一旦检测到1101后,状态机不再关注数据输入,直到所有其他操作完成后恢复搜索。

image

 状态转换:

image

 代码:

module top_module (
input clk,
input reset, // Synchronous reset
input data,
output shift_ena,
output counting,
input done_counting,
output done,
input ack );
parameter S=0,S1=1,S11=2,S110=3,B0=4,B1=5,B2=6,B3=7,Count=8,Wait=9;
reg [3:0]state,next_state;

always @(posedge clk)
if(reset)
state<=S;
else
state<=next_state;

always @(*)
case(state)
S:next_state=data?S1:S;
S1:next_state=data?S11:S;
S11:next_state=data?S11:S110;
S110:next_state=data?B0:S;
B0:next_state=B1;
B1:next_state=B2;
B2:next_state=B3;
B3:next_state=Count;
Count:next_state=done_counting?Wait:Count;
Wait:next_state=ack?S:Wait;
default:next_state=S;
endcase

assign shift_ena=(state==B0 || state==B1 || state==B2 || state==B3);
assign counting=(state==Count);
assign done=(state==Wait);
endmodule

posted on 2026-01-28 10:48  yf.x  阅读(5)  评论(0)    收藏  举报

导航