Verilog实现UART之一:接收模块_第1页
Verilog实现UART之一:接收模块_第2页
Verilog实现UART之一:接收模块_第3页
Verilog实现UART之一:接收模块_第4页
全文预览已结束

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Verilog实现UART之一:接收模块异步串行数据的一般格式是:起始位+数据位+停止位,其中起始位1位,8位数据位,奇校验、偶校验或无校验位;停止位可以是1、2位,LSBfirst:2.接收原理:由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,采样模块利用16倍数据波特率的时钟进行采样,假设波特率为115200,则采样时钟为clk16x=115200×16。每个数据占据16个采样时钟周期,1bit起始位+8bit数据为+1bit停止位=10bit,因此一帧共占据16×10=160个采样时钟,考虑到每个数据为可能有1-2个采样时钟周期的便宜,因此将各个数据位的中间时刻作为采样点,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。因此,采样时刻为24(跳过起始位的16个时钟)、40、56、72、88、104、120、136、152(停止位),如下图所示:其中,RX为接收引脚,CNT为对采样时钟进行计数的计数器;3.代码实现:

/******************************************************************************

*

*Module:rx_module

*FileName:rx_module.v

*Author:JC_Wang

*Version:1.0

*Date:2012/12/5

*Description:UART接收模块

*

*

********************************************************************************/modulerx_module(

inputGClk,/*systemtopestclock*/

inputclk16x,/*sampleclock,16×115200*/

inputrst_n,/*glabolresetsignal*/

inputrx,/*serialdatain*/

outputregDataReady,/*acompletebytehasbeenreceived*/

outputreg[7:0]DataReceived/*Bytesreceived*/

);/*捕获rx的下降沿,即起始信号*/

regtrigger_r0;

wireneg_tri;

always@(posedgeGClkornegedgerst_n)/*下降沿使用全局时钟来捕获的,其实用clk16x来捕获也可以*/

begin

if(!rst_n)

begin

trigger_r0<=1'b0;

end

else

begin

trigger_r0<=rx;

end

endassignneg_tri=trigger_r0&~rx;//----------------------------------------------

/*countercontrol*/

regcnt_en;

always@(posedgeGClkornegedgerst_n)

begin

if(!rst_n)

cnt_en<=1'b0;

elseif(neg_tri==1'b1)/*如果捕获到下降沿,则开始计数*/

cnt_en<=1'b1;

elseif(cnt==8'd152)

cnt_en<=1'b0;end

//---------------------------------------------

/*countermodule,对采样时钟进行计数*/

reg[7:0]cnt;

always@(posedgeclk16xornegedgerst_n)

begin

if(!rst_n)

cnt<=8'd0;

elseif(cnt_en)

cnt<=cnt+1'b1;

else

cnt<=8'd0;end

//---------------------------------------------

/*receivemodule*/

regStopBit_r;

always@(posedgeclk16xornegedgerst_n)

begin

if(!rst_n)

begin

DataReceived<=8'b0;

end

elseif(cnt_en)

case(cnt)

8'd24:DataReceived[0]<=rx;/*在各个采样时刻,读取接收到的数据*/

8'd40:DataReceived[1]<=rx;

8'd56:DataReceived[2]<=rx;

8'd72:DataReceived[3]<=rx;

8'd88:DataReceived[4]<=rx;

8'd104:DataReceived[5]<=rx;

8'd120:DataReceived[6]<=rx;

8'd136:DataReceived[7]<=rx;endcaseendalways@(posedgeclk16xornegedgerst_n)

begin

if(!rst_n)

DataReady<=1'b0;

elseif(cnt==8'd152)

DataReady<=1'b1;//接收到停止位后,给出数据准备好标志位

else

DataReady<=1'b0;

endendmodule注:1)采样时钟clk16x必须是波特率的16倍,波特率任意设置如57600、9600等皆可,只要满足16倍关系;2)此模块经过测试上万字节的接收,从未出错!3)引入了最高时钟对起始信号下降沿进行捕获,会造成什么不良影响,比如所谓的“时钟满天飞”问题,博主还不清楚,若您有好的讲解,请您发链接给我,在此感谢!4.如果需要校验位的朋友,可以参考xilinx公司的参考设计:

`timescale1ns/1nsmodulercvr(dout,data_ready,framing_error,parity_error,rxd,clk16x,rst,rdn);inputrxd;/*数据接收端*/

inputclk16x;/*采样时钟*/

inputrst;/*复位信号,高电平有效*/

inputrdn;/*数据接收使能,低电平有效*/

output[7:0]dout;/*数据输出*/

outputdata_ready;/*数据接收完毕标志位*/

outputframing_error;/*帧错误标志位*/

outputparity_error;/*校验位错误标志位*/regrxd1;

regrxd2;

regclk1x_enable;

reg[3:0]clkdiv;

reg[7:0]rsr;

reg[7:0]rbr;

reg[3:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论