0:起始位,低电平;1~8:数据位;9:校验位,高电平;10:停止位,高电平。

波特率 “9600bps”表示每秒可以传输9600位。

波特率定时计数器由时钟频率除以波特率。

采集1~8位,忽略0、9、10位。

发送“0、8位数据、1、1”

串口传输数据,从最低位开始,到最高位结束。

串口发送:

module tx_bps_module
(
CLK, RSTn,
Count_Sig,
BPS_CLK
); input CLK;
input RSTn;
input Count_Sig;
output BPS_CLK; /***************************/ reg [:]Count_BPS; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Count_BPS <= 'd0;
else if( Count_BPS == 'd5207 )
Count_BPS <= 'd0;
else if( Count_Sig )
Count_BPS <= Count_BPS + 'b1;
else
Count_BPS <= 'd0; /********************************/ assign BPS_CLK = ( Count_BPS == 'd2604 ) ? 1'b1 : 'b0; /*********************************/ endmodule
module tx_control_module
(
CLK, RSTn,
TX_En_Sig, TX_Data, BPS_CLK,
TX_Done_Sig, TX_Pin_Out ); input CLK;
input RSTn; input TX_En_Sig;
input [:]TX_Data;
input BPS_CLK; output TX_Done_Sig;
output TX_Pin_Out; /********************************************************/ reg [:]i;
reg rTX;
reg isDone; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 'd0;
rTX <= 'b1;
isDone <= 'b0;
end
else if( TX_En_Sig )
case ( i ) 'd0 :
if( BPS_CLK ) begin i <= i + 'b1; rTX <= 1'b0; end 'd1, 4'd2, 'd3, 4'd4, 'd5, 4'd6, 'd7, 4'd8 :
if( BPS_CLK ) begin i <= i + 'b1; rTX <= TX_Data[ i - 1 ]; end 'd9 :
if( BPS_CLK ) begin i <= i + 'b1; rTX <= 1'b1; end 'd10 :
if( BPS_CLK ) begin i <= i + 'b1; rTX <= 1'b1; end 'd11 :
if( BPS_CLK ) begin i <= i + 'b1; isDone <= 1'b1; end 'd12 :
begin i <= 'd0; isDone <= 1'b0; end endcase /********************************************************/ assign TX_Pin_Out = rTX;
assign TX_Done_Sig = isDone; /*********************************************************/ endmodule
module tx_module
(
CLK, RSTn,
TX_Data, TX_En_Sig,
TX_Done_Sig, TX_Pin_Out
); input CLK;
input RSTn;
input [:]TX_Data;
input TX_En_Sig;
output TX_Done_Sig;
output TX_Pin_Out; /********************************/ wire BPS_CLK; tx_bps_module U1
(
.CLK( CLK ),
.RSTn( RSTn ),
.Count_Sig( TX_En_Sig ), // input - from U2
.BPS_CLK( BPS_CLK ) // output - to U2
); /*********************************/ tx_control_module U2
(
.CLK( CLK ),
.RSTn( RSTn ),
.TX_En_Sig( TX_En_Sig ), // input - from top
.TX_Data( TX_Data ), // input - from top
.BPS_CLK( BPS_CLK ), // input - from U2
.TX_Done_Sig( TX_Done_Sig ), // output - to top
.TX_Pin_Out( TX_Pin_Out ) // output - to top
); /***********************************/ endmodule

串口接受

