《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > 用VHDL設(shè)計(jì)專(zhuān)用串行通信芯片

用VHDL設(shè)計(jì)專(zhuān)用串行通信芯片

2009-05-15
作者:付曉宇 吳詩(shī)其

??? 摘? 要: 一種專(zhuān)用串行同步通信芯片(該芯片內(nèi)部結(jié)構(gòu)和操作方式以INS8250為參考)的VHDL設(shè)計(jì)及CPLD實(shí)現(xiàn),著重介紹了用VHDL及CPLD設(shè)計(jì)專(zhuān)用通信芯片的開(kāi)發(fā)流程,、實(shí)現(xiàn)難點(diǎn)及應(yīng)注意的問(wèn)題,。?

??? 關(guān)鍵詞: VHDL? FPGA? CPLD? UART? 統(tǒng)計(jì)時(shí)分復(fù)用器

?

??? 在通信系統(tǒng)中,通信芯片是整個(gè)硬件平臺(tái)的基礎(chǔ),它不僅完成OSI物理層中的數(shù)據(jù)發(fā)送和接收,還能根據(jù)傳輸方式和協(xié)議的不同實(shí)現(xiàn)不同的數(shù)據(jù)校驗(yàn)方式及數(shù)據(jù)組幀格式。?

??? 目前,許多廠商都提供通用的串行通信芯片,其傳輸方式分為同步方式和異步方式,。其中,異步芯片大多與INTEL的8250芯片兼容;而同步方式,由于一般涉及到所支持的傳輸協(xié)議(BSC,、HDLC、SDLC等),所以當(dāng)用戶(hù)要求應(yīng)用特定的同步傳輸協(xié)議時(shí),往往需要設(shè)計(jì)專(zhuān)用的SRT(同步收發(fā)器),。以前,大多采用通用的邏輯元器件進(jìn)行設(shè)計(jì),這導(dǎo)致了設(shè)計(jì)和調(diào)試過(guò)程冗長(zhǎng),、系統(tǒng)穩(wěn)定性不高,非常不便。如今,隨著以FPGA和CPLD為代表的可編程ASIC技術(shù)的日趨成熟和完善,用戶(hù)完全可以根據(jù)自己的需要,以EDA技術(shù)作為開(kāi)發(fā)手段,用一塊FPGA或CPLD設(shè)計(jì)出符合自己需要的芯片,。本文以開(kāi)發(fā)統(tǒng)計(jì)時(shí)分復(fù)用器中的專(zhuān)用同步收發(fā)芯片為例,介紹整個(gè)芯片的開(kāi)發(fā)流程,。?

1 統(tǒng)計(jì)時(shí)分復(fù)用器系統(tǒng)功能及模塊組成?

??? 統(tǒng)計(jì)時(shí)分復(fù)用器完成7路異步數(shù)據(jù)和1路同步數(shù)據(jù)的復(fù)接工作,其功能框圖如圖1所示,同步串口傳輸協(xié)議如圖2所示。由于傳輸距離較近且路數(shù)不多,功能相對(duì)簡(jiǎn)單,。出于系統(tǒng)功耗和成本的考慮,將這個(gè)專(zhuān)用的SRT和整個(gè)接口控制單元集成到一塊CPLD(XC95144)中,。?

?

?

?

2 CPLD內(nèi)部功能框圖及設(shè)計(jì)?

??? CPLD內(nèi)部結(jié)構(gòu)主要由接口控制單元和SRT組成,這里主要介紹一下SRT的結(jié)構(gòu)和功能模塊(見(jiàn)圖3)。由于選用的UART(通用異步收發(fā)器)與INS8250兼容,為簡(jiǎn)化主控單元訪問(wèn)外部通信芯片的程序的編寫(xiě),統(tǒng)一操作流程,在SRT的設(shè)計(jì)上盡量模仿INS8250的結(jié)構(gòu),。?

?

?

??? 本設(shè)計(jì)采用模塊化設(shè)計(jì),。按功能將SRT內(nèi)部結(jié)構(gòu)分為5個(gè)模塊,每一個(gè)模塊對(duì)應(yīng)一個(gè)VHDL的設(shè)計(jì)文件。這樣設(shè)計(jì)的好處是有利于各功能模塊的編寫(xiě)和調(diào)試,從而降低了整個(gè)SRT的調(diào)試難度,提高了軟件的可維護(hù)性及可讀性,。下面給出各個(gè)設(shè)計(jì)文件的外功能簡(jiǎn)介(對(duì)于其中幾個(gè)重要的模塊還列出了端口描述和部分實(shí)現(xiàn)代碼):?

??? (1)SRTCRTL.VHD?

