一、前言
課題研究的背景
隨著信息技術(shù)獲得了突飛猛進(jìn)的發(fā)展,信息技術(shù)滲透了我們生活的幾乎全部領(lǐng)域,改變著人類的生存狀態(tài)和思維模式。而我們的課題所涉及的電子設(shè)計自動化(EDA)技術(shù)就是在這種時代背景下產(chǎn)生的,并影響巨大。FPGA是新型的可編程邏輯器件,與傳統(tǒng) ASIC 相比,具有設(shè)計開發(fā)周期短、設(shè)計制造成本低、開發(fā)工具先進(jìn) 等優(yōu)點,特別適合于產(chǎn)品的樣品開發(fā)和小批量生產(chǎn)。傳統(tǒng)的數(shù)字電壓表多以單片機(jī)為控制核心,芯片集成度不高,系統(tǒng)連線復(fù)雜,難以小型化,尤其在產(chǎn)品需求發(fā)生變化時,不得不重新布版、調(diào)試,增加了投資風(fēng)險和成本。而采用 FPGA 進(jìn)行產(chǎn)品開發(fā),可以靈活地進(jìn)行模塊配置,大大縮短了開發(fā)周期,也有利于數(shù)字電壓表向小型化、集成化的方向發(fā)展。 隨著電子技術(shù)的發(fā)展,當(dāng)前數(shù)字電子系統(tǒng)的設(shè)計正朝著速度快、容量大、體積小、重量輕的方向發(fā)展。推動該潮流發(fā)展的引擎就是日趨進(jìn)步和完善的ASIC設(shè)計技術(shù)。目前數(shù)字系統(tǒng)的設(shè)計可以直接面向用戶需求,根據(jù)系統(tǒng)的行為和功能的要求,自上而下的完成相應(yīng)的描述、綜合、優(yōu)化、仿真與驗證,直接生成器件。上述設(shè)計過程除了系統(tǒng)行為和功能描述以外,其余所有的設(shè)計幾乎都可以用計算機(jī)來自動完成,也就說做到了電子設(shè)計自動化(EDA)這樣做可以大大的縮短系統(tǒng)的設(shè)計周期,以適應(yīng)當(dāng)今品種多、批量小的電子市場的需求。
伴隨著集成電路(IC)技術(shù)的發(fā)展,電子設(shè)計自動化(EDA)逐漸成為重要的設(shè)計手段,己經(jīng)廣泛應(yīng)用于模擬與數(shù)子電路系統(tǒng)等許多領(lǐng)域。目前電子技術(shù)的發(fā)展主要體現(xiàn)在EDA領(lǐng)域,數(shù)字系統(tǒng)的設(shè)計正朝著速度快、容量大、體積小、重量輕的方向發(fā)展。電子設(shè)計自動化是近幾年迅速發(fā)展起來的將計算機(jī)軟件、硬件、微電子技術(shù)交叉運用的現(xiàn)代電子設(shè)計學(xué)科。其中EDA設(shè)計語言中的VHDL語言是一種快速的電路設(shè)計工具,功能涵蓋了電路描述、電路合成、電路仿真等三大電路設(shè)計工作。本電壓表的電路設(shè)計正是用VHDL語言完成的。此次設(shè)計主要應(yīng)用的軟件是美國ALTERA公司自行設(shè)計的Quartus II。
FPGA設(shè)計具有以下優(yōu)點:
(1)硬件設(shè)計軟件化
這是FPGA開發(fā)的最大優(yōu)勢。傳統(tǒng)硬件電路設(shè)計先要進(jìn)行功能設(shè)計,然后進(jìn)行電路板級設(shè)計并做稱電路板后進(jìn)行調(diào)試,如果電路中有什么錯誤,整個電路板都將作廢,這是很不經(jīng)濟(jì)的。FPGA的開發(fā)在功能層面上可以完全脫離硬件而在EDA軟件上做軟仿真。當(dāng)功能確定無誤后可以進(jìn)行硬件電路板的設(shè)計。最后將設(shè)計好的,由EDA軟件生成的燒寫文件下載到配置設(shè)備中去,進(jìn)行在線調(diào)試,如果這時的結(jié)果與要求不一致,可以立即更改設(shè)計軟件,并再次燒寫到配置芯片中而不必改動外接硬件電路。
(2)高度集成化,高工作頻率
一般的FPGA內(nèi)部都集成有上百萬的邏輯門,可以在其內(nèi)部規(guī)劃出多個與傳統(tǒng)小規(guī)模集成器件功能相當(dāng)?shù)哪K。這樣將多個傳統(tǒng)器件集成在同一芯片內(nèi)部的方法不但可以改進(jìn)電路板的規(guī)模,還可以減少PCB布線的工作。由于各個模塊都是集成在FPGA芯片內(nèi)部,這就很大程度地解決了信號的干擾問題,使得FPGA的工作頻率可以大幅度的提高。另外,一般的FPGA內(nèi)部都有PLL倍頻的時鐘,這進(jìn)一步解決了電磁干擾和電磁兼容問題。
(3)支持多種接口
FPGA芯片可支持多種標(biāo)準(zhǔn)的接口電平,可通過EDA開發(fā)工具來選定采用什么樣的接口標(biāo)準(zhǔn),包括常用的TTL和差分輸入等。這便于后端各種不同接口電路的匹配。
FPGA設(shè)計流程
可編程邏輯器件的設(shè)計是利用EDA開發(fā)軟件和編程土具對器件開發(fā)的過程。它包括設(shè)計準(zhǔn)備、設(shè)計輸入、功能仿真、設(shè)計處理、時序仿真和器件編程及測試等七個步驟。
1.設(shè)計準(zhǔn)備
在系統(tǒng)設(shè)計之前,首先要進(jìn)行方案論證、系統(tǒng)設(shè)計和器件選擇等準(zhǔn)備工作。
一般采用自上而下的設(shè)計方法,也可采用傳統(tǒng)的自下而上的設(shè)計方法。
2.設(shè)計輸入
設(shè)計輸入將所設(shè)計的系統(tǒng)或電路以開發(fā)軟件要求的某種形式表示出來,并送入計算機(jī)的過程稱為設(shè)計輸入。設(shè)計輸入通常有以下集中形式:
1)原理圖輸入方式
2)硬件描述語言輸入方式
3)波形輸入方式
3.功能仿真
功能仿真也叫做前仿真。用戶所設(shè)計的電路必須在編譯之前進(jìn)行邏輯功能驗證,此時的仿真沒有延時信息,對于初步的功能檢測非常方便。仿真中如發(fā)現(xiàn)錯誤,則返回設(shè)計輸入中修改邏輯設(shè)計。
4.設(shè)計處理
設(shè)計處理是器件設(shè)計中的核心環(huán)節(jié)。在設(shè)計處理過程中,編譯軟件將對設(shè)計輸入文件進(jìn)行邏輯化簡、綜合優(yōu)化和適配,最后產(chǎn)生編程用的編程文件。主要有:
1) 語法檢查和設(shè)計規(guī)則檢查
2)邏輯優(yōu)化和綜合
3)適配和分割
4)布局和布線
5.時序仿真
時序仿真又稱后仿真或延時仿真。由于不同器件的內(nèi)部延時不一樣,不同的布局布線方案也給延時造成不同的影響,因此在設(shè)計處理以后,對系統(tǒng)和各模塊進(jìn)行時序仿真,分析其時序關(guān)系,估計設(shè)計的性能,以及檢查和消除竟?fàn)幟半U等是非常有必要的。
6.器件編程測試
時序仿真完成后,軟件就可產(chǎn)生供器件編程使用的數(shù)據(jù)文件。
VHDL語言描述
硬件描述語言(hardware description language,HDL)是電子系統(tǒng)硬件行為描述,結(jié)構(gòu)描述,數(shù)據(jù)流描述的語言.目前,利用硬件描述語言可以進(jìn)行數(shù)字電子系統(tǒng)的設(shè)計.隨著研究的深入,利用硬件描述語言進(jìn)行模擬電子系統(tǒng)設(shè)計或混合電
子系統(tǒng)設(shè)計也正在探索中。
國外硬件描述語言種類很多,有的從Pascal發(fā)展而來,也有一些從C語言發(fā)展而來.有些HDL成為IEEE標(biāo)準(zhǔn),但大部分是企業(yè)標(biāo)準(zhǔn).VHDL來源于美國軍方,其他的硬件描述語言則多來源于民間公司.可謂百家爭鳴,百花齊放.這些不同的語言傳播到國內(nèi),同樣也引起了不同的影響.在我國比較有影響的有兩種硬件描述語言:VHDL語言和Verilog HDL語言.這兩種語言已成為IEEE標(biāo)準(zhǔn)語言。
VHDL語言的設(shè)計流程
采用VHDL語言設(shè)計硬件電路系統(tǒng)的設(shè)計流程一般可以分為以下幾個步驟。①硬件電路系統(tǒng)設(shè)計要求的定義。②編寫描述硬件電路系統(tǒng)功能的VHDL語言程序。③VHDL語言程序的模擬。④VHDL語言的綜合、優(yōu)化和布局布線。⑤布局布線后的設(shè)計模擬。⑥器件的編程。設(shè)計人員在從事硬件電路系統(tǒng)的合計過程中,編寫VHDL語言程序之前必須對硬件電路系統(tǒng)的設(shè)計目的和設(shè)計要求有一個非常明確的認(rèn)識才行。
Quartus II開發(fā)平臺簡介??
Quartus II是Altera提供的FPGA/CPLD開發(fā)集成環(huán)境,Altera是世界最大可編程邏輯器件供應(yīng)商之一。Quartus II在21世紀(jì)初推出,是Altera前一代FPGA/CPLD集成開發(fā)環(huán)境MAX+plus II的更新?lián)Q代產(chǎn)品,其界面友好,使用便捷。在Quartus II上可以完成設(shè)計輸入、HDL綜合、布線布局(適配)、仿真和下載和硬件測試等流程,它提供了一種與結(jié)構(gòu)無關(guān)的設(shè)計環(huán)境,使設(shè)計者能方便地進(jìn)行設(shè)計輸入、快速處理和器件編程。
本次所設(shè)計的電壓表的測量范圍是0~5V,精度為0.01V。此電壓表的設(shè)計特點為:通過軟件編程下載到硬件實現(xiàn),設(shè)計周期短,開發(fā)效率高。
關(guān)鍵字:電子設(shè)計自動化(EDA);FPGA;VHDL;A/D;數(shù)字電壓表。
二、設(shè)計任務(wù)與要求
要求利用FPGA控制模塊數(shù)轉(zhuǎn)換器對外部輸入的模擬信號進(jìn)行采樣,獲取當(dāng)前電壓值,并在數(shù)碼管上顯示。
傳統(tǒng)的數(shù)字電壓表設(shè)計通常以大規(guī)模ASIC(專用集成電路)為核心器件,輔以少量中規(guī)模集成電路及顯示器件構(gòu)成。ASIC完成從模擬量的輸入到數(shù)字量的輸出,是數(shù)字電壓表的心臟,這種電壓表的設(shè)計簡單、精確度高,但是這種設(shè)計方法由于采用了ASIC器件使得的它欠缺靈活性,其系統(tǒng)功能固定,難以更新擴(kuò)展,。后來發(fā)展起來的微處理器(單片機(jī))控制通用A/D轉(zhuǎn)換器件的數(shù)字電壓表的設(shè)計的靈活性有所提高,系統(tǒng)功能的擴(kuò)展性變得簡單,但是由于微處理機(jī)的引腳數(shù)量有限,其控制轉(zhuǎn)換速度和靈活性還是不能滿足日益發(fā)展的電子工業(yè)的需求。而應(yīng)以EDA技術(shù)及FPGA,其集成度高、速度快、性能十分可靠、用戶可自由編程且編程語言通俗易懂、系統(tǒng)工程擴(kuò)展非常方便。采用FPGA芯片控制通用A/D轉(zhuǎn)換器可是速度、靈活性大大優(yōu)于微處理器和通用A/D轉(zhuǎn)換器構(gòu)成的數(shù)字電壓表。
a,能夠?qū)崿F(xiàn)一個通道的采樣控制;
c,計算轉(zhuǎn)換后的數(shù)字電壓信號,并以BCD碼方式表示。
- 總體框圖
方案一:
本利用ADC0809作為電壓采樣端口,F(xiàn)PGA作為系統(tǒng)的核心器件,用LED進(jìn)行數(shù)碼顯示,把讀取的8位二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成便利于輸出3位十進(jìn)制BCD碼送給數(shù)碼管。
采用FPGA芯片作為系統(tǒng)的核心器件,負(fù)責(zé)ADC0809的A/D轉(zhuǎn)換的啟動、地址鎖存、輸入通道的選擇、數(shù)據(jù)的讀取。同時,把讀取的8位二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成便于輸出3位十進(jìn)制的BCD碼送給數(shù)碼管,以顯示當(dāng)前測量電壓值。這些工作由ADC0809轉(zhuǎn)換控制模塊、數(shù)據(jù)轉(zhuǎn)換模塊、譯碼模塊完成。
ale:out std_logic;
start:out std_logic;
add:out std_logic_vector(2 downto 0));
end ad;
architecture one of ad is
type states is(st0,st1,st2,st3,st4);
signal current_state,next_state:states:=st0;
signal temp:std_logic_vector(7 downto 0);
signal lock:std_logic;
begin
add<="001";
dataout<=temp;
process(current_state,eoc)
begin
case current_state is
when st0=>ale<='0';start<='0';oe<='0';lock<='0';
next_state<=st1;
when st1=>ale<='1';start<='1';oe<='0';lock<='0';
next_state<=st2;
when st2=>ale<='0';start<='0';oe<='0';lock<='0';
if (eoc='1')then next_state<=st3;
else next_state<=st2;
end if;
when st3=>ale<='0';start<='0';oe<='1';lock<='1';
next_state<=st4;
when st4=>ale<='0';start<='0';oe<='1';lock<='1';
next_state<=st0;
end case;
end process;
process(clk)
begin
if(clk 'event and clk='1') then current_state<=next_state;
end if;
end process;
process(lock)
begin
if lock='1' and lock 'event then temp<=datain;
end if;