【正文】
模塊dac_test。該模塊放在lib文件夾下。該模塊主要提供按鍵輸入、數(shù)碼顯示等操作,使用說明如下:按下KEY1,選擇通道,在數(shù)碼管LEDD4上顯示;按下KEYKEY3輸入8位數(shù)/模數(shù)轉(zhuǎn)換值,在數(shù)碼管LEDD4上顯示;按下KEY4選擇輸出電壓模式,是一倍輸出還是兩倍輸出,在數(shù)碼管LEDD3上顯示(0表示1倍;1表示2倍);按KEY5,將當(dāng)前數(shù)據(jù)發(fā)送到dac模塊并啟動(dòng)一次數(shù)/模轉(zhuǎn)換。3. 實(shí)驗(yàn)原理TLC5620是一個(gè)4通道8位的D/A轉(zhuǎn)換器,時(shí)鐘頻率最大可達(dá)到1MHz。TLC5620傳輸一幀數(shù)據(jù)為11位,高位先傳送,格式如下表所示。DD9位為通道選擇位;其對應(yīng)關(guān)系如表所示。D8為輸出電壓模式選擇,若為“0”則輸出電壓范圍為0~VREF,若為“1”則輸出電壓范圍為0~2VREF,其中VREF為參考電壓,;D7~D0為數(shù)據(jù)位。表 TLC5620的數(shù)據(jù)格式D10D9D8D7D6D5D4D3D2D1D0通道選擇輸出模式RNG8位數(shù)據(jù)D7~D0表 通道選擇對應(yīng)關(guān)系D10D9通道00DACA01DACB10DACC11DACD TLC5620的訪問時(shí)序如圖所示,其中CLK為DAC的時(shí)鐘;DATA為串行數(shù)據(jù),鎖存于時(shí)鐘的下降沿;LOAD為數(shù)據(jù)鎖存控制信號(hào),當(dāng)一幀數(shù)據(jù)傳送完畢時(shí),拉低LOAD信號(hào)線,即把數(shù)據(jù)鎖存起來;LDAC為DAC輸出更新控制信號(hào),當(dāng)LDAC為低電平時(shí),即把鎖存在鎖存器的數(shù)據(jù)送到DAC并轉(zhuǎn)換輸出。本實(shí)驗(yàn)時(shí)鐘置LDAC為低電平,也就是說,加載信號(hào)LOAD一但產(chǎn)生,數(shù)據(jù)即可轉(zhuǎn)換輸出。詳細(xì)的時(shí)序控制、參數(shù)設(shè)置請參考數(shù)據(jù)手冊。TLC5620的輸出電壓為 其中V0為采樣值;DACA/B/C/D代表4個(gè)不同的通道;為參考電壓,CODE為8位二進(jìn)制數(shù),范圍為0~255,數(shù)值為0或1。圖 TLC5620訪問時(shí)序圖4. 實(shí)驗(yàn)步驟(1) 啟動(dòng)Quartus II建立一個(gè)空白工程。(2) 。進(jìn)行綜合編譯。若在編譯過程中發(fā)現(xiàn)錯(cuò)誤,則找出并更正錯(cuò)誤。直至編譯成功為止。程序參考:LIBRARY IEEE。USE 。USE 。USE 。ENTITY dac ISGENERIC(CLK_DIV: Integer:=63。CLK_DIV_BITS: Integer:=6)。PORT(clock: IN STD_LOGIC。rst: IN STD_LOGIC。wr_data: IN STD_LOGIC_VECTOR(10 DOWNTO 0)。DAC 11位數(shù)據(jù)輸入. //bit[10:9] 通道選擇00:CHA。 01:CHB。 10:CHC。 11:CHD. //bit[8] RNG bit輸出電壓(0:參考電壓到地。1:兩倍參考電壓到地) //bit[7:0] DAC轉(zhuǎn)換代碼,范圍0~255. //輸出電壓Vo=REF*(CODE/256)*(1+RNG bit) wr_act: IN STD_LOGIC。寫控制.dac_clk: OUT STD_LOGIC。DAC時(shí)鐘輸出dac_data: OUT STD_LOGIC。DAC數(shù)據(jù)輸出dac_load: OUT STD_LOGIC。DAC數(shù)據(jù)加載信號(hào)輸出dac_ldac: OUT STD_LOGICDAC更新鎖存信號(hào)輸出.)。END。ARCHITECTURE one OF dac ISSIGNAL counter: STD_LOGIC_VECTOR(CLK_DIV_BITS1 DOWNTO 0)。SIGNAL dac_clk_r: STD_LOGIC。SIGNAL dac_data_r: STD_LOGIC。SIGNAL dac_load_r: STD_LOGIC。SIGNAL bit_counter: STD_LOGIC_VECTOR(4 DOWNTO 0)。DAC數(shù)據(jù)輸出位計(jì)數(shù)器.SIGNAL div_clk: STD_LOGIC。分頻時(shí)鐘SIGNAL bit_counter_rst:STD_LOGIC。位計(jì)數(shù)器復(fù)位信號(hào).SIGNAL dac_dat_send_finish: STD_LOGIC。TYPE states IS (dac_idle,dac_send,dac_store)。狀態(tài)機(jī)SIGNAL dac_sta,dac_sta_next: states。BEGINPROCESS(clock,rst)BEGIN IF RISING_EDGE(clock) THEN IF rst=39。139。 THEN counter=000000。 ELSE IF counterCLK_DIV THEN counter=counter + 1。 div_clk=39。039。 ELSE counter=000000。 div_clk=39。139。 END IF。 END IF。 END IF。END PROCESS。狀態(tài)機(jī)PROCESS(clock,rst)BEGIN IF RISING_EDGE(clock) THEN IF rst=39。139。 THEN dac_sta=dac_idle。 ELSE dac_sta=dac_sta_next。 END IF。 END IF。END PROCESS。PROCESS(dac_sta,wr_act,div_clk,dac_dat_send_finish)狀態(tài)描述BEGIN dac_load_r=39。139。 bit_counter_rst=39。039。 dac_sta_next=dac_idle。 CASE dac_sta IS WHEN dac_idle= bit_counter_rst=39。139。 空閑時(shí)復(fù)位發(fā)送位計(jì)數(shù)器. IF wr_act=39。139。 THEN 有寫數(shù)據(jù)信號(hào)時(shí),進(jìn)入發(fā)送狀態(tài). dac_sta_next=dac_send。 ELSE dac_sta_next=dac_idle。 END IF。 WHEN dac_send=位數(shù)據(jù)發(fā)送完成后進(jìn)入數(shù)據(jù)鎖存狀態(tài) IF dac_dat_send_finish =39。139。 THEN dac_sta_next=dac_store。 ELSE dac_sta_next=dac_send。 END IF。 WHEN dac_store= bit_counter_rst=39。139。發(fā)送位計(jì)數(shù)器復(fù)位. dac_load_r=39。039。Load 變低進(jìn)行數(shù)據(jù)鎖存. IF div_clk =39。139。 THEN dac_sta_next=dac_idle。 ELSE dac_sta_next=dac_store。 END IF。 END CASE。END PROCESS。 PROCESS( clock) BEGIN IF rising_edge(clock) THEN IF bit_counter_rst=39。139。 THEN bit_counter=00000。 發(fā)送位計(jì)數(shù)器清0 ELSIF div_clk=39。139。 THEN 發(fā)送位計(jì)數(shù)器累加 bit_counter=bit_counter + 1。 END IF。 END IF。 END PROCESS。 當(dāng)發(fā)送位計(jì)數(shù)器計(jì)數(shù)到24時(shí),發(fā)送完畢. dac_dat_send_finish=39。139。 WHEN bit_counter=24 else 39。039。 PROCESS(bit_counter(4 DOWNTO 1),wr_data) BEGIN CASE bit_counter(4 DOWNTO 1) IS 發(fā)送計(jì)數(shù)器每4:1位變換換時(shí),發(fā)送1bit數(shù)據(jù). WHEN 0001= dac_data_r=wr_data(10)。先高位. WHEN 0010= dac_data_r=wr_data(9)。 WHEN 0011= dac_data_r=wr_data(8)。 WHEN 0100= dac_data_r=wr_data(7)。 WHEN 0101= dac_data_r=wr_data(6)。 WHEN 0110= dac_data_r=wr_data(5)。 WHEN 0111= dac_data_r=wr_data(4)。 WHEN 1000= dac_data_r=wr_data(3)。 WHEN 1001= dac_data_r=wr_data(2)。 WHEN 1010= dac_data_r=wr_data(1)。 WHEN 1011= dac_data_r=wr_data(0)。 WHEN OTHERS= dac_data_r=39。139。 END CASE。 END PROCESS。 PROCESS(bit_counter)在發(fā)送位計(jì)數(shù)器2-24間產(chǎn)生dac clk BEGIN IF (bit_counter 24) AND (bit_counter=2) THEN dac_clk_r=NOT bit_counter(0)。 ELSE dac_clk_r=39。039。 END IF。 END PROCESS。 dac_clk=dac_clk_r。 dac_data=dac_data_r。 dac_load=dac_load_r。 dac_ldac=39。039。END。(3) 。驗(yàn)證仿真結(jié)果是否與設(shè)計(jì)相符合,如果不符合,則重新設(shè)計(jì)文件,然后再進(jìn)行綜合編譯、仿真,直到仿真結(jié)果與設(shè)計(jì)相符合為止。(4) 。(5) 新建圖形設(shè)計(jì)文件進(jìn)行硬件測試。其模塊原理圖如圖所示。圖 TLC5620數(shù)模轉(zhuǎn)換頂層測試模塊原理圖(6) 將實(shí)驗(yàn)?zāi)K選擇目標(biāo)器件并對相應(yīng)的引腳進(jìn)行鎖定,這里選擇的器件為Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引腳鎖定方法如下表所示。表 引腳鎖定方法信號(hào)引腳信號(hào)引腳信號(hào)引腳EP2C5EP1C12EP2C5EP1C12EP2C5EP1C12Seg[0]145Dig[1]127Key[2]57Seg[1]142Dig[2]133Key[3]61Seg[2]143Dig[3]117Key[4]58Seg[3]139Dig[4]128dac_clk101Seg[4]141Dig[5]115dac_load104Seg[5]137Dig[6]118dac_data96Seg[6]138Dig[7]113dac_ldac99Seg[7]134Key[0]56clock23Dig[0]135Key[1]59(7) ,對該工程進(jìn)行全編譯處理,若在編譯過程中發(fā)現(xiàn)錯(cuò)誤,則找出錯(cuò)誤并更正錯(cuò)誤,直至編譯成功為止。(8) 連接硬件,下載程序。通過KEY1~KEY4輸入數(shù)據(jù),按下KEY5啟動(dòng)DAC進(jìn)行轉(zhuǎn)換,用萬用表測電壓擋測量數(shù)/模轉(zhuǎn)換器輸出電壓值,重復(fù)多次,記錄萬用表的電壓讀數(shù)并與輸入的值做比較。