在许多(较旧的)串行通信协议中,每个数据字节与一个起始位和一个停止位一起发送,以帮助接收器从比特流中划分字节。一种常见的方案是使用一个起始位(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. linux c 链接详解4-共享库
  2. JavaScript基础一
  3. 第一次使用OD和IDA动静结合找出软件的注册算法
  4. Linux C 学习 单向链表
  5. 福州大学软件工程1916|W班 第10、11次作业成绩排名
  6. Spring的OpenEntityManagerInViewFilter
  7. 计算机英语名词解释之软件工程篇
  8. 电子与电工技术实验——集成运算放大器的应用
  9. emmc host调用mmc_rescan发现设备
  10. 浅谈核桃的栽培技术与种植管理方法
  11. 切换阿里巴巴开源镜像站镜像——Kali镜像
  12. Tungsten Fabric如何增强Kubernetes的网络性能
  13. 【2022吉比特】春招技术笔试A卷-AK题解
  14. 现代编程语言(3):zig
  15. Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operat
  16. JavaBean技术的应用——购物车
  17. (附源码)Python云顶之弈数据分析系统 毕业设计451545
  18. 视频融合云服务EasyCVR平台部署在云服务器中的配置关键点
  19. 江民:核心杀毒技术不过硬,再“云”也不安全
  20. 狐狸抓兔子(实验楼的练习)

热门文章

  1. Oracle 中 nvl、nvl2、nullif、coalesce、decode 函数的用法详解
  2. 【转】如何成为一个牛逼的程序员
  3. FTP协议的Wireshark抓包分析
  4. bootstrap 导航栏自适应
  5. 使用Fiddler抓取app访问路径
  6. OSChina 周二乱弹 ——白色情人节慢慢的把她抱到床上 结果……
  7. 计算机集成制造系统服务合同,制造自动化协议(.doc
  8. 计算机在材料表征方面的应用,计算机在材料科学中的应用---完整版
  9. 如何在 Linux 下删除分区 ?
  10. NLP基础知识点:BLEU(及Python代码实现)