1.发送

module uart_tx(clk,rst,receive_ack,data_o,txd);input clk;input rst;input receive_ack;//发送数据命令,高电平有效input [7:0] data_o;//8个数据位output txd;//发送数据reg txd;reg [3:0] count;reg presult;//偶校验位//assign presult = CHECK_EVEN^data_o[0]^data_o[1]^data_o[2]^data_o[3]^data_o[4]^data_o[5]^data_o[6]^data_o[7];//parameter CHECK_EVEN = 1'b0;//偶校验//定义状态机的5个状态:等待、发送起始位、发送数据位、发送奇偶校验位、发送结束位parameter IDLE=5'b00001,SEND_START=5'b00010,SEND_DATA=5'b00100,SEND_CHECK=5'b01000,SEND_END=5'b10000;parameter IDLE_POS=3'd0,SEND_START_POS=3'd1,SEND_DATA_POS=3'd2,SEND_CHECK_POS=3'd3,SEND_END_POS=3'd4;reg [4:0] cs,ns;//状态转换always @(posedge clk)beginif(rst)cs <= IDLE;elsecs <= ns;end//下一个状态always @(*)beginif(rst)ns = IDLE;elsebeginns = cs;//赋初值case(1'b1)cs[IDLE_POS]: if(receive_ack) ns = SEND_START;//收到高电平,表示接收到发送命令,同时将线路拉低一个时钟周期cs[SEND_START_POS]: ns = SEND_DATA;cs[SEND_DATA_POS]: if(count == 7) ns = SEND_CHECK;//数据位发送完毕,开始发送校验位cs[SEND_CHECK_POS]: ns = SEND_END;cs[SEND_END_POS]: if(receive_ack) ns = SEND_START;default: ns = IDLE;endcaseendend//计数always @(posedge clk)beginif(rst)beginpresult <= 1'b0;//初值为0,为偶校验count <= 4'd0;endelse if(cs == SEND_DATA)beginif(count == 7)count <= 4'd0;elsecount <= count + 1'b1;endelsecount <= 4'd0;end//寄存器移位reg [7:0] data_o_temp;always @(posedge clk)beginif(rst)data_o_temp <= 8'd0;else if(cs == SEND_START)data_o_temp <= data_o;else if (cs == SEND_DATA)data_o_temp [6:0] <= data_o_temp [7:1];//右移elsedata_o_temp <= 8'd0;end//发送数据always @(posedge clk)beginif(rst)txd <= 1'b1;//空闲状态处于高电平else if(cs == SEND_START)txd <= 1'b0;//起始位为低电平else if(cs == SEND_DATA)begintxd <= data_o_temp[0];presult <= presult ^ data_o_temp[0];endelse if(cs == SEND_CHECK)//发送奇偶校验位、发送结束位txd <= presult;else if(cs == SEND_END)//发送停止位txd <= 1'b1;elsetxd <= 1'b1;end
endmodule

2.接收

module uart_rx(rxd,clk,rst,data_i,receive_ack,data_error);input rxd;//接收的bitinput clk;input rst;output [7:0] data_i;output receive_ack;output data_error;//奇偶校验位比较结果输出位reg [7:0] data_i;reg [3:0] count;reg data_error;//定义状态机的4个状态:空闲、接收数据、接收奇偶校验位、停止parameter IDLE=4'b0001,RECEIVE_DATA=4'b0010,RECEIVE_CHECK=4'b0100,RCEIVE_END=4'b1000;parameter IDLE_POS=2'd0,RECEIVE_DATA_POS=2'd1,RECEIVE_CHECK_POS=2'd2,RCEIVE_END_POS=2'd3;reg [3:0] cs,ns;//状态转换always @(posedge clk)beginif(rst)cs <= IDLE;elsecs <= ns;end//下一个状态always @(*)beginif(rst)ns = IDLE;elsebeginns = cs;//赋初值case(1'b1)cs[IDLE_POS]:if(~rxd) ns = RECEIVE_DATA;cs[RECEIVE_DATA_POS]:if(count == 7) ns = RECEIVE_CHECK;cs[RECEIVE_CHECK_POS]: ns = RCEIVE_END;cs[RCEIVE_END_POS]: beginif(~rxd) ns = RECEIVE_DATA;else ns = IDLE;enddefault: ns = IDLE;endcase                                  endend//计数reg presult;//偶校验位always @(posedge clk)beginif(rst)begincount <= 4'd0;presult <= 1'b0;data_error <= 1'b0;endelse if(cs == RECEIVE_DATA)beginif(count == 7)count <= 4'd0;elsecount <= count + 1'b1;endelsecount <= 4'd0;end//接收数据,先接收最低位always @(posedge clk)beginif(rst)data_i <= 8'd0;else if(cs == RECEIVE_DATA)begindata_i[7] <= rxd;data_i[6:0] <= data_i[7:1];presult <= presult ^ rxd;endelse if(cs == RECEIVE_CHECK)beginif(presult == rxd)data_error <= 1'b0;elsedata_error <= 1'b1;endelsedata_i <= 8'd0;        endassign receive_ack = (cs == RECEIVE_CHECK)? 1'b1:1'b0;
endmodule

