HDLBits答案(19)_Verilog有限状态机(6)
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)相关推荐
- HDLBits答案(18)_Verilog有限状态机(5)
Verilog有限状态机(5) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 题目描述1: 第一道题目比较容易,题目中的in信号包含了一个起始位(0),8个数据位和一个停止位(1), ...
- HDLBits答案(21)_Verilog有限状态机(8)
Verilog有限状态机(8) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 Q2a:FSM 正宗的FSM题,没啥说的,看图写代码. Solution: module top_mod ...
- HDLBits答案(20)_Verilog有限状态机(7)
Verilog有限状态机(7) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 Q3a:FSM 题目里说当s为0时,进入B状态,然后会检查w的值,如果在接下来的三个周期中w值恰好有两个 ...
- HDLBits答案(17)_Verilog有限状态机(4)
Verilog有限状态机(4) HDLBits链接 前言 今天继续更新状态机小节的习题. 题库 题目描述1: One-hot FSM 独热编码,根据状态转移图输出下一状态与结果. Solution1: ...
- HDLBits答案(16)_Verilog有限状态机(3)
Verilog有限状态机(3) HDLBits链接 前言 今天继续更新状态机小节的习题,本章主要编写Lemmings Game部分. 题库 题目描述10: Game Lemmings1:有个小人左右走 ...
- HDLBits答案(15)_Verilog有限状态机(2)
Verilog有限状态机(2) HDLBits链接 前言 继续更新状态机小节的习题. 题库 题目描述6: Solution6: module top_module(input in,input [3: ...
- HDLBits答案(14)_Verilog有限状态机(1)
Verilog有限状态机(1) HDLBits链接 前言 今天来到了重要的部分:状态机.对该部分内容,可能不会一次更新一个小节:一方面是题目难度,另一方面是代码量过大:所以该节会分批更新,大家见谅. ...
- HDLBits答案(12)_Verilog移位寄存器
Verilog移位寄存器 HDLBits链接 前言 今天更新一节寄存器相关内容,其中涉及CRC校验的内容是用线性反馈移位寄存器搭建而成的. 题库 题目描述1: 构建一个4bit的移位寄存器(右移),含 ...
- HDLBits答案(13)_Verilog移位寄存器附加题
Verilog移位寄存器 HDLBits链接 前言 今天更新一节内容,该小节题目不多,共三道,但技巧性挺强. 题库 题目描述1:各单元的下一状态是此时当前单元相邻两位的异或. 在这个电路中,创建一个5 ...
最新文章
- Linux通常把设备对象抽象为,linux 设备模型(1)
- OpenCASCADE:适用于 iOS 的 OCCT 示例
- [转]常见的用户密码加密方式以及破解方法
- 数据库连接池原理及常用连接池介绍
- 【图像处理】Qt+OpenCV自制mini软件——图像二值化器
- 太好了 | 这篇写的太好了!Spring Boot + Redis 实现接口幂等性
- 【转】Qt VS MFC
- 2018-04-22jenkins+maven+svn环境搭建学习心得
- VRTK HTC手柄发出射线,瞬移,选择物体 VRTK和steamVR对应版本
- android中stagefright和OMXCodec原理分析
- 全球数字电视标准制式
- 对 “悟空拼音”学习软件的教学过程优化分析
- 小程序逆向——某书小程序反编译(一)
- 全球消费精品消博会亮相!科蒂、资生堂、欧莱雅、奔富、保乐力加、红牛、雀巢、拜耳、澳佳宝都来了 | 美通社头条...
- [单调栈 扫描线] BZOJ 4826 [Hnoi2017]影魔
- 每天数千个漏洞被公开 选什么工具能让漏洞追不上我?RASP介绍
- 今天安利几个好用的软件给你
- netty 多线程用一个长连接(channel) 发送消息 并发安全吗?
- 【Mskt问题的解决办法】使用御坂翻译器2.x版本遇到的常见问题及解决办法
- 模拟cmos集成电路(4)
热门文章
- 2015-03-17 how is task transaction type retrieved
- SAP云平台上的SSO Principal Propagation设置
- Apache HttpClient库里的日志实现检测原理
- AG9 Service order创建好之后,要自动通过middleware传其他系统去 disable
- Java Spring源代码学习之How is class annotation evaluated by Spring framework
- SAP Engagement Center的一段代码审查记录
- 在SAP Smart Business workspace里创建KPI tile的错误消息分析
- latex 新定义环境 引用_炉石传说:完全虐杀式上分!新版本第二天动物园迅速定义环境!...
- 副主任护师主要英语和计算机吗,有没有晋升副主任护师的
- python 嵌套数组_兴趣是最好的老师,快速入门:十分钟学会python