用VHDL設(shè)計(jì)專用串行通信芯片
WTHR.VHD作為整個(gè)芯片的發(fā)送模塊,其中包括發(fā)送保持器、并/串轉(zhuǎn)換。
端口描述如下:
entity wthr is
port (sen:in STD_LOGIC; --發(fā)送使能信號(hào)
whtr: in STD_LOGIC; --寫發(fā)送保持器信號(hào)
dbus: in STD_LOGIC_VECTOR (7 downto 0;
--8位數(shù)據(jù)線,單向
rsthr:in STD_LOGIC; --清發(fā)送保持器
thre:out STD_LOGIC; --發(fā)送保持器數(shù)據(jù)空
thre:out STD_LOGIC; --發(fā)送串行數(shù)據(jù)線
clkout:out STD_LOGIC; --發(fā)送數(shù)據(jù)同步時(shí)鐘信號(hào)
sclk: in STD_LOGIC); --波特率發(fā)生器產(chǎn)生的分頻信號(hào)
end wthr;
當(dāng)發(fā)送保持器無數(shù)據(jù)時(shí),thre信號(hào)有效,通知CPU可寫。一旦CPU寫入數(shù)據(jù)且sen有效,便根據(jù)波特率發(fā)生器產(chǎn)生的sclk信號(hào)將數(shù)據(jù)并/串轉(zhuǎn)換,并通過dout和clkout將串行數(shù)據(jù)和同步時(shí)鐘發(fā)送。
process (rsthr,sclk,sen,sef) --parallel data to serial data variable l:integer range 0 to 7;
begin
if rsthr='1' then
m=0;
1:=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(1);
m=m+1;
l:=1-1;
if m=7 then
m=0;
1:=7;
esf=='1';
end if;
end if;
end if;
end process;
3 實(shí)現(xiàn)難點(diǎn)及使用VHDL應(yīng)注意的一些問題
由于VHDL語(yǔ)言是描述硬件行為的,相對(duì)其它開發(fā)軟件的高級(jí)語(yǔ)言而言,在編程過程中有一些特殊性,所以經(jīng)常會(huì)出現(xiàn)語(yǔ)法正確但無法綜合的問題。其原因多半因?yàn)榫幊陶邔?duì)硬件內(nèi)部的工作原理了解不夠,寫出的代碼硬件無法實(shí)現(xiàn)。通過這塊芯片的設(shè)計(jì),在此總結(jié)出一些應(yīng)注意的問題,供大家參考:
(1)在一個(gè)進(jìn)程中只允許一個(gè)信號(hào)上升沿作為觸發(fā)條件。
(2)信號(hào)值改變后要經(jīng)過一個(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ù)線時(shí),內(nèi)部數(shù)據(jù)線最好讀寫分開。與外部結(jié)合時(shí),不同讀數(shù)據(jù)線之間,讀寫數(shù)據(jù)線之間應(yīng)使用三態(tài)門,且由讀信號(hào)控制。
本設(shè)計(jì)由于采用了VHDL語(yǔ)言作為輸入方式并細(xì)合可編程邏輯門陣列CPLD,大大縮短了設(shè)計(jì)周期,提高了設(shè)計(jì)的可靠性、靈活性,使用戶可根據(jù)自己的需求,方便、高效地設(shè)計(jì)出適合的串行通信芯片。
評(píng)論