??? SRTCRTL.VHD作為SRT的控制模塊,負(fù)責(zé)地址譯碼,當(dāng)片選信號(hào)有效時(shí)將數(shù)據(jù)線(xiàn)上的數(shù)據(jù)寫(xiě)入相應(yīng)的寄存器,。SRT芯片內(nèi)部共設(shè)有接收緩存器、發(fā)送保持器,、線(xiàn)路控制寄存器,、除數(shù)寄存器(高低8位各1個(gè)),、自環(huán)控制寄存器等6個(gè)控制寄存器,每個(gè)寄存器都被分配了1個(gè)地址,通過(guò)對(duì)相應(yīng)地址進(jìn)行讀寫(xiě),CPU可完成數(shù)據(jù)發(fā)送、接收,、自環(huán)及芯片參數(shù)設(shè)置等操作,。 ?

??? (2)LOOP.VHD?

??? 本模塊的功能是根據(jù)用戶(hù)的指令,對(duì)芯片本身功能進(jìn)行測(cè)試。用戶(hù)首先將芯片設(shè)置為自環(huán)狀態(tài),使芯片內(nèi)部發(fā)送數(shù)據(jù)線(xiàn)與直接接收數(shù)據(jù)線(xiàn)短接;再通過(guò)向發(fā)送保持器寫(xiě)入特定的數(shù)據(jù),與接收緩存器中讀出的數(shù)據(jù)進(jìn)行比較,看兩者是否相同,用戶(hù)即可判斷芯片是否工作正常,。?

??? (3) CLKGEN.VHD?

??? CLKGEN.VHD是波特率發(fā)生器模塊,用來(lái)產(chǎn)生發(fā)送同步的時(shí)鐘信號(hào)doclk,。它將除數(shù)寄存器高低各8位共16位數(shù)據(jù)作為除數(shù),對(duì)外部2MHz的時(shí)鐘源進(jìn)行分頻。用戶(hù)可通過(guò)修改除數(shù)寄存器的值動(dòng)態(tài)地改變數(shù)據(jù)傳輸速率,因此操作方便,、靈活。 ?

??? (4)RBR.VHD?

??? RBR.VHD作為整個(gè)芯片的接收模塊,其中包括接收緩存器,、接收數(shù)據(jù)同步,、串/并轉(zhuǎn)換。?

??? 端口描述如下:?

entity rbr is?

port (diclk: in STD_LOGIC; --接收數(shù)據(jù)同步時(shí)鐘,由發(fā)方提供?

rrbr: in STD_LOGIC;???? ?? --讀接收緩存器信號(hào)?

rsrbr: in STD_LOGIC;?????? --接收緩存器清零信號(hào)?

dbus: out STD_LOGIC_VECTOR (7 downto 0);?--8位數(shù)據(jù)線(xiàn),單向,輸出?

dr: out STD_LOGIC;???????? --接收緩存器數(shù)據(jù)有效信號(hào)?

ren: out STD_LOGIC;??????? --接收使能信號(hào),通知發(fā)方接收方準(zhǔn)備好可發(fā)送數(shù)據(jù)?

di: in STD_LOGIC);???????? --串行接收數(shù)據(jù)線(xiàn)?

end rbr;?

??? 當(dāng)接收緩存器中無(wú)數(shù)據(jù)時(shí),ren信號(hào)有效,通知發(fā)送方傳數(shù)據(jù),。然后根據(jù)dilck對(duì)di信號(hào)采樣,一旦緩存器滿(mǎn),ren無(wú)效,dr 有效,通知CPU讀數(shù),。?

??? 仿真波形如圖4所示。部分代碼如下:?

?

?

process (rsrbr,diclk)?? --serial data to parallel data?

variable l,m: integer range 0 to 8 ;?

begin?

??? if rsrbr='1' then?

??????? s_p<=″00000000″;?

??????? m:=0;?

??????? ef<='1';?

??? elsif diclk'event and diclk='1' then?

??????? l:=7-m;?

??????? s_p(l)<=di;?

??????? m:=m+1;?

??????? If m=8 then?

??????????? m:=0;?

??????????? ef<='0';?

??? end if;?

end if;?

if rrbr='1'? then?

??? dbus<=s_p;?

??????? ef<='1';?

??????? else dbus<=″ZZZZZZZZ″;?

??? end if;?

end process;?

??? (5)WTHR.VHD?

??? WTHR.VHD作為整個(gè)芯片的發(fā)送模塊,其中包括發(fā)送保持器,、并/串轉(zhuǎn)換,。?

??? 端口描述如下:?

entity wthr is?

port (sen: in STD_LOGIC; ?? ???--發(fā)送使能信號(hào)?

??? wthr: in STD_LOGIC;?? ? ???--寫(xiě)發(fā)送保持器信號(hào) ?

??? dbus: in STD_LOGIC_VECTOR (7 downto 0);--8位數(shù)據(jù)線(xiàn),單向?

??? rsthr: in STD_LOGIC;? ? ???--清發(fā)送保持器 ?

??? thre: out STD_LOGIC; ?? ???--發(fā)送保持器數(shù)據(jù)空?

??? dout: out STD_LOGIC;? ? ???--發(fā)送串行數(shù)據(jù)線(xiàn)?

??? clkout: out STD_LOGIC; ??? --發(fā)送數(shù)據(jù)同步時(shí)鐘信號(hào)?

??? sclk: in STD_LOGIC); ?? ???--波特率發(fā)生器產(chǎn)生的分頻信號(hào)?

