學(xué)習(xí)FPGA的一點(diǎn)心得
VHDL作業(yè) 1、寫出消抖的程序,通過仿真或下載得出對應(yīng)的波形,并分析。 FPGA對于輸入的信號一般都要經(jīng)過消抖處理,以消除干擾信號。對于兩個(gè)設(shè)備之間的數(shù)據(jù)傳輸,這一點(diǎn)顯得尤為重要。 消抖一般通過記錄脈沖的個(gè)數(shù),對輸入信號的尖峰寬度進(jìn)行限制,達(dá)不到預(yù)定的寬度,即認(rèn)為是干擾,必須加以濾除,部分代碼如下。因此,信號經(jīng)過消抖去除干擾信號以后,必然產(chǎn)生延遲,延遲時(shí)間與系統(tǒng)晶振頻率以及計(jì)數(shù)脈沖個(gè)數(shù)有關(guān)。 例如:設(shè)系統(tǒng)晶振為40MHz,消抖時(shí)間為4個(gè)CLK,一個(gè)脈沖時(shí)間為1/40M=25ns,所以信號延時(shí)為25*4=100ns,如圖1所示。  圖1 信號消抖示意圖 代碼示例: (a)延時(shí)4clk - process (gclk,rst) --群信號消抖
- begin
- if rst='1' then
- sig_out<='0';
- elsif gclk'event and gclk = '1' then
- sig_0 <= sig_in;
- sig_1 <= sig_0;
- sig_2 <= sig_1;
- sig_3 <= sig_2;
- if ((sig_3 = sig_2) and (sig_2 = sig_1) and (sig_1 = sig_0) and (sig_0 = sig_in)) then
- sig_out <= sig_3;
- end if;
- end if;
- end process;
復(fù)制代碼
仿真結(jié)果如圖2: 
圖2消抖程序仿真圖 (b) 延時(shí)4ms - process (gclk)
- begin
- if rst='1' then
- signal_out<='0';
- psignal<='0';
- ppsignal<='0';
- signal_cnt<=0;
- elsif (gclk='1') and (gclk'event) then
- ppsignal <= psignal;
- psignal <= signal_in;
- if psignal /= ppsignal then
- signal_cnt <= 0;
- else
- signal_cnt <= signal_cnt + 1;
- if signal_cnt > 159999 then ------消抖時(shí)間為4ms------
- --if signal_cnt > 99 then
- signal_out <= psignal;
- end if;
- end if;
- end if;
- end process;
復(fù)制代碼
仿真結(jié)果; 
圖3延時(shí)仿真圖 2、測試在不同主頻、分頻下邏輯處理上的不同,并分析。 分頻器是數(shù)字系統(tǒng)設(shè)計(jì)中的基本電路,根據(jù)不同設(shè)計(jì)的需要,我們會遇到偶數(shù)分頻、奇數(shù)分頻、半整數(shù)分頻等,有時(shí)要求等占空比,有時(shí)要求非等占空比。在同一個(gè)設(shè)計(jì)中有時(shí)要求多種形式的分頻。通常由計(jì)數(shù)器或計(jì)數(shù)器的級聯(lián)構(gòu)成各種形式的偶數(shù)分頻及非等占空比的奇數(shù)分頻,實(shí)現(xiàn)較為簡單。但對半整數(shù)分頻及等占空比的奇數(shù)分頻實(shí)現(xiàn)較為困難。本文利用VHDL硬件描述語言,可設(shè)計(jì)了一種能夠滿足上述各種要求的較為通用的分頻器。 現(xiàn)通過設(shè)計(jì)一個(gè)可以實(shí)現(xiàn)8.5分頻,等占空比的17分頻,2、4、8、16、32分頻,及占空比為1∶8和4∶5的9分頻等多種形式分頻的分頻器。分頻器由帶使能端的異或門、模N計(jì)數(shù)器和一個(gè)2分頻器組成,本設(shè)計(jì)用D觸發(fā)器來完成2分頻的功能,實(shí)現(xiàn)方法是:將觸發(fā)器的Q反輸出端反饋回輸入端D,將計(jì)數(shù)器的一個(gè)計(jì)數(shù)輸出端作為D觸發(fā)器的時(shí)鐘輸入端。各功能模塊的VHDL語言實(shí)現(xiàn)如下。 1).模N計(jì)數(shù)器的實(shí)現(xiàn) 一般設(shè)計(jì)中用到計(jì)數(shù)器時(shí),我們可以調(diào)用lpm庫中的計(jì)數(shù)器模塊,也可以采用VHDL語言自己設(shè)計(jì)一個(gè)模N計(jì)數(shù)器。本設(shè)計(jì)采用VHDL語言設(shè)計(jì)一個(gè)最大模值為16的計(jì)數(shù)器。輸入端口為:使能信號en,復(fù)位信號clr和時(shí)鐘信號clk;輸出端口為:qa、qb、qc、qd。其VHDL語言描述略。 2).帶使能控制的異或門的實(shí)現(xiàn) 輸入端為:xor_en:異或使能,a和b:異或輸入;輸出端為:c:異或輸出。當(dāng)xor_en為高電平時(shí),c輸出a和b的異或值。當(dāng)xor_en為低電平時(shí),c輸出信號b。其VHDL語言略。 3).分頻(觸發(fā)器)的實(shí)現(xiàn) 輸入端為:時(shí)鐘信號clk,輸入信號d;輸出端為:q:輸出信號a,q1:輸出信號a反。其VHDL語言略。 以下是幾種分頻器的分析: 偶數(shù)分頻器 頻最易于實(shí)現(xiàn),欲實(shí)現(xiàn)占空比為50%的偶數(shù)N分頻,一般來說有兩種方案:,分頻器的基礎(chǔ)是計(jì)數(shù)器,設(shè)計(jì)分頻偶數(shù)分N/2-1時(shí),將輸出電平進(jìn)行一次翻轉(zhuǎn),同時(shí)給計(jì)數(shù)器一個(gè)復(fù)位信號,如此循環(huán)下去;二是當(dāng)計(jì)數(shù)器輸出為0到N/2-1時(shí),時(shí)鐘輸出為0或1,計(jì)數(shù)器輸出為N/2到N-1時(shí),時(shí)鐘輸出為0或1,計(jì)數(shù)器輸出為N/2到N-1時(shí),時(shí)鐘輸出為0或1,計(jì)數(shù)器輸出為N-1時(shí),復(fù)位計(jì)數(shù)器,如此循環(huán)下去。 圖4 偶數(shù)分頻仿真結(jié)果圖 圖 5 偶數(shù)分頻仿真結(jié)果圖 奇數(shù)分頻器 實(shí)現(xiàn)非50%占空比的奇數(shù)分頻,如占空比為20%、40%、60%、80%的5分頻器,可以采用類似偶數(shù)分頻的第二種方案;但如果實(shí)現(xiàn)占空比為50%的奇數(shù)分頻,就不能使用偶數(shù)分頻中所采用的方案了。 下面就以實(shí)現(xiàn)占空比40%的5分頻分頻器為例,說明非50%占空比的奇數(shù)分頻器的實(shí)現(xiàn)。該分頻器的實(shí)現(xiàn)對于我們實(shí)現(xiàn)50%占空比的分頻器有一定的借鑒意義。一下是奇數(shù)分頻仿真結(jié)果圖。 圖6 占空比為40%的5分頻仿真波形 半整數(shù)分頻器 僅僅采用數(shù)字分頻,不可能獲得占空比為50%的N+0.5分頻,我們只可以設(shè)計(jì)出占空比為(M+0.5)/(N+0.5)或者M(jìn)/(N+0.5)的分頻器,M小于N。這種半整數(shù)分頻方法是對輸入時(shí)鐘進(jìn)行操作,讓計(jì)數(shù)器計(jì)數(shù)到某一個(gè)數(shù)值時(shí),將輸入時(shí)鐘電平進(jìn)行一次反轉(zhuǎn),這樣,該計(jì)數(shù)值只保持了半個(gè)時(shí)鐘周期,因此實(shí)現(xiàn)半整數(shù)分頻。 如上所述,占空比為50%的奇數(shù)分頻可以幫助我們實(shí)現(xiàn)半整數(shù)分頻,將占空比為50%的奇數(shù)分頻與待分頻時(shí)鐘異或得到計(jì)數(shù)脈沖,下面的代碼就是依靠占空比為50%的5分頻實(shí)現(xiàn)2.5分頻器的。仿真結(jié)果如圖所示。 圖7 2.5分頻仿真波形 小數(shù)分頻器 小數(shù)分頻是通過可變分頻和多次平均的方法實(shí)現(xiàn)的。例如要實(shí)現(xiàn)4.7分頻,只要在10次分頻中,做7次5分頻,3次4分頻就可以得到。再如要實(shí)現(xiàn)5.67分頻,只要在100次分頻中,做67 6分頻,33次5分頻即可?紤]到小數(shù)分頻器要進(jìn)行多次兩種頻率的分頻,必須設(shè)法將兩種分頻均勻。表1以2.7分頻為例,小數(shù)部分進(jìn)行累加,如果大于等于10,則進(jìn)行3分頻,如果小于10,進(jìn)行2分頻。 仿真波形如圖 所示,我們可以清楚的看到2.7分頻的實(shí)現(xiàn)。按照占空比的定義,該分頻器的占空比應(yīng)為10/27。 圖8 2.7分頻仿真波形 分?jǐn)?shù)分頻器 將小數(shù)分頻的方法進(jìn)行擴(kuò)展,可以得到形如M*(L/N) 的分?jǐn)?shù)分頻的方法,例如,2*(7/13)等于分母的,進(jìn)行分頻,只要在13次分頻中,進(jìn)行7次3分頻,6次2分頻就可以得到。同樣,為了將兩種分頻均勻,將分子部分累加,小于分母的,進(jìn)行M分頻,大于(M+1)分頻。表2顯示了2*(7/13) 的分頻次序。 仿真波形如圖11所示。顯然,該分頻器的占空比為13/33。 圖9 33/13分頻器仿真波形 積分分頻器 積分分頻器用于實(shí)現(xiàn)形如 的分頻,例如8/3分頻。我們當(dāng)然可以使用上面提到的分?jǐn)?shù)分頻的方法,但對于這種形式的分頻,使用積分分頻的方法綜合往往占用更少的FPGA資源。 積分分頻法基于下述原理:一個(gè)m位的二進(jìn)制數(shù)字每次累加N,假定累加x次累加值最低m位回到0,同時(shí)超過 次,那么,當(dāng)前累加的數(shù)字應(yīng)該是 ;每越過 一次,最高位變化 2 次,所以,累加 x 次,最高位變化 2y次,得到 分頻的分頻器,例如,取m為4,N為3,當(dāng)累加16次時(shí),累加值為48,最低m位變回到0,同時(shí)越過16三次,最高位變化6次,由此得到16/6=8/3分頻的分頻器。 分頻仿真結(jié)果如圖所示。 圖10 積分分頻仿真波形 3、寫出異步串行通信的發(fā)送與接收程序,并分析。 異步串行數(shù)據(jù)傳輸具有設(shè)計(jì)簡單、傳輸穩(wěn)定等優(yōu)點(diǎn)。其兩個(gè)主要參數(shù)是波特率和數(shù)據(jù)位格式。數(shù)據(jù)位格式又稱幀格式,一般包含一個(gè)起始位(邏輯0),一個(gè)終止位(邏輯1)以及校驗(yàn)位。在發(fā)送空閑時(shí),總線一般處于邏輯1狀態(tài)。這樣當(dāng)接收端檢測到總線上由高到低的電平跳變,即認(rèn)為是數(shù)據(jù)開始傳輸。波特率是用來約定通信雙方的通信速率,一般通過對系統(tǒng)時(shí)鐘進(jìn)行分頻來實(shí)現(xiàn),RS-232協(xié)議中,常用的波特率有115200、9600等,RS-422與RS-232原理基本相同,只是在傳輸線路上,為了抗干擾,采用了差分方式。 在FPGA應(yīng)用領(lǐng)域 ,串行數(shù)據(jù)傳輸一般采用422總線。通過對系統(tǒng)晶振分頻,得到對應(yīng)的波特率,比如對40MHz經(jīng)行4分頻,得到10MBit的傳輸速率。解碼端會根據(jù)預(yù)先設(shè)定的波特率,對時(shí)鐘進(jìn)行分頻,每隔相等時(shí)間讀取總線上的一位數(shù)據(jù)。流程如下:在檢測到起始位低電平之后,接收端(即解碼端)每隔一位時(shí)間,采集總線上的電平,并寫入移位寄存器中,直到將一幀數(shù)據(jù)全部接收,然后判斷校驗(yàn)位,如果正確,則接收、編幀,否則,丟棄。 由于受溫度等因素的影響,晶振會產(chǎn)生誤差,串行數(shù)據(jù)在傳輸過程中,可能會受到干擾而產(chǎn)生毛刺。所以在一些對數(shù)據(jù)準(zhǔn)確度要求比較高的場合,就得考慮串行數(shù)據(jù)傳輸?shù)娜蒎e(cuò)能力。對于這種情況,第一種方法通常會采取對總線上的一位分別采集三次,比較得到的三個(gè)電平,進(jìn)而得到該位可信度更高的值,如圖2所示;第二種方法則會將電平的采集點(diǎn)放在每一位的靠近中間的位置,通過計(jì)算晶振的最大誤差,則可以計(jì)算出系統(tǒng)的最大容錯(cuò)能力。設(shè)晶振誤差5%,頻率為40MHz,1/40MHz=25ns,25*0.05=1.25ns,設(shè)波特率為4Mbit/s,所以對于40bit一幀的串行數(shù)據(jù),累積誤差最大會有1.25*40*4*50%=100ns,而比特位寬只有100ns,所以有可能會發(fā)生錯(cuò)位。 圖11 多次采樣減小誤差示意圖
部分代碼如下 (a)422串行發(fā)送
- process (pClock, pReset) --慣組信號源控制主進(jìn)程
- begin
- if pReset = '1' then
- ch_ClearBusyFlag <= '1';
- ch_tx <= '1';
- ch_send_reg <= "0000000000000000000000000000000000000000";
- ch_st <= 0;
- ch_clock_fp <= 0;
- elsif (pClock='1') and (pClock'event) then
- if ch_st = 0 then --監(jiān)測有無數(shù)據(jù)發(fā)送
- if (ch_s_busy_flag = '1') then
- ch_send_reg <= ch_send_buf; --讀取要發(fā)送的數(shù)到寄存器
- ch_ClearBusyFlag <= '0'; --置忙標(biāo)志清零
- ch_bit_counter <= 0;
- ch_clock_fp <= 0;
- ch_st <= 1;
- else
- ch_st <= 0;
- end if;
- elsif ch_st = 1 then --串行發(fā)送
- ch_clock_fp <= ch_clock_fp + 1; --0 - 57, 每位57個(gè)時(shí)鐘,共12位,1起始,1停止,2空閑
- if ch_clock_fp = 1 then
- ch_tx <= ch_send_reg(39 - ch_bit_counter);
- elsif ch_clock_fp = 2 then
- if ch_bit_counter = 39 then
- ch_tx <= '1';
- ch_st <= 0; --跳轉(zhuǎn)到監(jiān)測busy標(biāo)志,等待發(fā)送下一個(gè)數(shù)
- else
- ch_bit_counter <= ch_bit_counter + 1;
- end if;
- elsif ch_clock_fp = 3 then
- if ch_bit_counter = 5 then
- ch_ClearBusyFlag <= '1'; --忙標(biāo)志清零結(jié)束,4個(gè)clk,希望前一進(jìn)程不會監(jiān)測丟失
- end if;
- end if;
- end if;
- end if;
- end process;
復(fù)制代碼
(b) 422串行接收
******************************************************************
--命令接收主控制進(jìn)程**異步接收,40位
仿真結(jié)果: 
圖12異步串行通信的發(fā)送與接收 4、寫出PCM通信的發(fā)送與接收程序,并分析。 PCM脈沖編碼調(diào)制是將模擬信號轉(zhuǎn)換成二進(jìn)制數(shù)字信號的編碼過程。在無線遙測系統(tǒng)中,遙測采編器對多路模擬信號通過特定的順序(幀結(jié)構(gòu))進(jìn)行模數(shù)轉(zhuǎn)換采樣,然后再將采得的PCM碼并串轉(zhuǎn)換,串行送至無線發(fā)射機(jī)發(fā)射。地面站通過無線接收機(jī)接收。解碼后的PCM碼是一個(gè)由二進(jìn)制數(shù)構(gòu)成的串行序列。地面接收設(shè)備的主要任務(wù)是將串行PCM碼中的數(shù)據(jù)解調(diào)出來,這就需要根據(jù)PCM碼流中特定的同步碼確定數(shù)據(jù)的起始位,在位信號變化時(shí)的上升沿(或下降沿)把PCM碼流的位同步信號分離出來,再通過串行數(shù)據(jù)到并行數(shù)據(jù)的轉(zhuǎn)換把數(shù)據(jù)并行輸出。 PCM碼的串并轉(zhuǎn)換分為三步,第一步是提取同步信號,第二步是提取幀同步信號,第三步是根據(jù)已得到的位同步和幀同步完成字同步和串并轉(zhuǎn)換。 PCM碼在發(fā)送以及接收(解碼)過程中,都會用幀同步和碼同步對PCM碼進(jìn)行同步,有些還會用到路同步信號,如圖13所示。一般是PCM碼接收端發(fā)送同步信號(即幀同步、碼同步和路同步)。PCM碼發(fā)送端根據(jù)接收到的同步信號輸出PCM碼,比如在碼同步的上升沿或者下降沿給出數(shù)據(jù),接收端則根據(jù)自己發(fā)出的同步信號接收PCM碼。在實(shí)際數(shù)據(jù)傳輸過程中,考慮到信號的延時(shí),一般發(fā)送端在碼同步上升沿給出PCM數(shù)據(jù),接收端在碼同步下降沿讀取PCM數(shù)據(jù),而幀同步一般用作幀復(fù)位,路同步用作字節(jié)復(fù)位,如圖14所示。 接收端接收到PCM數(shù)據(jù)后,一般要經(jīng)過編幀,加上幀頭、幀尾以及幀計(jì)數(shù),然后上傳給計(jì)算機(jī)。計(jì)算機(jī)則將數(shù)據(jù)解包,提取出有用的信息。 
圖13 PCM碼接收發(fā)送過程中的信號示意圖 
圖14 同步信號示意圖 部分參考代碼: (a)幀同步、路同步、碼同步信號的產(chǎn)生
(b) PCM碼接收
- process (f_mtb, rst, f_ztb)
- begin
- if rst = '1' or f_ztb='1' then
- q_state<=q0;
- f_data<="00000000";
- f_flag<='0';
- elsif f_mtb'event and f_mtb = '0' and f_ztb='0' then
- case q_state is
- when q0 =>
- f_data(7)<=not qun_afxd;
- f_flag<='0';
- q_state<=q1;
- when q1 =>
- f_data(6)<=not qun_afxd;
- q_state<=q2;
- when q2 =>
- f_data(5)<=not qun_afxd;
- q_state<=q3;
- when q3 =>
- f_data(4)<=not qun_afxd;
- q_state<=q4;
- when q4 =>
- f_data(3)<=not qun_afxd;
- q_state<=q5;
- when q5 =>
- f_data(2)<=not qun_afxd;
- q_state<=q6;
- when q6 =>
- f_data(1)<=not qun_afxd;
- q_state<=q7;
- when q7 =>
- f_data(0)<=not qun_afxd;
- f_flag<='1';
- q_state<=q0;
- when others =>
- q_state<=q0;
- end case;
-
- end if;
- end process ;
復(fù)制代碼
(c) PCM碼編幀
仿真結(jié)果: 

圖15PCM通信的發(fā)送與接收仿真圖
完整的Word格式文檔51黑下載地址:
VHDL信號消抖.doc
(749.5 KB, 下載次數(shù): 10)
2018-8-20 11:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|