摘 要:討論了 VHDL語言在 EDA中的諸多優點,結合定時/計數接口芯片的開發實例,討論了ISP技術在電子設計自動化中的應用。同時給出了實例的具體例程和時序仿真波形。
關鍵詞:在系統可編程;電子設計自動化;定時/計數接口芯片
1.引言
在計算機控制系統中,經常用到可編程接口芯片完成控制系統I/O接口。這類芯片基本都是完成單一功能接口,如果控制系統比較復雜,系統設計的硬件開銷較大。另外給系統的開發過程無形之中帶來較大的工作量。隨著在系統可編程技術 (in system programmable,ISP)及其isPLD芯片的發展,使得電子產品的實現手段發生了根本性的變化,代表了電子設計領域的發展方向:在設計方法上,從“電路設計—硬件搭試—焊接”的傳統方式到“功能設計—軟件模擬—下載”的電子設計自動化(EDA)模式,大大縮短了開發周期和人力物力,在器件使用上,也由分立元件、中小規模標準芯片過渡到可編程邏輯器件。采用先進的ISP技術可以快速方便地在一片PLD上開發實現某種功能的專用集成電路(ASIC),使系統達到簡,同時具有體小量輕、功耗小、速度高(邏輯硬件執行一個操作只需若干級的器件延遲)等特點,并且由于PLD芯片可重復編程使用(高達上千次),使得設計風險幾乎為零。本文采用VHDL語言開發計算機中的接口芯片,由于占用PLD資源很少,完全可以嵌入到PLD中與其它系統資源共用同一個PLD。由于篇幅有限,本文只介紹8253其中的三種工作方式的實現方法。
2.開發實例
2.1 8253方式0——計完一個數時中斷
這種工作方式的特點是:計數器只計一遍,當計數到0時,并不恢復計數值,不開始重新計數,且輸出保持為高。只有在寫入另一個計數值時,OUT變低開始新的計數。在技術過程中,可由門控信號GATE控制暫停,當GATE=0時,計數暫停,當GATE變高后就接著計數。另外,在計數過程中可改變計數值,在寫入新的計數值后,計數器將按新的計數值開始計數。用VHDL語言實現的仿真如圖1所示。
VHDL語言編程實現如下:
PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk = '0') THEN
IF (wr = '0') THEN
count <= d;
ELSIF (count = 0) THEN
NULL;
ELSIF (gate = '1') THEN
count <= count - 1;
END IF;
END IF;
END PROCESS;
PROCESS (count)
BEGIN
IF (count = 0) THEN
out0 <= '1';
ELSE
out0 <= '0';
END IF;
END PROCESS;
其中,clk為時鐘輸入信號,wr與CPU的wr信號相接,d為8位的數據輸入,gate為門控信號,out0位計數器的輸出。以下五種工作方式的端口定義與上同,不再另行說明。
個PROCESS語句的敏感信號是clk,clk下降沿有效。用以實現計數值的讀入、減法計數、門控信號的實現、及當計數到零時停止計數。
第二個PROCESS語句的敏感信號是個PROCESS語句中的計數值count,用count的值控制輸出out0。
2.2 8253方式2——速率發生器
這種方式中,在CPU寫入計數值后,計數器將立即自動對輸入時鐘clk計數。在計數過程中輸出out0始終保持為高,直到計數器減到1時,輸出將變低,經過一個clk周期,輸出恢復為高,且計數器開始重新計數。計數過程可由門控脈沖控制,當gate變低時,就暫停計數,直到gate變高時,恢復計數。在計數過程中,可以改變計數值。仿真波形如圖2所示。
VHDL語言編程實現如下:
PROCESS (wr)
BEGIN
IF (wr'EVENT AND wr = '0') THEN
reg <= d;
END IF;
END PROCESS;
PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk = '0') THEN
IF (wr = '0') THEN
count <= reg;
ELSIF (count = 1) THEN
count <= reg;
ELSIF (gate = '1') THEN
count <= count - 1;
END IF;
END IF;
END PROCESS;
PROCESS (count)
BEGIN
IF (count = 1) THEN
out0 <= '0';
ELSE
out0 <= '1';
END IF;
END PROCESS;
2.3. 方式3——方波速率發生器
在這種方式中,CPU寫完計數值后就自動開始計數,輸出保持為高;當計數到一半時,輸出變為低,直到計數到0,輸出又變為高,重新開始計數。仿真如圖3所示。
VHDL語言編程實現如下:
PROCESS (wr)
BEGIN
IF (wr'EVENT AND wr = '0') THEN
reg <= d(7 DOWNTO 1) & '0';
END IF;
END PROCESS;
PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk = '0') THEN
IF (wr = '0') THEN
count <= reg;
ELSIF (count = 2) THEN
count <= reg;
ELSIF (gate = '1') THEN
count <= count - 2;
END IF;
END IF;
END PROCESS;
PROCESS (count)
BEGIN
IF (count = 2) THEN
out_tmp <= '1';
ELSE
out_tmp <= '0';
END IF;
END PROCESS;
PROCESS (out_tmp)
BEGIN
if (out_tmp'EVENT AND out_tmp = '0') THEN
out0 <= NOT out0;
END IF;
END PROCESS;
在8253中,若計數值為偶數,則輸出為方波;若計數值為奇數,輸出的波形就不是方波。在這個程序中,我對其作了少許改動:對寫入的數據不論是否偶數,都將其轉化為偶數。如果寫入的數據是偶數則將這個數據本身傳給計數器,如果寫入的數據是奇數則將其減1然后再傳給計數器。這樣,不論寫入的計數值是奇數還是偶數,都可以保證輸出波形是方波。