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





