在许多(较旧的)串行通信协议中,每个数据字节与一个起始位和一个停止位一起发送,以帮助接收器从比特流中划分字节。一种常见的方案是使用一个起始位(0)、8个数据位和1个停止位(1)。当无任何传输(空闲)时,线路也处于逻辑1。

设计一个有限状态机,当给定一个比特流时,它将识别何时正确接收字节。它需要识别起始位,等待所有8个数据位,然后验证停止位是否正确。如果停止位未按预期出现,则FSM必须等到找到停止位后再尝试接收下一个字节。

现在,您有了一个有限状态机,可以识别在串行位流中何时正确接收字节,添加一个数据路径,该路径将输出正确接收的数据字节。当done为1时,out_字节必须有效,否则为don-care。
请注意,串行协议首先发送最低有效位。

cnt都是从0开始的,上升沿加1

cnt计数器,计算接收的数据数量0-7 ,cnt=8时候判断in是否为停止位,来判断是否进入stop状态

n_state比c_state早一拍

如果使用c_state,那么会丢失第一个数字

module top_module(input clk,input in,input reset,    // Synchronous resetoutput [7:0] out_byte,output done
); // Use FSM from Fsm_serialparameter idle    =3'd0;parameter start   =3'd1;parameter data    =3'd2;parameter stop     =3'd3;parameter hunluan =3'd4;reg [2:0] c_state,n_state;always@(posedge clk)beginif(reset)c_state<=idle;elsec_state<=n_state;    endalways@(*)begincase(c_state)idle   :n_state=(in==0)?start:idle;start  :n_state=data;//没有接收到停止位,这个字节被抛弃//直到等到停止位,才开始下一个字节data   :n_state=(cnt==8)?((in==1)?stop:hunluan):data;hunluan:n_state=(in)?idle:hunluan;stop   :n_state=(in==0)?start:idle;endcase  endreg [3:0]cnt;always@(posedge clk)beginif(reset)cnt<=0;else if(n_state==data)cnt<=cnt+1'b1;elsecnt<=0;   //其他状态下cnt为0endassign done=(c_state==stop);// New: Datapath to latch input bits.reg [7:0]out;always@(posedge clk)beginif(reset)out<=0;else if(n_state==data)out[cnt]<=in;//out<={in,out[7:1]};elseout<=out;endassign out_byte=out;endmodule

我们想给串行接收器增加奇偶校验。奇偶校验在每个数据字节后添加一个额外的位。我们将使用奇数奇偶校验,其中接收到的9位中的1数必须是奇数。例如,101001011满足奇数奇偶校验(有5个1),但001001011不满足。
更改FSM和数据路径以执行奇数奇偶校验。仅当正确接收字节且奇偶校验通过时,才断言done信号。与串行接收器FSM一样,该FSM需要识别起始位,等待所有9位(数据和奇偶校验),然后验证停止位是否正确。如果停止位未按预期出现,则FSM必须等到找到停止位后再尝试接收下一个字节。

您可以使用以下模块来计算输入流的奇偶校验(这是一个带重置的TFF)。其预期用途是,应为其提供输入位流,并在适当的时间重置,以便其计算每个字节中的1位数。

两种做法

方法一:仍然使用n_state

方法二:状态start和data结合在一起,那么就可以使用c_state

奇偶校验的关键:奇偶模块的复位信号,在方法一n_state!=data时候有效,

方法二c_state!=start时候有效

注意:奇偶校验的前提是有停止位,在组合逻辑中判断

有停止位并且奇偶校验为1,那么进入stop状态

module top_module(input clk,input in,input reset,    // Synchronous resetoutput [7:0] out_byte,output done
); //wire odd;// Modify FSM and datapath from Fsm_serialdata// Use FSM from Fsm_serialparameter idle    =3'd0;parameter start   =3'd1;parameter data    =3'd2;parameter stop    =3'd3;parameter hunluan =3'd4;reg [2:0] c_state,n_state;always@(posedge clk)beginif(reset)c_state<=idle;elsec_state<=n_state;    endalways@(*)begincase(c_state)idle   :n_state=(in==0)?start:idle;start  :n_state=data;//没有接收到停止位,这个字节被抛弃//直到等到停止位,才开始下一个字节//没有接收到停止位,就不用谈及奇偶校验,停止位优先级高data   :if(cnt==9)if(in)if(odd)n_state<=stop;elsen_state<=idle;elsen_state<=hunluan;elsen_state<=data;hunluan:n_state=(in)?idle:hunluan;stop   :n_state=(in==0)?start:idle;endcase  endreg [3:0]cnt;always@(posedge clk)beginif(reset)cnt<=0;else if(n_state==data)cnt<=cnt+1'b1;elsecnt<=0;   //其他状态下cnt为0endassign done=(c_state==stop);// New: Datapath to latch input bits.reg [7:0]out;always@(posedge clk)beginif(reset)out<=0;else if((n_state==data)&&(cnt<=7))out[cnt]<=in;//out<={in,out[7:1]};elseout<=out;endassign out_byte=out;// New: Add parity checking.parity u_parity (.clk(clk),.reset(n_state!=data),.in(in),.odd(odd));
endmodule
module top_module(input clk,input in,input reset,    // Synchronous resetoutput [7:0] out_byte,output done
); //wire odd;// Modify FSM and datapath from Fsm_serialdataparameter idle    =2'd0;parameter start   =2'd1;//parameter data    =3'd2;parameter stop    =2'd2;parameter hunluan =2'd3;reg [1:0] c_state,n_state;always@(posedge clk)beginif(reset)c_state<=idle;elsec_state<=n_state;    endalways@(*)begincase(c_state)idle   :n_state=(in==0)?start:idle;//没有接收到停止位,这个字节被抛弃//直到等到停止位,才开始下一个字节start   :if(cnt==9)if(in)if(odd)n_state=stop;elsen_state=idle;elsen_state=hunluan;elsen_state=start; hunluan:n_state=(in)?idle:hunluan;stop   :n_state=(in==0)?start:idle;endcase  endreg [3:0]cnt;always@(posedge clk)beginif(reset)cnt<=0;else if(c_state==start)cnt<=cnt+1'b1;elsecnt<=0;end// New: Datapath to latch input bits.reg [7:0]out;always@(posedge clk)beginif(reset)out<=0;else if(c_state==start&&cnt<=4'd7)out[cnt]<=in;//out<={in,out[7:1]};elseout<=out;endassign out_byte=out;assign done=(c_state==stop);// New: Add parity checking.parity u_parity (.clk(clk),.reset(!(c_state==start)),.in(in),.odd(odd));endmodule