module detect_module
(
CLK, RSTn,
RX_Pin_In,
H2L_Sig
);
input CLK;
input RSTn;
input RX_Pin_In;
output H2L_Sig; /******************************/ reg H2L_F1;
reg H2L_F2; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
H2L_F1 <= 'b1;
H2L_F2 <= 'b1;
end
else
begin
H2L_F1 <= RX_Pin_In;
H2L_F2 <= H2L_F1;
end /***************************************/ assign H2L_Sig = H2L_F2 & !H2L_F1; /***************************************/ endmodule
module rx_control_module
(
CLK, RSTn,
H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig,
Count_Sig, RX_Data, RX_Done_Sig ); input CLK;
input RSTn; input H2L_Sig;
input RX_En_Sig;
input RX_Pin_In;
input BPS_CLK; output Count_Sig;
output [:]RX_Data;
output RX_Done_Sig; /********************************************************/ reg [:]i;
reg [:]rData;
reg isCount;
reg isDone; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 'd0;
rData <= 'd0;
isCount <= 'b0;
isDone <= 'b0;
end
else if( RX_En_Sig )
case ( i ) 'd0 :
if( H2L_Sig ) begin i <= i + 'b1; isCount <= 1'b1; end /*进入第0位,同时驱动bps_module开始计数。又以bps_module驱动状态1~11*/ 'd1 :
if( BPS_CLK ) begin i <= i + 'b1; end /*第0位中部,BPS_CLK发出第一个脉冲,忽略第0位*/ 'd2, 4'd3, 'd4, 4'd5, 'd6, 4'd7, 'd8, 4'd9 :
if( BPS_CLK ) begin i <= i + 'b1; rData[ i - 2 ] <= RX_Pin_In; end 'd10 :
if( BPS_CLK ) begin i <= i + 'b1; end 'd11 :
if( BPS_CLK ) begin i <= i + 'b1; end 'd12 :
begin i <= i + 'b1; isDone <= 1'b1; isCount <= 'b0; end 'd13 :
begin i <= 'd0; isDone <= 1'b0; end endcase /********************************************************/ assign Count_Sig = isCount;
assign RX_Data = rData;
assign RX_Done_Sig = isDone; /*********************************************************/ endmodule
module rx_bps_module
(
CLK, RSTn,
Count_Sig,
BPS_CLK
); input CLK;
input RSTn;
input Count_Sig;
output BPS_CLK; /***************************/ reg [:]Count_BPS; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Count_BPS <= 'd0;
else if( Count_BPS == 'd5207 )
Count_BPS <= 'd0;
else if( Count_Sig )
Count_BPS <= Count_BPS + 'b1;
else
Count_BPS <= 'd0; /********************************/ assign BPS_CLK = ( Count_BPS == 'd2604 ) ? 1'b1 : 'b0; /*周期中间开始采集数据*/ /*********************************/ endmodule
module rx_module
(
CLK, RSTn,
RX_Pin_In, RX_En_Sig,
RX_Done_Sig, RX_Data
); input CLK;
input RSTn; input RX_Pin_In;
input RX_En_Sig; output [:]RX_Data;
output RX_Done_Sig; /**********************************/ wire H2L_Sig; detect_module U1
(
.CLK( CLK ),
.RSTn( RSTn ),
.RX_Pin_In( RX_Pin_In ), // input - from top
.H2L_Sig( H2L_Sig ) // output - to U3
); /**********************************/ wire BPS_CLK; rx_bps_module U2
(
.CLK( CLK ),
.RSTn( RSTn ),
.Count_Sig( Count_Sig ), // input - from U3
.BPS_CLK( BPS_CLK ) // output - to U3
); /**********************************/ wire Count_Sig; rx_control_module U3
(
.CLK( CLK ),
.RSTn( RSTn ), .H2L_Sig( H2L_Sig ), // input - from U1
.RX_En_Sig( RX_En_Sig ), // input - from top
.RX_Pin_In( RX_Pin_In ), // input - from top
.BPS_CLK( BPS_CLK ), // input - from U2 .Count_Sig( Count_Sig ), // output - to U2
.RX_Data( RX_Data ), // output - to top
.RX_Done_Sig( RX_Done_Sig ) // output - to top ); /************************************/ endmodule

Verilog之串口(UART)通信的更多相关文章

  1. mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

    这个仅仅能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.传输数据完后.DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系 ...

  2. [转]UART通信简介

    1.前言 UART通信,即通用异步收发传输器(Universal Asynchronous Receiver/Transmitter). 串行通信是指利用一条传输线将资料一位位地顺序传送.特点是通信线 ...

  3. Arduino与Air800开发板使用UART通信:传输DHT22传感器数据

    硬件介绍 Arduino Leonardo在数字引脚0(RX)和1(TX)进行串口通信时是使用“Serial1”,USB的串口通信使用的是“Serial”.在数字引脚0(RX)和1(TX)与USB是相 ...

  4. 串口UART学习笔记(一)

    买了一个开发板学习FPGA,找到的各种东西就记录在这个博客里了,同时也方便把自己不会的问题找到的结果记录一下,都是自己手打,所以可能说的话不那么严谨,不那么精准,看到的人要带着自己的思考去看,记住尽信 ...

  5. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  6. ZigBee学习三 UART通信

    ZigBee学习三 UART通信 在使用串口时,只需掌握ZigBee协议栈提供的串口操作相关的三个函数即可. uint8 HalUARTOpen(uint8 port,halUARTCfg_t *co ...

  7. 痞子衡嵌入式:嵌入式里串口(UART)自动波特率识别程序设计与实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里串口(UART)自动波特率识别程序设计与实现. 串口(UART)是嵌入式里最基础最常用也最简单的一种通讯(数据传输)方式,可以说 ...

  8. 如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台

    [原][FAQ03891] 如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台 2014-11-26阅读1369 评论0 FAQ Content [Description]如何在U ...

  9. 第011课_串口(UART)的使用

    from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver ...

随机推荐

  1. 关于CGContextSetBlendMode: invalid context 0x0的错误

    在ios 7的模拟器中,选择一个输入框准备输入时,会触发这个错误,以下是出错详细日志: <Error>: CGContextSetBlendMode: invalid context 0x ...

  2. 【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的

    在这个示例工程的main.c文件中,进入main之后,没有发现串口功能的任何配置.直接使用了printf这个东西进行输出.将软件下载到开发板上之后,在电脑端使用串口软件,可以看板子有数据发来.说明这个 ...

  3. SQLLite 学习笔记

    1.SQLLite 简介 2.命令行使用 3.常用GUI管理工具

  4. Codeforces Round #378 (Div. 2) D - Kostya the Sculptor

    Kostya the Sculptor 这次cf打的又是心累啊,果然我太菜,真的该认真学习,不要随便的浪费时间啦 [题目链接]Kostya the Sculptor &题意: 给你n个长方体, ...

  5. Python正则表达式指南

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  6. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  7. JVM参数(二)参数分类和即时(JIT)编译器诊断

    在这个系列的第二部分,我来介绍一下HotSpot JVM提供的不同类别的参数.我同样会讨论一些关于JIT编译器诊断的有趣参数. JVM 参数分类 HotSpot JVM 提供了三类参数.第一类包括了标 ...

  8. angularjs的touch事件

    angularJs没有touch事件.这里提供一个touch指令. ngTouch.js "use strict"; angular.module("ngTouch&qu ...

  9. Mac下导出chrome插件

    chrome最强大的功能之一就是插件,有时候需要给小伙伴们共享一些插件,所以需要将自己chrome中的插件打包,在mac下打包插件还是挺费劲的,在此记录. 打开chrome的扩展程序,找到要导出的插件 ...

  10. px,pt,em,rem

    一直对px,pt,em,rem的认识有误区,现整理一下,供参考.之后还得整理下关于dpi相关的知识. px(pixe,像素l):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物 ...