Menu Close

Verilog 语法练习(9)-状态机进阶

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]

uart.txt

[/content_control]

Test bench:

[content_control]

tb.txt

[/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]

uart_data.txt

[/content_control]

Test bench:

[content_control]

tb2.txt

[/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]

uart_odd_parity.txt

[/content_control]

Test bench:

[content_control]

tb3.txt

[/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_recognition.txt

sequence_recognition1.txt

sequence_recognition2.txt
[/content_control]

Test bench:

[content_control]

tb4.txt

[/content_control]

 

参考状态机图:见文章 Verilog 语法练习(8)状态机问题7

 

5.

实现一个带有异步低电平复位信号,可以重复检测序列“ 101 ”的3步Mealy状态机(输出由状态和输入一齐决定)。见下列波形图举例:

 

完善下列代码:

module top_module (
    input clk,
    input aresetn,    //异步低电平复位
    input x,
    output z 
); 

endmodule

 

参考代码:

[content_control]

mealy.txt

[/content_control]

Test bench:

[content_control]

tb5.txt

[/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]

2_complement.txt

[/content_control]

Test bench:

[content_control]

tb6.txt

[/content_control]

7.

在问题6的基础上,用Mealy状态机实现,并且采用独热码编码状态,状态转移图提供如下所示:

波形图如下所示:

完善下列代码:

module top_module (
    input clk,
    input areset, //高电平异步复位信号
    input x,
    output z
); 


endmodule

 

参考代码:

[content_control]

2_complement_mealy.txt

[/content_control]

Test bench:

[content_control]

tb7.txt

[/content_control]

Posted in FPGA, FPGA 教材教案, FPGA习题库, 教材与教案, 文章

发表回复

相关链接