【正文】
軟件設(shè) 計(jì) 開(kāi)發(fā)軟件及編程語(yǔ)言簡(jiǎn)介 系統(tǒng)采用硬件描述語(yǔ)言 VHDL 按模塊化方式進(jìn)行設(shè)計(jì),并將各模塊 集成于 FPGA 芯片中,然后通過(guò) Xilinx ISE ModelSim Xilinx Edition XE 仿真工具, 對(duì)設(shè)計(jì)文件自動(dòng)地完成邏輯編譯、邏輯化簡(jiǎn)、綜合及優(yōu)化、邏輯布局布線、邏輯仿真,最后對(duì)FPGA芯片進(jìn)行編程,實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)要求。 ADC0809 的輸入范圍為( 0— 5) ADC0809各通道的 選通 來(lái)自動(dòng)實(shí)現(xiàn)的 ,所以只要輸入的電壓范圍超過(guò) 5V,則檔位自動(dòng)切換到 10 檔 ,即選通通道 IN1。 ALE 將 3位地址線 ADDA, ADDB, ADDC 進(jìn)行鎖存 。 5 圖 段發(fā)光二極管 顯示器原理結(jié)構(gòu) 方案二 : 運(yùn)用 LCD 液晶顯示 ,液晶顯示屏是以若干個(gè) 58 或 5 11 點(diǎn)陣塊組成的顯示字符群 ,每個(gè)點(diǎn)陣塊為一個(gè)字符位 .字符間距的行距都為一個(gè)點(diǎn)的寬度 .采用這種液晶顯示功耗低 、 可靠性高 、輕薄短小、 輻射小 、可視面積大, 可以同時(shí)顯示 多種信息 。雙積分型 A/D 轉(zhuǎn)換器的原理是將輸入電壓轉(zhuǎn)換成時(shí)間(脈沖寬度信號(hào))或頻率(脈沖頻率),然后由定時(shí)器 /計(jì)數(shù)器獲得數(shù)字值, 積分時(shí)間常數(shù)較大,具有濾波作用,消除了干擾,故雙積分 A/D 轉(zhuǎn)換具有較強(qiáng)的抗干擾能力。 目前單片機(jī)技術(shù)比較成熟,功能也比較強(qiáng)大,配合一定的外圍電路可實(shí)現(xiàn)數(shù)字電壓表,原理 圖如圖 所示。 1 基于 FPGA 數(shù)字電壓表 設(shè)計(jì) 摘要 : 系統(tǒng)基于 EDA 技術(shù)的智能數(shù)字電壓表實(shí)現(xiàn) ,以現(xiàn)場(chǎng)可編程門陣列 (FPGA)為設(shè)計(jì)核心,集成于一片 Xilinx公司的 SpartanⅡ E系列 XC2S100E6PQ208 芯片上,在 ISE環(huán)境下采用超高速硬件描述語(yǔ)言 (VHDL)模塊化編程 ,實(shí)現(xiàn)了電 壓的數(shù)據(jù)采集、轉(zhuǎn)換、處理、顯示等功能。 輸入信號(hào) 圖 3 位半電壓表原理圖 方案二 :采用單片機(jī)為控制核心。 AD轉(zhuǎn)換方案的比 較 A/D 轉(zhuǎn)換 譯碼驅(qū)動(dòng) 顯示器 4 方案一: 采用雙積分型 AD 轉(zhuǎn)換器。但是也有一個(gè)明顯的缺 點(diǎn),即顯示的信息量非常有 限,只能顯示幾個(gè)有限的阿拉伯?dāng)?shù)字與字母 ,電路圖如圖 所示。 ADC0809 通過(guò)引腳 IN0, IN1,…, IN7 可輸入 8 路單邊模擬輸入電壓。 圖 ADC0809 的工作時(shí)序圖 8 檔位控制電路 為了增加 DVM 的測(cè)量范圍,設(shè)計(jì)了檔位選擇電路,其主要原理是采用電阻分壓,原理上ADC0809有八路數(shù)據(jù)輸入端口,也就是說(shuō)可以分為八檔 ,為了簡(jiǎn)化設(shè)計(jì),只分了兩檔( 1檔,10檔) 圖 原理圖 圖中的電位器 R25是用來(lái)校準(zhǔn)的,因?yàn)楦麟娮璧闹挡豢赡芎芫_,用電位器來(lái)微調(diào)校準(zhǔn)以保證測(cè)量精度。 當(dāng) ADC0809采樣完成后 ,由 碼字變換 模塊將采樣數(shù)字信號(hào)轉(zhuǎn)換為 LCD可識(shí)別的字符型數(shù)據(jù)后,送至 驅(qū)動(dòng) 模塊,再由其驅(qū)動(dòng) LCD,將字符型數(shù)據(jù)送到 LCD的 D0~D7端,實(shí)現(xiàn)顯示。系統(tǒng)的測(cè)量結(jié)果如表 表 系統(tǒng)測(cè)量數(shù)據(jù)表 序號(hào) 標(biāo)準(zhǔn)電壓值 (U/V) 測(cè)量電壓值( Ux/V) 誤差( %) 1 2 11 3 4 5 6 7 8 9 10 參考文獻(xiàn) [1]潘松 ,黃繼業(yè) .EDA實(shí)用教程 .北京 .科學(xué)出版社 .2020年 10 月第一版 [2]黃智偉 .全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽訓(xùn)練教程 .北京 :電子工業(yè)出版式社 .2020 年 1 月第 1 版; [3]高吉祥,〈〈數(shù)字電子技術(shù)〉〉北京 :電子工業(yè)出版社, 2020 年 8 譚浩強(qiáng)月第 1 版; 附錄 1: 源程序清單 頂層: library IEEE。 D:in std_logic_vector(7 downto 0)。接 LCD數(shù)據(jù)輸入位 end top。 eoc:in std_logic。 Q:in std_logic_vector(7 downto 0)。 接 LCD使能端 lcdda:out std_logic。 begin u1:key port map (clk=clk,reset=reset,key1=key1,clkz=clkz_load,dw1=dw1_load,cba=cba)。 use 。 end key。139。 end if。 then t:=0。 else t:=t+1。 then if rising_edge(clkk) then if t2 then t:=0。 when others=cba=000。 15 顯示; library IEEE。 dw1:in integer range 0 to 2。 type state is (set_dlnf,clear_lcd,set_cursor,set_dcb,set_location,write_data)??崭? constant d:std_logic_vector(7 downto 0):=00101110。 elsif clk39。 else t:=0。139。 end if。 when 3=xv1=00110011。 end case。 when 7=xv2=00110111。 when 3=xv3=00110011。 end case。 when 7=xv4=00110111。 when 3=xv5=00110011。 18 end case。 dataram(2)=xv1。 end if。 elsif rising_edge(clk_500hz)then case current_state is when set_dlnf= lcden=39。 if ttdelay and tt=delay*2 then lcden=39。 when clear_lcd= lcden=39。 if ttdelay and tt=delay*2 then lcden=39。 when set_cursor= lcden=39。 if ttdelay and tt=delay*2 then lcden=39。 when set_dcb= lcden=39。 if ttdelay and tt=delay*2 then lcden=39。 when set_location= lcden=39。 if ttdelay and tt=delay*2 then lcden=39。 when write_data= lcden=39。 if ttdelay and tt=delay*2 then lcden=39。 end if。 adc0809: library IEEE。 D:in std_logic_vector(7 downto 0)。 signal clk500,lock:std_logic。039。clk0:=39。039。 next_state=st1。039。039。039。 then next_state=st3。039。 end if。039。139。039。 end process 。 end if。 use 。 architecture ROC_V of ROC is attribute VITAL_LEVEL0 of ROC_V : architecture is TRUE。 end ROC_V。)。 else wait for WIDTH。 use 。 q : in STD_LOGIC_VECTOR ( 7 downto 0 )。 WIDTH : Time := 100 ns)。139。 signal q_4_ibuf : STD_LOGIC。 signal n1063 : STD_LOGIC。 signal n290 : STD_LOGIC。 signal choice66 : STD_LOGIC。 signal v55_1_rt : STD_LOGIC。 signal v44_madd_n0000_inst_lut2_01_O : STD_LOGIC。 signal v33_3_rt_O : STD_LOGIC。 signal v33_0_GSR_OR : STD_LOGIC。 27 signal v1_3_obuf_GTS_TRI : STD_LOGIC。 signal v2_0_obuf_GTS_TRI : STD_LOGIC。 signal v4_0_obuf_GTS_TRI : STD_LOGIC。 signal NlwInverterSignal_v1_1_obuf_GTS_TRI_CTL : STD_LOGIC。 signal NlwInverterSignal_v3_1_obuf_GTS_TRI_CTL : STD_LOGIC。 signal NlwInverterSignal_v2_1_obuf_GTS_TRI_CTL : STD_LOGIC。 signal v5_0_obuf_GTS_TRI : STD_LOGIC。 signal v3_0_obuf_GTS_TRI : STD_LOGIC。 signal v1_0_obuf_GTS_TRI : STD_LOGIC。 signal v44_1_GSR_OR : STD_LOGIC。 signal v55_2_GSR_OR : STD_LOGIC。 signal v55_1_rt_O : STD_LOGIC。 signal v33_3_rt : STD_LOGIC。 signal choice59 : STD_LOGIC。 26 signal v55_madd_n0000_inst_cy_0 : STD_LOGIC。 signal v33_0_n33 : STD_LOGIC。 signal n1198 : STD_LOGIC。 signal reset_ibuf : STD_LOGIC。 end ponent。 v4 : out STD_LOGIC_VECTOR ( 3 downto 0 )。 entity ym is port ( clk : in STD_LOGIC := 39。 wait。 begin ONE_SHOT : process begin O = 39。 entity TOC is generic (InstancePath: STRING := *。039。139。 end Behavioral。 process(lock,x) begin 23 if lock39。039。 next_state=st0。039。039。 if eoc=39。039。039。 next_state=st3。039。039。039。 clk500=clk0。 then count2:=count2+1。 begin if reset=39。 end ad0809。 Unment the following lines to use the declarations that are provided for