??? 摘? 要: 一種專用串行同步通信芯片(該芯片內部結構和操作方式以INS8250為參考)的VHDL設計及CPLD實現,著重介紹了用VHDL及CPLD設計專用通信芯片的開發流程、實現難點及應注意的問題。?
??? 關鍵詞: VHDL? FPGA? CPLD? UART? 統計時分復用器
?
??? 在通信系統中,通信芯片是整個硬件平臺的基礎,它不僅完成OSI物理層中的數據發送和接收,還能根據傳輸方式和協議的不同實現不同的數據校驗方式及數據組幀格式。?
??? 目前,許多廠商都提供通用的串行通信芯片,其傳輸方式分為同步方式和異步方式。其中,異步芯片大多與INTEL的8250芯片兼容;而同步方式,由于一般涉及到所支持的傳輸協議(BSC、HDLC、SDLC等),所以當用戶要求應用特定的同步傳輸協議時,往往需要設計專用的SRT(同步收發器)。以前,大多采用通用的邏輯元器件進行設計,這導致了設計和調試過程冗長、系統穩定性不高,非常不便。如今,隨著以FPGA和CPLD為代表的可編程ASIC技術的日趨成熟和完善,用戶完全可以根據自己的需要,以EDA技術作為開發手段,用一塊FPGA或CPLD設計出符合自己需要的芯片。本文以開發統計時分復用器中的專用同步收發芯片為例,介紹整個芯片的開發流程。?
1 統計時分復用器系統功能及模塊組成?
??? 統計時分復用器完成7路異步數據和1路同步數據的復接工作,其功能框圖如圖1所示,同步串口傳輸協議如圖2所示。由于傳輸距離較近且路數不多,功能相對簡單。出于系統功耗和成本的考慮,將這個專用的SRT和整個接口控制單元集成到一塊CPLD(XC95144)中。?
?
?
?
2 CPLD內部功能框圖及設計?
??? CPLD內部結構主要由接口控制單元和SRT組成,這里主要介紹一下SRT的結構和功能模塊(見圖3)。由于選用的UART(通用異步收發器)與INS8250兼容,為簡化主控單元訪問外部通信芯片的程序的編寫,統一操作流程,在SRT的設計上盡量模仿INS8250的結構。?
?
?
??? 本設計采用模塊化設計。按功能將SRT內部結構分為5個模塊,每一個模塊對應一個VHDL的設計文件。這樣設計的好處是有利于各功能模塊的編寫和調試,從而降低了整個SRT的調試難度,提高了軟件的可維護性及可讀性。下面給出各個設計文件的外功能簡介(對于其中幾個重要的模塊還列出了端口描述和部分實現代碼):?
??? (1)SRTCRTL.VHD?
??? SRTCRTL.VHD作為SRT的控制模塊,負責地址譯碼,當片選信號有效時將數據線上的數據寫入相應的寄存器。SRT芯片內部共設有接收緩存器、發送保持器、線路控制寄存器、除數寄存器(高低8位各1個)、自環控制寄存器等6個控制寄存器,每個寄存器都被分配了1個地址,通過對相應地址進行讀寫,CPU可完成數據發送、接收、自環及芯片參數設置等操作。 ?
??? (2)LOOP.VHD?
??? 本模塊的功能是根據用戶的指令,對芯片本身功能進行測試。用戶首先將芯片設置為自環狀態,使芯片內部發送數據線與直接接收數據線短接;再通過向發送保持器寫入特定的數據,與接收緩存器中讀出的數據進行比較,看兩者是否相同,用戶即可判斷芯片是否工作正常。?
??? (3) CLKGEN.VHD?
??? CLKGEN.VHD是波特率發生器模塊,用來產生發送同步的時鐘信號doclk。它將除數寄存器高低各8位共16位數據作為除數,對外部2MHz的時鐘源進行分頻。用戶可通過修改除數寄存器的值動態地改變數據傳輸速率,因此操作方便、靈活。 ?
??? (4)RBR.VHD?
??? RBR.VHD作為整個芯片的接收模塊,其中包括接收緩存器、接收數據同步、串/并轉換。?
??? 端口描述如下:?
entity rbr is?
port (diclk: in STD_LOGIC; --接收數據同步時鐘,由發方提供?
rrbr: in STD_LOGIC;???? ?? --讀接收緩存器信號?
rsrbr: in STD_LOGIC;?????? --接收緩存器清零信號?
dbus: out STD_LOGIC_VECTOR (7 downto 0);?--8位數據線,單向,輸出?
dr: out STD_LOGIC;???????? --接收緩存器數據有效信號?
ren: out STD_LOGIC;??????? --接收使能信號,通知發方接收方準備好可發送數據?
di: in STD_LOGIC);???????? --串行接收數據線?
end rbr;?
??? 當接收緩存器中無數據時,ren信號有效,通知發送方傳數據。然后根據dilck對di信號采樣,一旦緩存器滿,ren無效,dr 有效,通知CPU讀數。?
??? 仿真波形如圖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作為整個芯片的發送模塊,其中包括發送保持器、并/串轉換。?
??? 端口描述如下:?
entity wthr is?
port (sen: in STD_LOGIC; ?? ???--發送使能信號?
??? wthr: in STD_LOGIC;?? ? ???--寫發送保持器信號 ?
??? dbus: in STD_LOGIC_VECTOR (7 downto 0);--8位數據線,單向?
??? rsthr: in STD_LOGIC;? ? ???--清發送保持器 ?
??? thre: out STD_LOGIC; ?? ???--發送保持器數據空?
??? dout: out STD_LOGIC;? ? ???--發送串行數據線?
??? clkout: out STD_LOGIC; ??? --發送數據同步時鐘信號?
??? sclk: in STD_LOGIC); ?? ???--波特率發生器產生的分頻信號?
??? end wthr;?
??? 當發送保持器無數據時,thre信號有效,通知CPU可寫。一旦CPU寫入數據且sen 有效,便根據波特率發生器產生的sclk信號將數據并/串轉換,并通過dout和clkout將串行數據和同步時鐘發送。?
??? 仿真波形如圖5。部分實現代碼如下:?
?
?
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 實現難點及使用VHDL應注意的一些問題?
??? 由于VHDL語言是描述硬件行為的,相對其它開發軟件的高級語言而言,在編程過程中有一些特殊性,所以經常會出現語法正確但無法綜合的問題。其原因多半因為編程者對硬件內部的工作原理了解不夠,寫出的代碼硬件無法實現。通過這塊芯片的設計,在此總結出一些應注意的問題,供大家參考:?
??? (1)在一個進程中只允許一個信號上升沿作為觸發條件。?
??? (2)信號值改變后要經過一個小的延時才能生效,同個信號不能在多個進程中賦值(因為多個信號源不能同時對同一個信號驅動)。?
??? (3)時序電路和組合電路最好不要在同一個進程中,以免費資源。?
??? (4)一個功能模塊最好按上升沿信號分多個進程完成,各進程間用信號聯系。?
??? (5)同一個信號在進程中的值改變后,要注意該值改變前后該進程中其它變量的變化,避免邏輯死鎖。?
??? (6)在順序語句中,注意信號因賦值后需延時改變而與變量的不同。?
??? (7)設計雙向三態數據線時,內部數據線最好讀寫分開。與外部結合時,不同讀數據線之間,讀寫數據線之間應使用三態門,且由讀信號控制。?
??? 本設計由于采用了VHDL語言作為輸入方式并結合可編程邏輯門陣列CPLD,大大縮短了設計周期,提高了設計的可靠性、靈活性,使用戶可根據自己的需求,方便、高效地設計出合適的串行通信芯片。?
參考文獻?
1 潘名蓮,馬 爭.微計算機原理.北京:電子工業出版社,1994?
2 候伯亨,顧 新.VHDL硬件描述語言與數字邏輯電路設計.西安:西安電子科技大學出版社,1999?
3 李廣軍,孟憲元.可編程ASIC設計及應用.成都:電子科技大學出版社,1999?
4 DATABOOK.XILINX 公司,1999