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

提交評論