HDLBits-Fsm serialdata相关推荐

  1. verilog练习:hdlbits网站上的做题笔记(6)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  2. 【HDLBits 刷题 11】Circuits(7)Finite State Manchines 18-26

    目录 写在前面 Finite State Manchines Fsm serialdata Fsm serialdp Fsm hdlc Design a Mealy FSM ece241 2014 q ...

  3. HDLBits 系列(36)Arbitration circuit implemented by FSM

    目录 原题复现 审题 我的设计 设计解释 原题复现 原题复现: Consider the FSM described by the state diagram shown below: This FS ...

  4. HDLBits 系列(33)Sequence Recognition with Mealy FSM

    目录 原题复现 状态转移图 我的设计 测试 原题复现 原题重现: Implement a Mealy-type finite state machine that recognizes the seq ...

  5. HDLBits 系列(27)孰对孰错 之 Fsm onehot?

    目录 前言 原题复现 审题 我的设计 测试吐槽 最后的解决方案 前言 今天的这个问题,并没有满意的解决,路过的朋友,看出问题所在的,可以给个评论,谢谢. 原题复现 Fsm onehot 下面是一个最基 ...

  6. 【小罗的hdlbits刷题笔记5】基于fifo思想的fsm设计(Exams/2014 q3fsm)

    在写状态机时,经常会有检测输入信号波形的情况,这种情况下,如果采用三段式状态机书写,则需要通过穷举法把输入信号所有可能存在的情况书写出来,在检测一到两个周期的输入信号时工作量不会很大,但是在检测多于三 ...

  7. HDLBits(十 三)学习笔记——Building Lager Circuits (1000计数器 —— FSM:One-hot logic equations独热码)

    文章目录 1.Counter with period 1000 2.4-bit shift register and down counter(移位寄存器) 3.fsmseq 序列1101识别器 4. ...

  8. HDLBits 系列(34)Serial two's complememter(Mealy and Moore FSM)

    目录 Mealy 状态机 原题复现 我的设计 Moore 状态机 原题复现 状态转移图 我的设计 Mealy 状态机 原题复现 原题复现: The following diagram is a Mea ...

  9. HDLBits 系列(24)进入FSM(有限状态机)的世界入口

    目录 Fsm1 Fsm1s Fsm2 Fsm3comb Fsm1 This is a Moore state machine with two states, one input, and one o ...

  10. HDLBits 系列(0)专题目录

    本篇博文是近来总结HDLBits系列的目录,点击蓝色字体即可进入查看具体内容. HDLBits 系列(1)从HDLBits中获取灵感,整顿自己,稳步前行 HDLBits 系列(2)如何避免生成锁存器? ...

最新文章

  1. Python3-Cookbook总结 - 第一章:数据结构和算法
  2. Java学习----到底调用哪一个方法(多态)
  3. [Android]关于Root
  4. [周年感悟]看软件项目中的四种角色
  5. 云视睿博流媒体服务器Lit,《云视睿博流媒体服务器参数表.docx
  6. java第十二章总结
  7. 利用python画分形图_使用 Python 绘制 Mandelbrot 分形图
  8. linux 中阻塞与非阻塞 同步与异步
  9. 俞昆20155335《网络对抗》MSF基础应用
  10. matlab 画短时平均幅度谱
  11. 利用CaaS控制虚拟机蔓延
  12. 电脑JAVA打开oracle太慢_oracle官网下载jdk跑不动太慢了,给出快速下载方式mac
  13. TabLayout 不显示下划线
  14. 2021-2022年十类(30+)热门资质证书汇总分享
  15. Android中获取屏幕信息的几种方式
  16. allegro skill 选择和获取函数
  17. 基于JSP+Servlet+MySQL的智能停车管理系统(附论文)
  18. 案例分析---我是如何在谷歌财经发现一个XSS漏洞
  19. MySQL 数据(字段)类型
  20. 10、Kafka 消息订阅系统

热门文章

  1. iOS keyframe关键帧动画和过渡动画各个属性简单使用。
  2. 内部局域网可自行分配的ip地址
  3. php speex转码为mp3,将spx音频文件转换为mp3
  4. 当 RTC 遇到“杨超越编程大赛”=?
  5. 列式数据库与行式数据库
  6. Openlayers中多边形的聚合
  7. 基础项 —【缩略语】
  8. 国外研究员研发薄而柔韧的新柔性材料 拉伸和压缩可产生电流
  9. MySQL基础(八):模糊查询的SQL语句、where条件查询、比较运算符查询、逻辑运算符查询、模糊查询、范围查询、空判断查询
  10. Revit二次开发之管道避让