VHDL串口通信_第1頁
VHDL串口通信_第2頁
VHDL串口通信_第3頁
VHDL串口通信_第4頁
VHDL串口通信_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、4 .UART模塊設(shè)計UART異步通信串口協(xié)議的VHDL實現(xiàn)包括 3 個基本模塊:時鐘分頻、接收模塊和發(fā)送模塊,下面逐一介紹其實現(xiàn)方法。4.2.1 時鐘分頻模塊由于 UART是異步傳輸,沒有傳輸同步時鐘。為了能保證數(shù)據(jù)傳輸?shù)恼_性,UART采用 16 倍數(shù)據(jù)波特率的時鐘進行采樣。每個數(shù)據(jù)有 16 個時鐘采樣,取中間的采樣值,以保證采樣不會滑碼或誤碼。一般 UART一幀的數(shù)據(jù)位數(shù)為 8,這樣即使每個數(shù)據(jù)有一個時鐘的誤差,接收端也能正確地采樣到數(shù)據(jù)。這里采用常用的數(shù)據(jù)波特率為9600bps,則所需時鐘的頻率為16*9600。系統(tǒng)時鐘為 50MHz,則分頻系數(shù)為50000000/(16*9600)

2、=325.52,取整為 325。分頻器實現(xiàn)相對簡單,這里對其設(shè)計流程圖不做詳細介紹。只是將設(shè)計過程和結(jié)果簡述如下:首先用 VHDL語言進行設(shè)計輸入,并生成模塊文件如圖4.3 所示,其中clk為 50M系統(tǒng)時鐘輸入, clkout為 325 分頻后時鐘輸出。圖 4.3分頻模塊然后建立波形文件,對以上模塊進行時序仿真,仿真結(jié)果如圖4.4 所示,方正結(jié)果說明,分頻輸出實現(xiàn)了對輸入的325 分頻,分頻模塊設(shè)計正確。圖 4.4分頻模塊仿真結(jié)果4.2.2 UART 發(fā)送模塊發(fā)送過程:空閑狀態(tài),線路處于高電平;當(dāng)受到發(fā)送數(shù)據(jù)指令后,拉低線路一個數(shù)據(jù)位的時間 T,接著數(shù)據(jù)按地位到高位依次發(fā)送,數(shù)據(jù)發(fā)送完畢后,

3、接著發(fā)送停止位(停止位為高電平) ,一幀數(shù)據(jù)發(fā)送結(jié)束。( 1) 模塊流程圖根據(jù)以上發(fā)送過程,發(fā)送模塊算法示意圖設(shè)計如圖4.5 所示。開始Nwrsig=1YNidle=0Y發(fā)送數(shù)據(jù)N停止位Y結(jié)束圖 4.5 UART 發(fā)送數(shù)據(jù)算法示意圖( 2)生成模塊文件新建一原理圖文件, 將 VHDL源文件生成對應(yīng)的模塊文件如圖 4.6 所示,其中 clk 為時鐘輸入,datain 為需要發(fā)送的數(shù)據(jù)輸入, wrsig 為發(fā)送命令輸入, idle 為忙閑信號輸出, tx 為串行數(shù)據(jù)輸出端。圖 4.6 UART 發(fā)送模塊( 3) 波形仿真要對發(fā)送模塊進行時序仿真必須設(shè)計一測試模塊,即在每一個clk 來時產(chǎn)生一個八位

4、的數(shù)據(jù)。測試模塊代碼如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity testuart isport(clk:in std_logic;dataout: out std_logic_vector(7 downto 0);wrsig:out std_logic);end testuart;architecture one of testuart issignal dataoutreg: std_logic_vector(7

5、downto 0);signal cnt :std_logic_vector(7 downto 0);begindataout=dataoutreg;process(clk)beginif(clkevent and clk=1) thenif(cnt=11111110)thendataoutreg=dataoutreg+00000001;wrsig=1;cnt=00000000;elsewrsig=0;cnt=cnt+00000001;end if;end if;end process;end one;保存文件為 testuart.hdl,單擊 Files Create/Update Crea

6、te SymbolFiles for Current File命令,為 testuart.hdl生成原理圖模塊。新建一個原理圖文件,各個模塊的連接如圖 4.7 所示。在原理圖的適當(dāng)位置放置 testuart 模塊和 uarttx 模塊,并添加輸入輸出端口。圖 4.7 UART 發(fā)送模塊仿真原理圖保存原理圖為 uarttxts.bdf。編譯工程文件, 編譯無誤后新建波形仿真文件,加入輸入輸出信號,設(shè)置系統(tǒng)時鐘信號clk的周期為 20ns,保存波形文件為 uarttxts.vwf,進行 UART數(shù)據(jù)發(fā)送的波形仿真,波形仿真報告如圖4.8 所示圖 4.8 UART 發(fā)送模塊仿真結(jié)果對上圖分析看出,當(dāng)

7、發(fā)送命令wrsig 的上升沿有效時,啟動發(fā)送數(shù)據(jù)。串行數(shù)據(jù)的波形與發(fā)送數(shù)據(jù)dataout 相一致, UART的發(fā)送模塊得到正確驗證。4.2.3 UART 接收模塊UART接收模塊的功能: 時時檢測線路, 當(dāng)線路產(chǎn)生下降沿時, 即認為線路有數(shù)據(jù)傳輸,啟動接收數(shù)據(jù)進程進行接收,按從低位到高位接收數(shù)據(jù)。( 1) 模塊流程圖根據(jù)以上描述的接收模塊的功能,可將接收模塊算法示意圖設(shè)計如圖4.9所示。開始Nrx=0YNidle=0Y接收數(shù)據(jù)N停止位Y結(jié)束圖 4.9接收模塊算法示意圖( 2) 生成模塊文件新建一原理圖文件,將 VHDL源文件生成對應(yīng)的模塊文件如圖 4.10 所示,其中 clk 為時鐘輸入, r

