Verilog有限状态机(6)

HDLBits链接


前言

今天继续更新状态机小节的习题。


题库

Fsm hdlc

同步帧检测涉及对数据的连续位流进行解码,以寻找指示帧(数据包)开始和结束的位模式。 6个连续的1(即01111110)是表示帧边界的“标志”。 为了避免数据流意外包含“标志”,发送方必须在接收方必须检测并丢弃的每5个连续的1秒后插入一个零。 如果连续7个或更多1,我们还需要发出错误信号。

可以通过状态机来识别下面三种序列:

0111110:表示5个1后面的0bit需被忽略;

01111110:表示一帧的开始或结束;

01111111…:错误

当状态机被复位时,它应当表现为之前的输入为0;

下面是三种波形示例:

官方提供的状态机设计提示:

Solution:

//----------------way1----------------------
module top_module(input clk,input reset,    // Synchronous resetinput in,output disc,output flag,output err);parameter NONE = 4'd0,ONE = 4'd1,TWO = 4'd2;parameter THREE = 4'd3,FOUR = 4'd4,FIVE = 4'd5;parameter SIX = 4'd6,ERROR = 4'd7;parameter DISC = 4'd8,FLAG = 4'd9;reg [3:0] current_state,next_state;always @(*) begincase(current_state)NONE:beginnext_state = in ? ONE : NONE;endONE:beginnext_state = in ? TWO : NONE;endTWO:beginnext_state = in ? THREE : NONE;endTHREE:beginnext_state = in ? FOUR : NONE;endFOUR:beginnext_state = in ? FIVE : NONE;endFIVE:beginnext_state = in ? SIX : DISC;endSIX:beginnext_state = in ? ERROR : FLAG;endDISC:beginnext_state = in ? ONE : NONE;endFLAG:beginnext_state = in ? ONE : NONE;endERROR:beginnext_state = in ? ERROR : NONE;endendcaseendalways @(posedge clk) beginif(reset)begincurrent_state <= NONE;endelse begincurrent_state <= next_state;endendalways @(posedge clk) beginif(reset)begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd0;endelse begincase(next_state)DISC:begindisc <= 1'd1;flag <= 1'd0;err  <= 1'd0;endFLAG:begindisc <= 1'd0;flag <= 1'd1;err  <= 1'd0;endERROR:begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd1;enddefault:begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd0;endendcaseendendendmodule
//----------------way2----------------------
module top_module(input clk,input reset,    // Synchronous resetinput in,output disc,output flag,output err);parameter NONE = 3'd0,DATA = 3'd1;parameter DISC = 3'd2,FLAG = 3'd3,ERROR = 3'd4;reg [2:0] current_state,next_state;reg [2:0] counter;always @(*) begincase(current_state)NONE:beginnext_state = in ? DATA : NONE;endDATA:begincase(counter)3'd5:   next_state = in ? DATA : DISC;3'd6:   next_state = in ? ERROR : FLAG;default:next_state = in ? DATA : NONE;endcaseendDISC:beginnext_state = in ? DATA : NONE;endFLAG:beginnext_state = in ? DATA : NONE;endERROR:beginnext_state = in ? ERROR : NONE;endendcaseendalways @(posedge clk) beginif(reset)begincurrent_state <= NONE;endelse begincurrent_state <= next_state;endendalways @(posedge clk) beginif(reset)begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd0;counter <= 3'd0;endelse begincase(next_state)DATA:begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd0;counter <= counter + 1'd1;endDISC:begindisc <= 1'd1;flag <= 1'd0;err  <= 1'd0;counter <= 3'd0;endFLAG:begindisc <= 1'd0;flag <= 1'd1;err  <= 1'd0;counter <= 3'd0;endERROR:begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd1;counter <= 3'd0;enddefault:begindisc <= 1'd0;flag <= 1'd0;err  <= 1'd0;counter <= 3'd0;endendcaseendendendmodule

其中way1与题目提示的思路相同,其中第三段状态机一开始忘记加reset的那种情况,果然还是长时间没接触verilog手生了,以后继续练习;

way2使用counter去掉中间状态,靠输入和counter的值来决定状态转移,是一种米利状态机的思想;状态转移图如下(手绘有点丑,见谅):

米利型状态机

检测输入的X中”101“是否出现,出现的话输出Z为1,否则为0。复位为异步低电平复位;只允许出现3种状态;允许交叠检测:即输入若为10101时,Z应该在时刻3和时刻5各输出一次1;

代码中主要妙在两处:一是如何用3种状态表示,需在第三种状态中将输出与输入关联起来;二是如何进行交叠检测,状态的转移有妙处;

Solution

module top_module (input clk,input aresetn,    // Asynchronous active-low resetinput x,output z ); parameter S0 = 2'd0,S1 = 2'd1,S2 = 2'd2;reg [1:0] current_state,next_state;always @(*) begincase(current_state)S0: next_state = x ? S1 : S0;S1: next_state = x ? S1 : S2;S2: next_state = x ? S1 : S0;endcaseendalways @(posedge clk or negedge aresetn) beginif(~aresetn)begincurrent_state <= S0;endelse begincurrent_state <= next_state;endendalways @(*) beginz = (current_state == S2) ? x : 1'b0;endendmodule

Q5a:Serial two’s complementer(Moore FSM)

作者这里假设我们这边输入的都是负数,不用管符号位的问题;即补码全部都是取反加1求得。

以上图为例,输入的左边为低位数据,右边为高位数据;即输入为00110100,则取反加1后得输出为11001100;

取反操作好进行,主要麻烦在加一的操作上,不知道进位到哪一位为止,此时我们用状态机来解决;若最前面的输入都是0的话,取反均为1,低位加1的时候一直进位,则输出都是0,直到输入有个1为止(取反加1不进位),这一阶段我们用一个状态S0来表示;后面阶段就将输入取反进行输出即可,因为进位链在S0状态已结束;

因为是摩尔型状态机,状态的转移与输入无关,所以我们这里用到3个状态,代码如下所示:

Solution

module top_module (input clk,input areset,input x,output z
); parameter S0 = 2'd0, S1 = 2'd1, S2 = 2'd2;reg [1:0] current_state, next_state;always @(*) begincase(current_state)S0:     next_state = x ? S1 : S0;S1:     next_state = x ? S2 : S1;S2:     next_state = x ? S2 : S1;endcaseendalways @(posedge clk or posedge areset) beginif(areset)begincurrent_state <= S0;endelse begincurrent_state <= next_state;endendassign z = (current_state == S1);endmodule

Q5b:Serial two’s complementer(Mealy FSM)

题意与上题相同,此时用米利型状态机实现。下面是官方提供的状态转移提示:

module top_module (input clk,input areset,input x,output z
); parameter S0 = 1'b0, S1 = 1'b1;reg current_state,next_state;always @(*) begincase(current_state)S0:     next_state = x ? S1 : S0;S1:     next_state = S1;endcaseendalways @(posedge clk or posedge areset) beginif(areset)begincurrent_state <= S0;endelse begincurrent_state <= next_state;endendassign z = ((current_state == S0) && x) || ((current_state == S1) && ~x);endmodule

结语

今天先更新这几题吧,大家如果对转补码的题目还有什么疑问欢迎评论交流,代码有不足之处还望指正。

HDLBits答案(19)_Verilog有限状态机(6)相关推荐

  1. HDLBits答案(18)_Verilog有限状态机(5)

    Verilog有限状态机(5) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 题目描述1: 第一道题目比较容易,题目中的in信号包含了一个起始位(0),8个数据位和一个停止位(1), ...

  2. HDLBits答案(21)_Verilog有限状态机(8)

    Verilog有限状态机(8) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 Q2a:FSM 正宗的FSM题,没啥说的,看图写代码. Solution: module top_mod ...

  3. HDLBits答案(20)_Verilog有限状态机(7)

    Verilog有限状态机(7) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 Q3a:FSM 题目里说当s为0时,进入B状态,然后会检查w的值,如果在接下来的三个周期中w值恰好有两个 ...

  4. HDLBits答案(17)_Verilog有限状态机(4)

    Verilog有限状态机(4) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 题目描述1: One-hot FSM 独热编码,根据状态转移图输出下一状态与结果. Solution1: ...

  5. HDLBits答案(16)_Verilog有限状态机(3)

    Verilog有限状态机(3) HDLBits链接 前言 今天继续更新状态机小节的习题,本章主要编写Lemmings Game部分. 题库 题目描述10: Game Lemmings1:有个小人左右走 ...

  6. HDLBits答案(15)_Verilog有限状态机(2)

    Verilog有限状态机(2) HDLBits链接 前言 继续更新状态机小节的习题. 题库 题目描述6: Solution6: module top_module(input in,input [3: ...

  7. HDLBits答案(14)_Verilog有限状态机(1)

    Verilog有限状态机(1) HDLBits链接 前言 今天来到了重要的部分:状态机.对该部分内容,可能不会一次更新一个小节:一方面是题目难度,另一方面是代码量过大:所以该节会分批更新,大家见谅. ...

  8. HDLBits答案(12)_Verilog移位寄存器

    Verilog移位寄存器 HDLBits链接 前言 今天更新一节寄存器相关内容,其中涉及CRC校验的内容是用线性反馈移位寄存器搭建而成的. 题库 题目描述1: 构建一个4bit的移位寄存器(右移),含 ...

  9. HDLBits答案(13)_Verilog移位寄存器附加题

    Verilog移位寄存器 HDLBits链接 前言 今天更新一节内容,该小节题目不多,共三道,但技巧性挺强. 题库 题目描述1:各单元的下一状态是此时当前单元相邻两位的异或. 在这个电路中,创建一个5 ...

最新文章

  1. Linux通常把设备对象抽象为,linux 设备模型(1)
  2. OpenCASCADE:适用于 iOS 的 OCCT 示例
  3. [转]常见的用户密码加密方式以及破解方法
  4. 数据库连接池原理及常用连接池介绍
  5. 【图像处理】Qt+OpenCV自制mini软件——图像二值化器
  6. 太好了 | 这篇写的太好了!Spring Boot + Redis 实现接口幂等性
  7. 【转】Qt VS MFC
  8. 2018-04-22jenkins+maven+svn环境搭建学习心得
  9. VRTK HTC手柄发出射线,瞬移,选择物体 VRTK和steamVR对应版本
  10. android中stagefright和OMXCodec原理分析
  11. 全球数字电视标准制式
  12. 对 “悟空拼音”学习软件的教学过程优化分析
  13. 小程序逆向——某书小程序反编译(一)
  14. 全球消费精品消博会亮相!科蒂、资生堂、欧莱雅、奔富、保乐力加、红牛、雀巢、拜耳、澳佳宝都来了 | 美通社头条...
  15. [单调栈 扫描线] BZOJ 4826 [Hnoi2017]影魔
  16. 每天数千个漏洞被公开 选什么工具能让漏洞追不上我?RASP介绍
  17. 今天安利几个好用的软件给你
  18. netty 多线程用一个长连接(channel) 发送消息 并发安全吗?
  19. 【Mskt问题的解决办法】使用御坂翻译器2.x版本遇到的常见问题及解决办法
  20. 模拟cmos集成电路(4)

热门文章

  1. 2015-03-17 how is task transaction type retrieved
  2. SAP云平台上的SSO Principal Propagation设置
  3. Apache HttpClient库里的日志实现检测原理
  4. AG9 Service order创建好之后,要自动通过middleware传其他系统去 disable
  5. Java Spring源代码学习之How is class annotation evaluated by Spring framework
  6. SAP Engagement Center的一段代码审查记录
  7. 在SAP Smart Business workspace里创建KPI tile的错误消息分析
  8. latex 新定义环境 引用_炉石传说:完全虐杀式上分!新版本第二天动物园迅速定义环境!...
  9. 副主任护师主要英语和计算机吗,有没有晋升副主任护师的
  10. python 嵌套数组_兴趣是最好的老师,快速入门:十分钟学会python