版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 數字電路課程設計</b></p><p><b> ——溫度采集與發(fā)送</b></p><p> 西安電子科技大學自動化04113068</p><p><b> 任務分析:</b></p><p> 用ADC0809 八位集成A/D轉換器
2、,將測溫電路傳回的模擬電壓信號轉化為8位的數字信號,然后將其送入預先下載好程序的FPGA進行處理和發(fā)送,從而實現對溫度的測量與發(fā)送處理。</p><p><b> 設計思路:</b></p><p><b> 原理框圖</b></p><p> 設計相應的溫度采集模塊的硬件電路;</p><p&g
3、t;<b> 編寫程序:</b></p><p> 軟件分頻,利用軟件將系統(tǒng)給定的頻率換算為ADC0908的工作頻率;</p><p> 串行通信,將數字信號進行存儲和發(fā)送。</p><p> 編寫模擬的輸入信號sig。</p><p><b> 系統(tǒng)所用器件:</b></p>
4、<p> , </p><p> 圖1-1 圖1-2</p><p> 測溫電路;如圖1-1,其中用到電阻8個:(100k電阻兩個,1k電阻兩個,10k電阻兩個,12k電阻一個,最大阻值為50k的滑動變阻器一個。)運算放大器兩個;AD590(AD590是美國ANALOG DEV
5、ICES公司的單片集成兩端感溫電流源,其輸出電流與絕對溫度成比例。)溫度傳感器一個;限壓二極管一只;(6v);12v的電壓源。傳感器傳來的溫度變化的電流信號經過10k電阻變?yōu)殡妷盒盘?,經過運算放大器后(V=7.73+T/100)結合電位器(V=2.73)的調節(jié)后參與減法器的運算,最終使得V0 的數值和實際溫度的數值大小相等。</p><p> ADC0809八位集成A/D轉換器(《數字電子技術基礎·
6、第二版,西電出版社》):使用IN3端口輸入來自測溫電路輸出的模擬信號(其中ADDC設置為0,ADDB設置為1,ADDA設置為1);時鐘由FPGA中軟件提供;</p><p> 3. 顯示部分由七段數碼管顯示。</p><p> 四,程序說明及仿真結果:</p><p> Sig: (因為在仿真的時候,不加入模擬信號,沒法仿真,就設置了一個信號,在仿真
7、時替換測溫電路輸入的模擬信號,實際中用測溫電路傳回的信號替代),在128MHz下,輸出模擬的四十組0到255之間的類正弦模擬信號。</p><p> Conta: 此為外部硬件時鐘信號產生設備產生128MHz的時鐘信號,分頻后向sig、CONVERTER、ADC0809提供主時鐘信號,以及向ADC0809提供start的信號;</p><p> CONVERTER: 在
8、64MHz下,控制ADC0809,以及完成串行轉換。</p><p> ADC0809: 在500KHz下,共有五個工作狀態(tài)(st0,st1,st2,st3,st4),在st0時讀入模擬信號,st1時進行逐次逼近計算,st2時等待oe信號,st3時輸出轉換結果,st4時無動作然后轉回st0。</p><p><b> 程序:</b></p>&l
9、t;p><b> Sig模塊:</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> use ieee.std_logic_ar
10、ith.all;</p><p> entity sig is --產生模擬信號</p><p> port(clk:in std_logic; --128MHz</p><p> temp:out std_logic_vector(7 downto 0));<
11、/p><p><b> end sig;</b></p><p> architecture behav of sig is</p><p> signal p:integer range 0 to 40:=0;</p><p><b> begin</b></p><p&g
12、t; process(clk,p)</p><p><b> begin</b></p><p> if (clk'event and clk='1') then p<=p+1;</p><p> case p is </p><
13、p> when 1=>temp<="00010011";--19</p><p> when 2=>temp<="00100111";--39</p><p> when 3=>temp<="00111001";--57</p><p> when 4=&g
14、t;temp<="01001010";--74</p><p> when 5=>temp<="01011001";--89</p><p> when 6=>temp<="01100110";--102</p><p> when 7=>temp<=&quo
15、t;01110001";--113</p><p> when 8=>temp<="01111000";--120</p><p> when 9=>temp<="01111101";--125</p><p> when 10=>temp<="01111111&q
16、uot;;--127</p><p> when 11=>temp<="01111101";--125</p><p> when 12=>temp<="01111000";</p><p> when 13=>temp<="01110001";</p>
17、<p> when 14=>temp<="01100110";</p><p> when 15=>temp<="01011001";</p><p> when 16=>temp<="01001010";</p><p> when 17=>
18、temp<="00111001";</p><p> when 18=>temp<="00100111";</p><p> when 19=>temp<="00010011";</p><p> when 20=>temp<="00000000&q
19、uot;;</p><p> when 21=>temp<="11101101";--237</p><p> when 22=>temp<="11011001";--217</p><p> when 23=>temp<="11000111";--199</
20、p><p> when 24=>temp<="10110110";--182</p><p> when 25=>temp<="10100111";--167</p><p> when 26=>temp<="10011010";--154</p><
21、;p> when 27=>temp<="10001111";--143</p><p> when 28=>temp<="10001000";--136</p><p> when 29=>temp<="10000011";--131</p><p> wh
22、en 30=>temp<="10000001";--129</p><p> when 31=>temp<="10000011";</p><p> when 32=>temp<="10001000";</p><p> when 33=>temp<=&
23、quot;10001111";</p><p> when 34=>temp<="10011010";</p><p> when 35=>temp<="10100111";</p><p> when 36=>temp<="10110110";</
24、p><p> when 37=>temp<="11000111";</p><p> when 38=>temp<="11011001";</p><p> when 39=>temp<="11101101";</p><p> when 40
25、=>temp<="00000000";</p><p> when others=> p<=0;temp<="00000000";</p><p><b> end case;</b></p><p><b> end if;</b></p&
26、gt;<p> end process;</p><p> end behav;</p><p> Fow Smmay:</p><p><b> Conta模塊:</b></p><p> library ieee;</p><p> use ieee.std_logi
27、c_1164.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> use ieee.std_logic_arith.all; --庫和程序包的調用</p><p> entity conta is --集線器,將輸入輸
28、出集中到一個模塊上,同時給adc0809啟動信號</p><p> port(a_in : in std_logic_vector(7 downto 0); --定義一個輸入端口a共8位</p><p> b_out : out std_logic_vector(7 downto 0); --定義一個輸出端口b共8位</p><
29、;p> c_in:in std_logic;-- 定義一個輸入端口c</p><p> d_out:out std_logic;-- 定義一個輸出端口d</p><p> clk_in:in std_logic;-- 定義一個輸入時鐘端口clk</p><p> clk_out:out std_logic;-- 定義一個輸出時鐘端口clk</p&
30、gt;<p> start_out:out std_logic); --定義一個輸出的start端口</p><p><b> --4MHz</b></p><p> end conta; --實體conta描述結束</p><p> architecture behav of conta is
31、 --結構體名為conta</p><p> signal q:std_logic_vector(4 downto 0):="00000"; --定義一個標準邏輯矢量信號q,共有5位, </p><p> --并賦初值00000</p><p><b> begin</b></p>&l
32、t;p> b_out<=a_in;</p><p> clk_out<=clk_in;</p><p> d_out<=c_in;</p><p> process(clk_in) </p><p><b> begin</b></p>&l
33、t;p> if (clk_in'event and clk_in='1') then </p><p> if q<"11111" then q<=q+1;</p><p> if q="00010" then start_out<='1';</p>
34、<p> else start_out<='0';</p><p><b> end if;</b></p><p> else q<="00000";</p><p><b> end if; </b></p><p><
35、b> end if;</b></p><p> end process;</p><p> end behav;</p><p> Flow Smmary:</p><p> CONVERTER模塊:</p><p> library ieee;</p><p>
36、 use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> use ieee.std_logic_arith.all; --庫和程序包的調用</p><p> entity CONVERTER is
37、 --串行轉換,提供adc0809工作信號及頻率 </p><p> port(d:in std_logic_vector(7 downto 0);</p><p> clk:in std_logic;</p><p> eoc,oe:out std_logic;</p><
38、;p> ale:out std_logic;</p><p> add:out std_logic_vector(2 downto 0);</p><p> data_out:out std_logic;</p><p> LOCK,clk_out:out std_logic); --500KHz</p>
39、<p> end CONVERTER;</p><p> architecture behav of CONVERTER is</p><p> type work_states is (st0,st1,st2,st3,st4,st5,st6,st7);</p><p> signal t1:std_logic_vector(7 downto 0)
40、;</p><p> signal t2:integer range 0 to 1:=0;</p><p> signal Current_state,Next_state:work_states:=st0;</p><p><b> begin</b></p><p> add<="000&qu
41、ot;;</p><p> process(Current_state,d)</p><p><b> begin</b></p><p><b> oe<='1';</b></p><p> case Current_state is</p><p
42、> when st0=>Next_state<=st1;data_out<=d(0);eoc<='0';LOCK<='1';ale<='0';</p><p> when st1=>Next_state<=st2;data_out<=d(1);eoc<='0';LOCK<=&
43、#39;1';ale<='0';</p><p> when st2=>Next_state<=st3;data_out<=d(2);eoc<='0';LOCK<='1';ale<='0';</p><p> when st3=>Next_state<=st4;
44、data_out<=d(3);eoc<='0';LOCK<='1';ale<='0';</p><p> when st4=>Next_state<=st5;data_out<=d(4);eoc<='0';LOCK<='1';ale<='0';</p&
45、gt;<p> when st5=>Next_state<=st6;data_out<=d(5);eoc<='0';LOCK<='1';ale<='0';</p><p> when st6=>Next_state<=st7;data_out<=d(6);eoc<='0';
46、LOCK<='1';ale<='0';</p><p> when st7=>Next_state<=st0;data_out<=d(7);eoc<='1';LOCK<='1';ale<='1';</p><p><b> end case;<
47、/b></p><p> end process;</p><p> process(clk) </p><p><b> begin</b></p><p> if (clk'event and clk='1') then t1<=t1+1;
48、t2<=t2+1; </p><p> if t1="01111111" THEN clk_out<='1'; </p><p> elsif t1<="01111111" then clk_out<='0'; </p><p><b>
49、 end if;</b></p><p> if t2=1 then Current_state<=Next_state;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;<
50、;/p><p> end behav;</p><p> Flow Smmary:</p><p> ADC0809模塊:</p><p> library ieee; --打開IEEE庫</p><p> use ieee.std_logic_1164.all;
51、 --程序包的調用</p><p> use ieee.std_logic_unsigned.all; --程序包的調用</p><p> entity ADC0809 is --實體名為:ADC0809 </p><p> port ( CLK,EN : in std_logic
52、 ; --定義CLK,EN為輸入端口</p><p> ADDA : in std_logic_vector(2 downto 0); --定義輸入端口ADDA,共有三位</p><p> ALE ,EOC : in std_logic ; --定義輸入端口ALK,EOC</p><p> ADC_DISPLY : ou
53、t std_logic_vector(7 downto 0); --定義輸出端口----ADC_DISPLY,共有8位</p><p> LOCK,start : in std_logic; --定義輸入端口LOCK,start</p><p> Din : in std_logic_vector(7 downto 0)); --定義輸入端口Din ,
54、共有8位</p><p> end ADC0809; --實體描述結束</p><p> architecture behav of ADC0809 is -- 結構體名為:ADC0809</p><p> type states is (st0,st1,st2,st3,st4); --用枚舉類型進行狀態(tài)定義</p><p
55、> SIGNAL REGL : std_logic_vector(7 DOWNTO 0);--定義標準邏輯矢量信號 REGL</p><p> signal Dout_int : integer range 0 to 255; --信號Dout 的范圍從0到255變化</p><p> signal buf7,buf6,buf5,buf4,buf3,buf2,buf1,bu
56、f0 : integer range 0 to 255;</p><p> signal V0,V1,V2,V3,V4,V5,V6,V7 : integer range 0 to 1:=0;</p><p> signal add:std_logic_vector(2 downto 0);</p><p> function division(data_in
57、: integer) return integer is</p><p> variable data : integer range 0 to 255;</p><p> variable data_out :integer range 0 to 1:=0;</p><p><b> begin</b></p><
58、p> data := data_in;</p><p> if data>128 thendata_out := 1;</p><p> elsedata_out := 0;</p><p><b> end if;</b></p><p> return data_out;</p>
59、<p> end division;</p><p><b> BEGIN</b></p><p> PROCESS(start,REGL,current_state,EOC,en,lock,Din,Dout_int,V0,V1,V2,V3,V4,V5,V6,V7,buf0,buf1,buf2,buf3,buf4,buf5,buf6,buf7)&l
60、t;/p><p><b> BEGIN</b></p><p> CASE current_state IS</p><p> when st0=> next_state<=st1;</p><p> Dout_int<=conv_integer(Din);</p><p&g
61、t; when st1=>next_state<=st2;</p><p> if start'event and start='1' then </p><p> V0<=0;V1<=0;V2<=0;V3<=0;V4<=0;V5<=0;V6<=0;V7<=0;</p><p
62、><b> END IF;</b></p><p> V7<=division(Dout_int);</p><p> buf6<=(Dout_int-V7*128)*2;</p><p> V6<=division(buf6);</p><p> buf5<=(buf
63、6-V6*128)*2; </p><p> V5<=division(buf5);</p><p> buf4<=(buf5-V5*128)*2; </p><p> V4<=division(buf4);</p><p> buf3<=(buf4-V4*128)*2; </p>&
64、lt;p> V3<=division(buf3);</p><p> buf2<=(buf3-V3*128)*2; </p><p> V2<=division(buf2);</p><p> buf1<=(buf2-V2*128)*2; </p><p> V1<=division(b
65、uf1);</p><p> buf0<=(buf1-V1*128)*2; </p><p> V0<=division(buf0);</p><p> when st2=> IF(EOC='1')THEN next_state<=st3;</p><p> ELSE next_state
66、<=st2;</p><p><b> END IF;</b></p><p> when st3=> </p><p> if V0=0 then REGL(0)<='0';</p><p> else REGL(0)<='1';</p>
67、<p><b> end if;</b></p><p> if V1=0 then REGL(1)<='0';</p><p> else REGL(1)<='1';</p><p><b> end if;</b></p><p>
68、 if V2=0 then REGL(2)<='0';</p><p> else REGL(2)<='1';</p><p><b> end if;</b></p><p> if V3=0 then REGL(3)<='0';</p><p>
69、 else REGL(3)<='1';</p><p><b> end if;</b></p><p> if V4=0 then REGL(4)<='0';</p><p> else REGL(4)<='1';</p><p><b&g
70、t; end if;</b></p><p> if V5=0 then REGL(5)<='0';</p><p> else REGL(5)<='1';</p><p><b> end if;</b></p><p> if V6=0 then RE
71、GL(6)<='0';</p><p> else REGL(6)<='1';</p><p><b> end if;</b></p><p> if V7=0 then REGL(7)<='0';</p><p> else REGL(7)&l
72、t;='1';</p><p><b> end if;</b></p><p> if en='0' then </p><p> REGL<="00000000";</p><p> ELSIF LOCK='1' THEN <
73、/p><p> ADC_DISPLY<=REGL;</p><p><b> END IF;</b></p><p> next_state<=st4;</p><p> when st4=>next_state<=st0;</p><p> when OTHERS
74、=> next_state<=st0;</p><p><b> END CASE;</b></p><p> END PROCESS;</p><p> process(CLK,current_state,next_state)</p><p><b> begin</b>&l
75、t;/p><p> if (CLK'event and CLK='1') then</p><p> current_state<=next_state;</p><p><b> end if;</b></p><p> end process;</p><p>
76、; process(ADDA,ALE,add)</p><p><b> begin</b></p><p> if ALE='1'then add<=ADDA;</p><p> else add<=add;</p><p><b> end if;</b>&
77、lt;/p><p> end process;</p><p> END behav;</p><p> Flow Summary:</p><p><b> 邏輯器件連接圖:</b></p><p><b> 波形仿真:</b></p><p
78、> 結果說明,din的波形極為模擬的類正弦信號(此為預先用軟件模擬的溫度信號),ADC_DISPLY的波形即為在FPGA控制下的輸出波形,兩者之間符合的很好。基本上實現的溫度的測量和發(fā)送。實際電路中,sig信號將被實際的AD590測溫電路所替代,整個系統(tǒng)將根據傳回的實際變化的溫度信號進行相應的處理。</p><p><b> 心得體會;</b></p><p&g
79、t; 程設計和室友在一起討論商量,最后才寫完程序,完成此次數電課程設計。</p><p> 開學第一周老師就布置了課題,雖然沒開始實際動手去做,卻做了大量的準備工作,在網上收集很多資料,大體搞懂了ADC0908的工作狀態(tài)以及工作模式,對FPGA有了一定的了解,對整個設計思路有了大概的認識和了解。國慶節(jié)間,開始動手編寫程序。編寫程序花費了很長的時間,同學都是子網上找的程序,我們也找了,但是不符合我們的設計思路,
80、于是就自己編寫,但實際操作過程中,遇到了很多問題,剛開始編寫的程序錯誤百出,令人頭疼,后來看了很多資料,錯誤是改的沒了,那些個警告卻一直搞不定,最終還遺留著五六個警告沒有解決。在最后的編譯仿真階段,遇到了更多的問題,最終一一排除了,得到了一個大致合理的仿真結果,不甚滿意,卻實在力不從心。</p><p> 此 次課程設計,是第一次做的比較實用性的課題。遇到最大的困難還是沒有具體實物,那個ADC0809 八位集成
81、A/D轉換器的各個引腳還可以知道,對于那個FPGA,沒有一個具體概念,在編寫程序,定義端口的問題上,糾結了很久。因為課本中沒有具體事例,所有具體實例都得自己去找,鍛煉了分析和解決問題的能力。通過此次課程設計,筆者覺得課堂上學習的那點數電知識或者說課本知識,對于實際問題真的是冰山一角,更為嚴重的是,平時學習東西的時候,太粗糙,太死板,學出的東西是死的,壓根就不能用于實際的問題解決上面,在解決實際問題的時候,思路很狹隘,常常走進死胡同。對q
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論