HDLBits-Fsm serialdata
在许多(较旧的)串行通信协议中,每个数据字节与一个起始位和一个停止位一起发送,以帮助接收器从比特流中划分字节。一种常见的方案是使用一个起始位(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相关推荐
- verilog练习:hdlbits网站上的做题笔记(6)
前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...
- 【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 ...
- HDLBits 系列(36)Arbitration circuit implemented by FSM
目录 原题复现 审题 我的设计 设计解释 原题复现 原题复现: Consider the FSM described by the state diagram shown below: This FS ...
- HDLBits 系列(33)Sequence Recognition with Mealy FSM
目录 原题复现 状态转移图 我的设计 测试 原题复现 原题重现: Implement a Mealy-type finite state machine that recognizes the seq ...
- HDLBits 系列(27)孰对孰错 之 Fsm onehot?
目录 前言 原题复现 审题 我的设计 测试吐槽 最后的解决方案 前言 今天的这个问题,并没有满意的解决,路过的朋友,看出问题所在的,可以给个评论,谢谢. 原题复现 Fsm onehot 下面是一个最基 ...
- 【小罗的hdlbits刷题笔记5】基于fifo思想的fsm设计(Exams/2014 q3fsm)
在写状态机时,经常会有检测输入信号波形的情况,这种情况下,如果采用三段式状态机书写,则需要通过穷举法把输入信号所有可能存在的情况书写出来,在检测一到两个周期的输入信号时工作量不会很大,但是在检测多于三 ...
- 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. ...
- HDLBits 系列(34)Serial two's complememter(Mealy and Moore FSM)
目录 Mealy 状态机 原题复现 我的设计 Moore 状态机 原题复现 状态转移图 我的设计 Mealy 状态机 原题复现 原题复现: The following diagram is a Mea ...
- HDLBits 系列(24)进入FSM(有限状态机)的世界入口
目录 Fsm1 Fsm1s Fsm2 Fsm3comb Fsm1 This is a Moore state machine with two states, one input, and one o ...
- HDLBits 系列(0)专题目录
本篇博文是近来总结HDLBits系列的目录,点击蓝色字体即可进入查看具体内容. HDLBits 系列(1)从HDLBits中获取灵感,整顿自己,稳步前行 HDLBits 系列(2)如何避免生成锁存器? ...
最新文章
- Python3-Cookbook总结 - 第一章:数据结构和算法
- Java学习----到底调用哪一个方法(多态)
- [Android]关于Root
- [周年感悟]看软件项目中的四种角色
- 云视睿博流媒体服务器Lit,《云视睿博流媒体服务器参数表.docx
- java第十二章总结
- 利用python画分形图_使用 Python 绘制 Mandelbrot 分形图
- linux 中阻塞与非阻塞 同步与异步
- 俞昆20155335《网络对抗》MSF基础应用
- matlab 画短时平均幅度谱
- 利用CaaS控制虚拟机蔓延
- 电脑JAVA打开oracle太慢_oracle官网下载jdk跑不动太慢了,给出快速下载方式mac
- TabLayout 不显示下划线
- 2021-2022年十类(30+)热门资质证书汇总分享
- Android中获取屏幕信息的几种方式
- allegro skill 选择和获取函数
- 基于JSP+Servlet+MySQL的智能停车管理系统(附论文)
- 案例分析---我是如何在谷歌财经发现一个XSS漏洞
- MySQL 数据(字段)类型
- 10、Kafka 消息订阅系统