8、x 為需要串行數(shù)據(jù)輸入, dataout 為并行輸出, rdsig 為忙閑信號輸出。圖 4.10 UART 接收模塊( 3) 波形仿真新建一個原理圖文件,加入各功能模塊,并添加輸入輸出端口,各個模塊的連接如圖 4.11 所示。圖 4.11 UART 接收模塊仿真原理圖保存原理圖為uartrxts.bdf。編譯工程文件,編譯無誤后新建波形仿真文件,加入輸入輸出信號,設(shè)置系統(tǒng)時鐘clk 為 50MHz,保存為 uartrxts.vwf,進行 UART數(shù)據(jù)接收的波形仿真,波形仿真報告如圖4.12 所示。圖 4.12 UART 接收模塊仿真結(jié)果對上圖分析看出, UART接收模塊接收到的數(shù)據(jù)與 UART

9、發(fā)送模塊發(fā)送的數(shù)據(jù)相一至,每接收到一個數(shù)據(jù)都有一個讀取數(shù)據(jù)指示 rdisg ,UART接收模塊得到正確驗證。4.2.3硬件測試按照下圖連接個模塊, 在 PC機上安裝一個串口調(diào)試工具, 通過串口調(diào)試工具向 FPGA發(fā)送一個數(shù)據(jù),看在PC機上能否接受到發(fā)送的數(shù)據(jù)。測試結(jié)果如下附錄:程序代碼UART分頻模塊代碼:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clkdiv isport(clk:in std_logic;clkout

10、: out std_logic);end clkdiv;architecture one of clkdiv issignal cnt:std_logic_vector(15 downto 0);beginprocess(clk)beginif(clkevent and clk=1)thenif(cnt=00010)thenclkout=1;cnt=cnt+00001;elsif(cnt=00100)thenclkout=0;cnt=00000;elsecnt=cnt+00001;end if;end if;end process;end one;UART 發(fā)送模塊代碼:library iee

11、e;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity uarttx isport(clk : in std_logic;datain: in std_logic_vector(7 downto 0);wrsig: in std_logic;idle: out std_logic;tx:out std_logic);end uarttx;architecture one of uarttx issignal send:std_logic;signal wr

12、sigbuf:std_logic;signal idlereg:std_logic;signal wrsigrise:std_logic;signal cnt:std_logic_vector(7 downto 0);beginidle=idlereg;-process(clk)beginif(clkevent and clk=1)thenwrsigbuf=wrsig;wrsigrise=(not wrsigbuf) and wrsig;end if;end process;-process(clk)beginif(clkevent and clk=1)thenif(wrsigrise=1 a

13、nd (not idlereg=1)thensend=1;elsif(cnt=10100000) thensendtx=0;idlereg=1;cnttx=datain(0);idlereg=1;cnttx=datain(1);idlereg=1;cnttx=datain(2);idlereg=1;cnttx=datain(3);idlereg=1;cnttx=datain(4);idlereg=1;cnttx=datain(5);idlereg=1;cnttx=datain(6);idlereg=1;cnttx=datain(7);idlereg=1;cnttx=1;idlereg=1;cn

14、ttx=1;idlereg=0;cntcnt=cnt+00000001;end case;elsetx=1;cnt=00000000;idlereg=0;end if;end if;end process;end one;UART接收模塊代碼:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity uartrx isport(clk:in std_logic;rx: in std_logic;dataout:out std_logic

15、_vector(7 downto 0);rdsig: out std_logic);end uartrx;architecture one of uartrx issignal dataoutreg:std_logic_vector(7 downto 0);signal rdsigreg: std_logic;signal cnt:std_logic_vector(7 downto 0);signal rxbuf:std_logic;signal rxfall:std_logic;signal receive:std_logic;signal idle:std_logic;begin-proc

16、ess(clk)beginif(clkevent and clk=1)thenrxbuf=rx;if (rxbuf=1 andrx=0)thenrxfall=1;elserxfall=0;end if;end if;end process;-process(clk)beginif(clkevent and clk=1)thenif(rxfall=1 and idle=0 ) thenreceive=1;elsif (cnt=10011000) thenreceiveidle=1;cnt=cnt+00000001;rdsigidle=1;dataout(0)=rx;cnt=cnt+0000000

17、1;rdsigidle=1;dataout(1)=rx;cnt=cnt+00000001;rdsigidle=1;dataout(2)=rx;cnt=cnt+00000001;rdsigidle=1;dataout(3)=rx;cnt=cnt+00000001;rdsigidle=1;dataout(4)=rx;cnt=cnt+00000001;rdsigidle=1;dataout(5)=rx;cnt=cnt+00000001;rdsigidle=1;dataout(6)=rx;cnt=cnt+00000001;rdsigidle=1;dataout(7)=rx;cnt=cnt+000000

18、01;rdsig-idle=1;-cnt=cnt+00000001;-rdsigcnt=cnt+00000001;end case;elsecnt=00000000;idle=0;rdsig=0;end if;end if;end process;-end one;UART測試模塊代碼:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity testuart isport(clk:in std_logic;dataout: out std_logic_vector(7 downto 0);wrsig:out std_logic);end testuart;architecture one of testuart issignal dataoutreg: std_logic_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論