版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 數(shù)字電路課程設(shè)計(jì)</b></p><p><b> ——溫度采集與發(fā)送</b></p><p> 西安電子科技大學(xué)自動(dòng)化04113068</p><p><b> 任務(wù)分析:</b></p><p> 用ADC0809 八位集成A/D轉(zhuǎn)換器
2、,將測(cè)溫電路傳回的模擬電壓信號(hào)轉(zhuǎn)化為8位的數(shù)字信號(hào),然后將其送入預(yù)先下載好程序的FPGA進(jìn)行處理和發(fā)送,從而實(shí)現(xiàn)對(duì)溫度的測(cè)量與發(fā)送處理。</p><p><b> 設(shè)計(jì)思路:</b></p><p><b> 原理框圖</b></p><p> 設(shè)計(jì)相應(yīng)的溫度采集模塊的硬件電路;</p><p&g
3、t;<b> 編寫程序:</b></p><p> 軟件分頻,利用軟件將系統(tǒng)給定的頻率換算為ADC0908的工作頻率;</p><p> 串行通信,將數(shù)字信號(hào)進(jìn)行存儲(chǔ)和發(fā)送。</p><p> 編寫模擬的輸入信號(hào)sig。</p><p><b> 系統(tǒng)所用器件:</b></p>
4、<p> , </p><p> 圖1-1 圖1-2</p><p> 測(cè)溫電路;如圖1-1,其中用到電阻8個(gè):(100k電阻兩個(gè),1k電阻兩個(gè),10k電阻兩個(gè),12k電阻一個(gè),最大阻值為50k的滑動(dòng)變阻器一個(gè)。)運(yùn)算放大器兩個(gè);AD590(AD590是美國(guó)ANALOG DEV
5、ICES公司的單片集成兩端感溫電流源,其輸出電流與絕對(duì)溫度成比例。)溫度傳感器一個(gè);限壓二極管一只;(6v);12v的電壓源。傳感器傳來的溫度變化的電流信號(hào)經(jīng)過10k電阻變?yōu)殡妷盒盘?hào),經(jīng)過運(yùn)算放大器后(V=7.73+T/100)結(jié)合電位器(V=2.73)的調(diào)節(jié)后參與減法器的運(yùn)算,最終使得V0 的數(shù)值和實(shí)際溫度的數(shù)值大小相等。</p><p> ADC0809八位集成A/D轉(zhuǎn)換器(《數(shù)字電子技術(shù)基礎(chǔ)·
6、第二版,西電出版社》):使用IN3端口輸入來自測(cè)溫電路輸出的模擬信號(hào)(其中ADDC設(shè)置為0,ADDB設(shè)置為1,ADDA設(shè)置為1);時(shí)鐘由FPGA中軟件提供;</p><p> 3. 顯示部分由七段數(shù)碼管顯示。</p><p> 四,程序說明及仿真結(jié)果:</p><p> Sig: (因?yàn)樵诜抡娴臅r(shí)候,不加入模擬信號(hào),沒法仿真,就設(shè)置了一個(gè)信號(hào),在仿真
7、時(shí)替換測(cè)溫電路輸入的模擬信號(hào),實(shí)際中用測(cè)溫電路傳回的信號(hào)替代),在128MHz下,輸出模擬的四十組0到255之間的類正弦模擬信號(hào)。</p><p> Conta: 此為外部硬件時(shí)鐘信號(hào)產(chǎn)生設(shè)備產(chǎn)生128MHz的時(shí)鐘信號(hào),分頻后向sig、CONVERTER、ADC0809提供主時(shí)鐘信號(hào),以及向ADC0809提供start的信號(hào);</p><p> CONVERTER: 在
8、64MHz下,控制ADC0809,以及完成串行轉(zhuǎn)換。</p><p> ADC0809: 在500KHz下,共有五個(gè)工作狀態(tài)(st0,st1,st2,st3,st4),在st0時(shí)讀入模擬信號(hào),st1時(shí)進(jìn)行逐次逼近計(jì)算,st2時(shí)等待oe信號(hào),st3時(shí)輸出轉(zhuǎn)換結(jié)果,st4時(shí)無(wú)動(dòng)作然后轉(zhuǎn)回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 --產(chǎn)生模擬信號(hào)</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; --庫(kù)和程序包的調(diào)用</p><p> entity conta is --集線器,將輸入輸
28、出集中到一個(gè)模塊上,同時(shí)給adc0809啟動(dòng)信號(hào)</p><p> port(a_in : in std_logic_vector(7 downto 0); --定義一個(gè)輸入端口a共8位</p><p> b_out : out std_logic_vector(7 downto 0); --定義一個(gè)輸出端口b共8位</p><
29、;p> c_in:in std_logic;-- 定義一個(gè)輸入端口c</p><p> d_out:out std_logic;-- 定義一個(gè)輸出端口d</p><p> clk_in:in std_logic;-- 定義一個(gè)輸入時(shí)鐘端口clk</p><p> clk_out:out std_logic;-- 定義一個(gè)輸出時(shí)鐘端口clk</p&
30、gt;<p> start_out:out std_logic); --定義一個(gè)輸出的start端口</p><p><b> --4MHz</b></p><p> end conta; --實(shí)體conta描述結(jié)束</p><p> architecture behav of conta is
31、 --結(jié)構(gòu)體名為conta</p><p> signal q:std_logic_vector(4 downto 0):="00000"; --定義一個(gè)標(biāo)準(zhǔn)邏輯矢量信號(hào)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; --庫(kù)和程序包的調(diào)用</p><p> entity CONVERTER is
37、 --串行轉(zhuǎn)換,提供adc0809工作信號(hào)及頻率 </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庫(kù)</p><p> use ieee.std_logic_1164.all;
51、 --程序包的調(diào)用</p><p> use ieee.std_logic_unsigned.all; --程序包的調(diào)用</p><p> entity ADC0809 is --實(shí)體名為: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; --實(shí)體描述結(jié)束</p><p> architecture behav of ADC0809 is -- 結(jié)構(gòu)體名為:ADC0809</p><p> type states is (st0,st1,st2,st3,st4); --用枚舉類型進(jìn)行狀態(tài)定義</p><p
55、> SIGNAL REGL : std_logic_vector(7 DOWNTO 0);--定義標(biāo)準(zhǔn)邏輯矢量信號(hào) REGL</p><p> signal Dout_int : integer range 0 to 255; --信號(hào)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、> 結(jié)果說明,din的波形極為模擬的類正弦信號(hào)(此為預(yù)先用軟件模擬的溫度信號(hào)),ADC_DISPLY的波形即為在FPGA控制下的輸出波形,兩者之間符合的很好?;旧蠈?shí)現(xiàn)的溫度的測(cè)量和發(fā)送。實(shí)際電路中,sig信號(hào)將被實(shí)際的AD590測(cè)溫電路所替代,整個(gè)系統(tǒng)將根據(jù)傳回的實(shí)際變化的溫度信號(hào)進(jìn)行相應(yīng)的處理。</p><p><b> 心得體會(huì);</b></p><p&g
79、t; 程設(shè)計(jì)和室友在一起討論商量,最后才寫完程序,完成此次數(shù)電課程設(shè)計(jì)。</p><p> 開學(xué)第一周老師就布置了課題,雖然沒開始實(shí)際動(dòng)手去做,卻做了大量的準(zhǔn)備工作,在網(wǎng)上收集很多資料,大體搞懂了ADC0908的工作狀態(tài)以及工作模式,對(duì)FPGA有了一定的了解,對(duì)整個(gè)設(shè)計(jì)思路有了大概的認(rèn)識(shí)和了解。國(guó)慶節(jié)間,開始動(dòng)手編寫程序。編寫程序花費(fèi)了很長(zhǎng)的時(shí)間,同學(xué)都是子網(wǎng)上找的程序,我們也找了,但是不符合我們的設(shè)計(jì)思路,
80、于是就自己編寫,但實(shí)際操作過程中,遇到了很多問題,剛開始編寫的程序錯(cuò)誤百出,令人頭疼,后來看了很多資料,錯(cuò)誤是改的沒了,那些個(gè)警告卻一直搞不定,最終還遺留著五六個(gè)警告沒有解決。在最后的編譯仿真階段,遇到了更多的問題,最終一一排除了,得到了一個(gè)大致合理的仿真結(jié)果,不甚滿意,卻實(shí)在力不從心。</p><p> 此 次課程設(shè)計(jì),是第一次做的比較實(shí)用性的課題。遇到最大的困難還是沒有具體實(shí)物,那個(gè)ADC0809 八位集成
81、A/D轉(zhuǎn)換器的各個(gè)引腳還可以知道,對(duì)于那個(gè)FPGA,沒有一個(gè)具體概念,在編寫程序,定義端口的問題上,糾結(jié)了很久。因?yàn)檎n本中沒有具體事例,所有具體實(shí)例都得自己去找,鍛煉了分析和解決問題的能力。通過此次課程設(shè)計(jì),筆者覺得課堂上學(xué)習(xí)的那點(diǎn)數(shù)電知識(shí)或者說課本知識(shí),對(duì)于實(shí)際問題真的是冰山一角,更為嚴(yán)重的是,平時(shí)學(xué)習(xí)東西的時(shí)候,太粗糙,太死板,學(xué)出的東西是死的,壓根就不能用于實(shí)際的問題解決上面,在解決實(shí)際問題的時(shí)候,思路很狹隘,常常走進(jìn)死胡同。對(duì)q
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)電課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 數(shù)電課程設(shè)計(jì)---數(shù)字溫度計(jì)
- 溫度采集系統(tǒng)課程設(shè)計(jì)
- 多路溫度采集課程設(shè)計(jì)
- 多路溫度采集課程設(shè)計(jì)
- 數(shù)電課程設(shè)計(jì)
- 數(shù)電課程設(shè)計(jì)
- 數(shù)電課程設(shè)計(jì)-溫度計(jì)實(shí)驗(yàn)報(bào)告
- 數(shù)電模電課程設(shè)計(jì)
- 模電數(shù)電課程設(shè)計(jì)
- 無(wú)線溫度采集系統(tǒng)課程設(shè)計(jì)
- 溫度采集及顯示課程設(shè)計(jì)
- 溫度采集顯示系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)---模擬溫度采集監(jiān)控系統(tǒng)
- 溫度采集與控制課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì)--溫度采集系統(tǒng)
- 數(shù)電課程設(shè)計(jì)-變音警笛
- 循環(huán)彩燈數(shù)電課程設(shè)計(jì)
- 數(shù)電課程設(shè)計(jì)--數(shù)字計(jì)步器
- 數(shù)電課程設(shè)計(jì)-數(shù)字時(shí)鐘
評(píng)論
0/150
提交評(píng)論