??? end wthr;?

??? 當(dāng)發(fā)送保持器無(wú)數(shù)據(jù)時(shí),thre信號(hào)有效,通知CPU可寫(xiě)。一旦CPU寫(xiě)入數(shù)據(jù)且sen 有效,便根據(jù)波特率發(fā)生器產(chǎn)生的sclk信號(hào)將數(shù)據(jù)并/串轉(zhuǎn)換,并通過(guò)dout和clkout將串行數(shù)據(jù)和同步時(shí)鐘發(fā)送,。?

??? 仿真波形如圖5,。部分實(shí)現(xiàn)代碼如下:?

?

?

process (rsthr,sclk,sen,sef)? --parallel data to serial data?

variable l:integer range 0 to 7;?

begin?

??? if rsthr='1' then?

??????? m<=0;?

??????? l:=7;?

??????? sef<='1';?

??? elsif wthr='1' then?

????? ??? sef<='0';?

??? elsif sen='1'and sef='0' then?

??????? if sclk'event and sclk='1' then?

??????????? dout<=w_p(l);?

??????????? m<=m+1;?

??????????? l:=l-1;?

??????????? if m=7 then?

??????????????? m<=0;?

??????????????? l:=7;?

??????????????? sef<='1';?

??????? end if;?

????? end if;?

??? end if;?

end process;?

3 實(shí)現(xiàn)難點(diǎn)及使用VHDL應(yīng)注意的一些問(wèn)題?

??? 由于VHDL語(yǔ)言是描述硬件行為的,相對(duì)其它開(kāi)發(fā)軟件的高級(jí)語(yǔ)言而言,在編程過(guò)程中有一些特殊性,所以經(jīng)常會(huì)出現(xiàn)語(yǔ)法正確但無(wú)法綜合的問(wèn)題。其原因多半因?yàn)榫幊陶邔?duì)硬件內(nèi)部的工作原理了解不夠,寫(xiě)出的代碼硬件無(wú)法實(shí)現(xiàn),。通過(guò)這塊芯片的設(shè)計(jì),在此總結(jié)出一些應(yīng)注意的問(wèn)題,供大家參考:?

??? (1)在一個(gè)進(jìn)程中只允許一個(gè)信號(hào)上升沿作為觸發(fā)條件,。?

??? (2)信號(hào)值改變后要經(jīng)過(guò)一個(gè)小的延時(shí)才能生效,同個(gè)信號(hào)不能在多個(gè)進(jìn)程中賦值(因?yàn)槎鄠€(gè)信號(hào)源不能同時(shí)對(duì)同一個(gè)信號(hào)驅(qū)動(dòng))。?

??? (3)時(shí)序電路和組合電路最好不要在同一個(gè)進(jìn)程中,以免費(fèi)資源,。?

??? (4)一個(gè)功能模塊最好按上升沿信號(hào)分多個(gè)進(jìn)程完成,各進(jìn)程間用信號(hào)聯(lián)系,。?

??? (5)同一個(gè)信號(hào)在進(jìn)程中的值改變后,要注意該值改變前后該進(jìn)程中其它變量的變化,避免邏輯死鎖。?

??? (6)在順序語(yǔ)句中,注意信號(hào)因賦值后需延時(shí)改變而與變量的不同,。?

??? (7)設(shè)計(jì)雙向三態(tài)數(shù)據(jù)線(xiàn)時(shí),內(nèi)部數(shù)據(jù)線(xiàn)最好讀寫(xiě)分開(kāi),。與外部結(jié)合時(shí),不同讀數(shù)據(jù)線(xiàn)之間,讀寫(xiě)數(shù)據(jù)線(xiàn)之間應(yīng)使用三態(tài)門(mén),且由讀信號(hào)控制。?

??? 本設(shè)計(jì)由于采用了VHDL語(yǔ)言作為輸入方式并結(jié)合可編程邏輯門(mén)陣列CPLD,大大縮短了設(shè)計(jì)周期,提高了設(shè)計(jì)的可靠性,、靈活性,使用戶(hù)可根據(jù)自己的需求,方便,、高效地設(shè)計(jì)出合適的串行通信芯片。?

參考文獻(xiàn)?

1 潘名蓮,馬 爭(zhēng).微計(jì)算機(jī)原理.北京:電子工業(yè)出版社,1994?

2 候伯亨,顧 新.VHDL硬件描述語(yǔ)言與數(shù)字邏輯電路設(shè)計(jì).西安:西安電子科技大學(xué)出版社,1999?

3 李廣軍,孟憲元.可編程ASIC設(shè)計(jì)及應(yīng)用.成都:電子科技大學(xué)出版社,1999?

4 DATABOOK.XILINX 公司,1999

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問(wèn)題,,請(qǐng)及時(shí)通過(guò)電子郵件或電話(huà)通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話(huà):010-82306118;郵箱:[email protected],。