1.
在UART通信协议中,每个数据字节都有一个起始位和停止位,以帮助接收方从数据流中定位。UART最简单的发送格式是 Start (1’b0) + 8-bit 数据 + Stop (1’b1) 。 当没有传输任何内容(空闲)时,该线路一直处于高电平。
设计一个状态机,当给定输入比特流时,识别何时正确接收到字节。 它需要识别起始位,等待所有 8 个数据位,然后验证停止位是否正确。 如果一切正确,输出一个单bit信号done,如果停止位未按预期出现,则该状态机必须等到找到停止位后再尝试接收下一个字节。
示意波形图如下:

完善下列代码:
module top_module(
input clk,
input in,
input reset, // 高电平同步复位
output done
);
endmodule
参考代码:
[content_control]
[/content_control]
Test bench:
[content_control]
[/content_control]
2.
在问题1的基础上,将收到的8-bit数据也进行输出。注意:先收到的是最低有效位(LSB),接收到的数据应该在done信号是高电平时为有效。示意波形图如下:

完善下列代码:
module top_module(
input clk,
input in,
input reset, // 高电平同步复位
output reg [7:0] out_byte,
output done
);
endmodule
参考代码:
[content_control]
[/content_control]
Test bench:
[content_control]
[/content_control]
3. 在问题2的基础上完成这个问题。UART通信协议中,有时会在8-bit数据之后加上1个bit的奇偶校验位。也就是说,在去掉数据字节中的start位和stop位之后,还剩下8-bit数据+奇偶校验位。本道题如果设置的是奇校验(odd),那么只要8-bit数据+奇偶校验位中“ 1 ”的个数为奇数,结果判断为正确,done和数据可以正常输出。举例说明:
- 数据+奇偶校验位为9’b1100_0110_1,一共有5个“ 1 ”,所以奇校验是正确的,可以正常输出done
- 数据+奇偶校验位为9’b0000_0100_1,一共有2个“ 1 ”,奇校验不正确,不能输出done
完善下列代码:
module top_module(
input clk,
input in,
input reset,
output [7:0] out_byte,
output done
);
endmodule
参考代码:
[content_control]
[/content_control]
Test bench:
[content_control]
[/content_control]
4.
在一串输入数据比特流中识别Preamble + SFD (“ 111111 ” + “ 0 ”),以寻找指示帧起始。 6 个连续的 1(即 01111110)是指示帧起始。 为避免数据流意外包含“标志”,发送方每连续 5 个 1 后插入一个零,接收方必须检测并丢弃该 0。 如果有 7 个或更多连续的 1,输出错误信号。注意只要有disc,flag,err标志立起来,需要重新检测7位序列。
创建一个状态机来识别这三种序列:
- 0111110:需要丢弃信号位(disc)
- 01111110:标记帧起始(flag)
- 01111111…:错误(7 个或更多 1s)(err)
当状态机被高电平同步复位时,应该被复位到一个之前输入为 0的状态。见以下波形:

完善以下代码:
module top_module(
input clk,
input reset, //同步高电平复位
input in,
output disc,
output flag,
output err);
endmodule
参考代码:
[content_control]
sequence_recognition2.txt
[/content_control]
Test bench:
[content_control]
[/content_control]
参考状态机图:见文章 Verilog 语法练习(8)状态机问题7
5.
实现一个带有异步低电平复位信号,可以重复检测序列“ 101 ”的3步Mealy状态机(输出由状态和输入一齐决定)。见下列波形图举例:

完善下列代码:
module top_module (
input clk,
input aresetn, //异步低电平复位
input x,
output z
);
endmodule
参考代码:
[content_control]
[/content_control]
Test bench:
[content_control]
[/content_control]
6.
实现一个单bit输入单bit输出的串行比特流的Moore状态机。 输入 (x) 从数字的最低有效位开始,输出 (z)也是一个数据流, 是输入x的 2 的补码(取反 + 1)。 电路需要高电平异步复位。输出应该会晚于输入一个时钟周期,如下列波形图所示:
举例:
输入x为:0
输出z为:0 (1 进位 位) z = ~x + 1;
输入x为:0 0
输出z为:0 0(1 进位 位) z = ~x + 1;
输入x为:0 0 1
输出z为:0 0 1(1 进位 位) z = ~x + 1;
输入为:0 0 1 0 1 1 0 ..
输出为:0 0 1 1 0 0 1 ..

完善下列代码:
module top_module (
input clk,
input areset,
input x,
output z
);
endmodule
参考代码:
[content_control]
[/content_control]
Test bench:
[content_control]
[/content_control]
7.
在问题6的基础上,用Mealy状态机实现,并且采用独热码编码状态,状态转移图提供如下所示:

波形图如下所示:

完善下列代码:
module top_module (
input clk,
input areset, //高电平异步复位信号
input x,
output z
);
endmodule
参考代码:
[content_control]
[/content_control]
Test bench:
[content_control]
[/content_control]