UART串口通信协议相关推荐

  1. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  2. 通信协议详解(一):UART串口(协议+数据格式+设计实现)

    uart串口通信协议及verilog实现 文章目录 一.uart串口通信简介 二.串口传输 1.数据协议 2.整体架构 三.串口传输实现 1.发送模块 2.接收模块 四.串口收发仿真 总结 一.uar ...

  3. 【FPGA】八、UART串口通信

    文章目录 前言 一.UART简介 1.基本概念 2.UART协议 3.波特率简介 二.UART串口回环实验 1.设计思路 2.程序代码 ① 串口接收模块 ② 串口发送模块 ③ 串口顶层模块 ④ 串口仿 ...

  4. 基于FPGA Uart串口通信实验

    基于FPGA Uart串口通信实验 首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同. UART简介 通用异步收发传输器(Universal Asynchronous Rec ...

  5. FPGA串口(UART)通信协议制定与设计思路详解示例

    串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...

  6. 串口通信协议--UART、RS-232、RS-485、RS-422

    近期学习了单片机及数电相关知识,故决定系统地学习一些通信协议.手边书本仅介绍了串口低速接口的相关协议. 串行通信 是指通过使用一条数据线(需要地线或控制线),将数据一位一位地一次传输,每一位数据占据一 ...

  7. 串口通信协议---UART

    串口通信的分类 UART属于串行.异步.全双工通信 串行通信与并行通信 根据传输数据的位宽,串口通信可分为串行通信与并行通信,串行通信是指设备之间通过少量数据信号线(一般是 8 根以下),地线以及控制 ...

  8. 串口的偶校验位设置_详解UART串口

    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART) 是一种串行异步收发协议,应用十分广泛.UART工作原理是将数据的二进制位 ...

  9. STM32开发 -- UART应用层通信协议分析

    拿到一份UART的通信协议,上手来操作之前先做一下分析. 一.帧格式说明 先看一下它的帧格式说明: 1. 帧头标志Head 不论是命令帧还是响应帧,帧头标志都是0x92. 2. 协议版本 协议版本号( ...

最新文章

  1. JavaScript和快速响应的用户界面
  2. 8953n的user获取权限以及remount
  3. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...
  4. 5-global_data介绍
  5. AjaxFileUpload 在C#中应用
  6. JS中怎样比较两个 时分秒 格式的时间大小
  7. 《人类简史》作者:巨变将至!数据决定你未来是什么物种
  8. 华为畅享max有没有人脸识别_华为三款5000mAh超大电池手机,都是续航王者,最低只要1499元...
  9. 个人总结的【LaTeX】超高频特殊符号表(仅33个符号)+复杂公式速写解决方案,请查收!
  10. 成为Oracle 10g DBA之路
  11. Primavera P6用户密码锁定及管理员忘记密码处理
  12. AUTOSAR Network Wakeup(Can) Configuration
  13. 网址在QQ微信被拦截怎么办 微信屏蔽网址解决办法
  14. MySQL的主键,索引设置和添加
  15. 评测酷睿i5 12500h和i7 12650h差多少 i512500h和i712650h对比
  16. USCD行人异常数据集使用指南 | 快速下载
  17. 屏幕监控软件怎样监控电脑的扩展屏?
  18. 8.ansible高级进阶-role详解
  19. 留几手:互联网创业到底是咋回事(说得真经典,创业者不创业的都值得一看)
  20. 第一次学习使用Pyqt5心得和体会(UI可以生成py文件,UI和业务逻辑最好分开,即UI生成py后,再写一个main.py来放置业务逻辑)

热门文章

  1. Linux桌面需要强制访问控制,Linux强制访问控制机制模块详细描述(1)
  2. Unity游戏开发客户端面经——Unity(初级)
  3. 用户行为分析的指标及其意义
  4. linux 变量替换字符串,shell中常用的变量处理、字符串操作(之一)
  5. 示波器数据用matlab进行fft,示波器CSV波形数据导入Matlab进行FFT分析.doc
  6. 操作Excel导入的问题(转)
  7. ProcessOn‘s Bug--完善个人资料无限扩容
  8. node防止恶意刷短信次数
  9. python正则表达式01
  10. 一个简单的神经网络,三种常见的神经网络