找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5297|回復(fù): 0
收起左側(cè)

max7000系列CPLD紅外線遙控課程設(shè)計(jì)(含源代碼與文檔)

[復(fù)制鏈接]
ID:259533 發(fā)表于 2018-3-12 23:19 | 顯示全部樓層 |閱讀模式
數(shù)字系統(tǒng)設(shè)計(jì)


第一部分  設(shè)計(jì)題目及要求
本次設(shè)計(jì)的題目及要求如下:

一、設(shè)計(jì)題目

紅外線遙控接收器

二、設(shè)計(jì)步驟

1、EDA實(shí)驗(yàn)板組裝調(diào)試

參照提供的EDA實(shí)驗(yàn)板電路原理圖、PCB圖以及元器件清單進(jìn)行電路板的組裝。電路板組裝完成后,編寫三個(gè)小程序進(jìn)行電路板測(cè)試。

2、紅外遙控系統(tǒng)的設(shè)計(jì)

(1)發(fā)射編碼部分

使用指定的元器件在萬(wàn)用板上完成紅外遙控器的制作。

(2)接收解碼部分

接收解碼用VHDL語(yǔ)言編寫程序,在EDA實(shí)驗(yàn)板上實(shí)現(xiàn)解碼。

二、功能要求

1、將一體化紅外接收解調(diào)器的輸出信號(hào)解碼(12個(gè)單擊鍵、6個(gè)連續(xù)鍵,單擊鍵編號(hào)為7-18,連續(xù)鍵編碼為1-6),在EDA實(shí)驗(yàn)板上用七段數(shù)碼管顯示出來(lái)。

2、當(dāng)按下遙控器1—6號(hào)連續(xù)鍵時(shí),在EDA實(shí)驗(yàn)板上用發(fā)光二極管點(diǎn)亮作為連續(xù)鍵按下的指示,要求遙控器上連續(xù)鍵接下時(shí)指示燈點(diǎn)亮,直到松開按鍵時(shí)才熄滅,用于區(qū)別單擊鍵。

3、EDA實(shí)驗(yàn)板上設(shè)置四個(gè)按鍵,其功能等同于遙控器上的1—4號(hào)按鍵,當(dāng)按下此四個(gè)按鍵時(shí)七段數(shù)碼管分別對(duì)應(yīng)顯示“1”、“2”、“3”、“4”。

4、每當(dāng)接收到有效按鍵時(shí),蜂鳴器會(huì)發(fā)出提示音。

第二部分   設(shè)計(jì)分析

本次設(shè)計(jì)包括兩大部分,一是電路設(shè)計(jì)及電路焊接,二是程序的設(shè)計(jì)及編寫。

電路部分,根據(jù)題目要求,要做到紅外發(fā)送,顯然整個(gè)電路系統(tǒng)要分為紅外發(fā)射和紅外接收兩個(gè)電路,分別做到紅外的編碼發(fā)射和譯碼接受,再在接收板上顯示接受到的紅外信號(hào)。另外還包括一個(gè)從電腦下載程序到芯片上的下載線電路。

  • 紅外發(fā)射電路

本次設(shè)計(jì)的紅外遙控器由紅外遙控專用芯片PT2248作為編碼及發(fā)送部分,PT2248最大可用作18路紅外遙控系統(tǒng)的編碼,其內(nèi)部己集成了38kHz的紅外載波振蕩及相應(yīng)的數(shù)字脈碼調(diào)制電路,只需外接3×6的矩陣式按鍵、紅外發(fā)光二極管及其驅(qū)動(dòng)電路等少量元器件便可完成編碼發(fā)送的功能。

由PT2248和少量外圍元件組成的紅外遙控發(fā)射電路如下圖所示

芯片的發(fā)送指令由12位碼組成,其中C1~C3是用戶碼,可用來(lái)確定不同的模式。用戶碼設(shè)定是以列線內(nèi)接入二極管為界線,當(dāng)T1~T3與CODE之間分別接入二極管時(shí),用戶碼(C1~C3)為“1”;當(dāng)T1~T3引腳不接二極管時(shí),用戶碼為“0”。如果該芯片與BL9150相結(jié)合,則C3引腳必須接入二極管;如果該芯片與BL9149相結(jié)合,則C2必須接二極管,H、S1和S2是代表連續(xù)發(fā)送或單次發(fā)送的碼,且分別與T1、T2和T3列的鍵對(duì)應(yīng)。D4~D6是發(fā)送的數(shù)據(jù)碼(也是鍵輸入碼)

上圖中3V電源電壓一方面為芯片提供推薦工作電壓并加到引腳16,另一方面作為信號(hào)輸出指示復(fù)合管的工作電壓。為了使振蕩頻率為455kHz,特采用外接晶振,并外接兩個(gè)電容120pF旁路到地。圖7中三列T1、T2、T3和CODE分別接一個(gè)二極管,目的是為了使用戶碼(C1、C2、C3)為“1”。

  •       紅外接受部分
本次設(shè)計(jì)的紅外接受部分采用EDA實(shí)驗(yàn)板,EDA實(shí)驗(yàn)板的頂層PCB圖如下:
.
硬件部分的設(shè)計(jì):

板的中心部件采用的是max7000系列CPLD,另外采用4M晶振以及紅外接收管(38K接收頭)直接在邏輯箱制作紅外接收解碼電路。紅外接收管有3個(gè)管腳,自左至右分別是信號(hào)輸出端,地端,電源端,分別接到邏輯箱的相應(yīng)管腳上;同時(shí),為了得到更加穩(wěn)定的信號(hào),在信號(hào)輸出端與地端加入一濾波電容。

三,下載線電路

本次設(shè)計(jì)采用的下載線把電腦的打印機(jī)口和實(shí)驗(yàn)板的數(shù)據(jù)口連接起來(lái),從而把程序從電腦下載到實(shí)驗(yàn)板的芯片里,如下圖:

下載線電路采用芯片74LS244構(gòu)成下載線電路,電路圖如下:
下載線電路板的頂層PCB圖如下:
第三部分  系統(tǒng)模塊的劃分以及各模塊的功能描述

在這一部分,我將對(duì)系統(tǒng)功能進(jìn)行模塊化劃分,對(duì)各模塊功能作詳細(xì)闡述。

  • 發(fā)射板部分

  發(fā)射板主要由紅外線編碼芯片PT2248 構(gòu)成紅外編碼這個(gè)模塊。

  PT2248的管腳圖如下圖所示:



其各個(gè)管腳的功能如下表:




PT2248組成的十八路遙控發(fā)送器其編碼規(guī)則如下:

(1)設(shè)a為一個(gè)時(shí)間單位,時(shí)間長(zhǎng)度是38kHz的16個(gè)時(shí)鐘周期,即

a=1÷38kHz×16=0.421ms

              編碼是以串行形式發(fā)送的,在接收端(38kHz一體化紅外接收解調(diào)器)接收到如下形式的1位的編碼時(shí)分別表示“0”和“1”:

1個(gè)a的低電平,3個(gè)a的高電平表示編碼“0”

3個(gè)a的低電平,1個(gè)a的高電平表示編碼“1”

編碼以串行形式發(fā)送,接收端的一體化紅外接收解調(diào)器輸出波形如下圖所示:

此外,由于發(fā)射器發(fā)送的時(shí)候,有兩個(gè)信號(hào),一種是表示單擊的,一種則是表示連續(xù)的,這兩種不同的信號(hào),其自身都有自己的特點(diǎn):

(2)遙控器的每個(gè)按鍵編碼由12位按以上編碼規(guī)則所代表的“0”、“1”組成,時(shí)間長(zhǎng)度為48a,當(dāng)按下遙控器的7到18號(hào)單擊按鍵,則以12位為一組(48a)發(fā)送兩次編碼,如下圖所示:

60a為自按下按鍵到發(fā)送編碼的等待時(shí)間,80a是前后兩次發(fā)送12位48a編碼的高電平時(shí)間間隔。7到18號(hào)單擊按鍵無(wú)論發(fā)送端按鍵時(shí)間持續(xù)多長(zhǎng)只發(fā)送一次這樣形式的兩組相同的12位編碼。

(3)當(dāng)按下1到6號(hào)連續(xù)按鍵時(shí),編碼按如下格式連續(xù)發(fā)送:

由上圖可以清楚的看到,兩種信號(hào)的巨大差別,可是在程序的編寫過程中,這種差別卻沒有什么很大的作用,因?yàn)閮煞N信號(hào)在譯碼上的區(qū)別也是相當(dāng)明顯的,故為了簡(jiǎn)化程序,直接由譯碼來(lái)區(qū)別連續(xù)單擊比利用上圖的效果更好,具體見程序。

(4)芯片的發(fā)送指令由12位碼組成,如下所列。其中C1~C3是用戶碼,可用來(lái)確定不同的模式。用戶碼設(shè)定是以列線內(nèi)接入二極管為界線,當(dāng)T1~T3與CODE之間分別接入二極管時(shí),用戶碼(C1~C3)為“1”;當(dāng)T1~T3引腳不接二極管時(shí),用戶碼為“0”。

具體每個(gè)12位的串行編碼規(guī)則如下:

C1、C2、C3為用戶可通過在遙控器發(fā)射電路中是否接入IN4148二極管決定其為“0”或“1”,這里取“111”,H、S1、S2為單擊連續(xù)按鍵的標(biāo)志位,相當(dāng)于列坐標(biāo),D1至D6為按鍵輸入碼,相當(dāng)于行坐標(biāo),低9位的按鍵編碼如下表所示:


按鍵
低9位編碼
H
S1
S2
D1
D2
D3
D4
D5
D6
1
1
0
0
1
0
0
0
0
0
2
1
0
0
0
1
0
0
0
0
3
1
0
0
0
0
1
0
0
0
4
1
0
0
0
0
0
1
0
0
5
1
0
0
0
0
0
0
1
0
6
1
0
0
0
0
0
0
0
1
7
0
1
0
1
0
0
0
0
0
8
0
1
0
0
1
0
0
0
0
9
0
1
0
0
0
1
0
0
0
10
0
1
0
0
0
0
1
0
0

續(xù)上表:
二,接收部分

接收部分電路主要可分為紅外接受模塊,譯碼電路模塊,小鍵盤模塊和數(shù)碼管顯示模塊幾個(gè)部分,紅外信號(hào)的編碼從發(fā)射板發(fā)射到接收板上的紅外信號(hào)接收頭后 ,譯碼電路把紅外編碼翻譯后送到數(shù)碼管顯示,小鍵盤輸入的代碼也經(jīng)譯碼電路在數(shù)碼管上顯示對(duì)應(yīng)的按鍵信息。


(一).紅外信號(hào)接受

本設(shè)計(jì)的紅外接受頭采用一體化紅外接收解調(diào)器,如下圖:

其引腳圖如下:

一體化紅外接收解調(diào)器的內(nèi)部電路如下圖:

  上面詳述的紅外信號(hào)發(fā)射電路把發(fā)射板上的按鍵信息編成編碼以紅外信號(hào)的形式發(fā)射到接收板,該一體化紅外接收解調(diào)器接收到紅外信息后,把其包含的編碼信息傳到下一級(jí)譯碼電路,從而完成紅外信號(hào)的接收。

當(dāng)紅外接收頭接收到遙控器發(fā)出的信號(hào)時(shí),邏輯箱上的蜂鳴器需發(fā)出提示聲。因設(shè)計(jì)時(shí)只考慮譯碼器具有最簡(jiǎn)單的譯碼功能,這樣就要求前面的編碼電路在每發(fā)出一串12位編碼的同時(shí)發(fā)出一個(gè)脈沖給計(jì)數(shù)器,使計(jì)數(shù)器輸出為高電平,同時(shí)開始計(jì)數(shù),直至計(jì)數(shù)到規(guī)定值后又回到低電平,完成響鈴提示。
(二)紅外編碼譯碼電路

根據(jù)芯片介紹可知,紅外接收頭接收到的編碼,每一幀完整的串行數(shù)據(jù)有十二位,而每一位的BIT‘0’、BIT‘1’是占空比不同的矩形方波,要完成以后的功能,就需要一個(gè)編碼器將其編成邏輯器件能識(shí)別的普通邏輯電平‘0’、‘1’。

紅外接收頭接收負(fù)責(zé)接收38k載波的紅外光,解調(diào)得到脈沖,輸出至譯碼電路。接收頭接收到的脈沖如圖(與發(fā)射波形剛好互為反碼): (a為38kHz時(shí)鐘的16個(gè)周期)

每個(gè)按鍵的值由12bit組成:

按鍵編碼格式:

譯碼電路有把對(duì)應(yīng)的譯碼程序下載后的CPLD構(gòu)成,CPLD的外圍電路如下圖:

CPLD和芯片74HC4040以及其他元件構(gòu)成譯碼電路,74HC4040的管腳圖如下圖所示:
其內(nèi)部電路圖如下圖:
一體化紅外接收解調(diào)器接收到紅外信息后,將紅外編碼通過73HC4040傳到CPLD進(jìn)行譯碼。
(三)紅外編碼顯示電路

這部分電路將譯碼后得到的十二位普通高低電平‘0、’‘1’編碼譯成相應(yīng)的壓縮BCD碼1~18,應(yīng)十位僅有0、1兩種可能,將譯得的BCD碼直接接芯片4511的輸入引腳,4511的譯碼輸出并接到4位LED數(shù)碼顯示管,再在程序中寫入十位和個(gè)位選擇的進(jìn)程,即可得到相應(yīng)1~18數(shù)字顯示輸出。

顯示部分電路由芯片CD4511BC構(gòu)成,譯碼后的高低電平從CPLD的44,45,46,48,49管腳傳輸?shù)紺D4511BC,進(jìn)行譯碼,這部份電路如下:

CPLD的33——41角分別接到三級(jí)管(8050)Q2——Q9,通過段路線,選擇兩個(gè)四位LED數(shù)碼顯示管里的共八位顯示中的哪一位或哪幾位顯示,沒有接段路線的那些位的顯示管將不亮。

CD4511BC的管腳圖如下圖所示:

其真值表及對(duì)應(yīng)的LED數(shù)碼顯示管顯示如下:

(四)小鍵盤電路

   EDA實(shí)驗(yàn)板上有個(gè)4*4 的按鍵矩陣,當(dāng)按鍵被按下時(shí),其輸出引腳為低電平,而其余時(shí)間內(nèi)均為高電平。當(dāng)按下每一行的四個(gè)鍵時(shí),七段碼顯示管應(yīng)顯示1—4,必須將四個(gè)按鍵并行輸入的按鍵編碼轉(zhuǎn)換成1—4的BCD碼才能輸出顯示。按鍵輸入與遙控輸入應(yīng)共用兩個(gè)七段碼顯示管輸出,這樣就需要在程序中將輸入的遙控信號(hào)與按鍵信號(hào)先進(jìn)行選擇再輸出。

  這部分電路如下圖所示:

第四部分  程序設(shè)計(jì)及注釋源程序

一、本次設(shè)計(jì)的程序設(shè)計(jì)的ASM圖如下:

        


二、程序設(shè)計(jì)時(shí)的主要部分以及遇到的問題及解決方案:


1頻率的同步問題:

這是本程序的一個(gè)關(guān)卡,由于信號(hào)的載波是16k,而晶振的頻率采用了4M,就是說(shuō)無(wú)論怎么分頻,邏輯箱出來(lái)的頻率都不可能得到載波信號(hào)的頻率,所以有可能經(jīng)過幾次解碼之后便出現(xiàn)誤碼。

本設(shè)計(jì)具體采用的處理措施如下:4M的2的7次方分頻(沒有安裝word的公式,請(qǐng)見諒哦),所得到一個(gè)信號(hào)(即4個(gè)a)為14倍clk,這里用到一個(gè)cnt1,每個(gè)時(shí)鐘上升沿計(jì)數(shù)一次,計(jì)數(shù)到第7個(gè)時(shí)鐘上升沿時(shí),便進(jìn)行讀數(shù),根據(jù)0和1波形的特點(diǎn),可知在此時(shí)輸入信號(hào)infared_in與其真正表示的值相反,故有:

if cnt1=7 then reg2<=reg2(7 downto 0) & not txout;
end if;
在第14個(gè)clk后,剩下的0.2個(gè)clk將產(chǎn)生誤碼,故采取以下措施:
when T1=>
if cnt1=50 then
cnt1<=0;
state<=T0;
else
cnt1<=cnt1+1;
end if;

計(jì)到第14個(gè)clk時(shí)(由于其中經(jīng)過兩個(gè)狀態(tài),所以計(jì)數(shù)只計(jì)到12),又回到T0,重新檢測(cè)infared_in=‘0’后回到T1狀態(tài),從而取出那0.2個(gè)clk的影響。


2)如何判斷接收到一串完整的12位數(shù)據(jù)問題:

如果采用cnt1計(jì)數(shù)來(lái)控制的話,會(huì)導(dǎo)致cnt1的取值過大,而且會(huì)出現(xiàn)誤差時(shí)間的積累,故本程序用到的第二個(gè)計(jì)數(shù)器cnt2,其作用也不容小視,在每一次cnt1=7時(shí),都會(huì)將cnt2自加,如下:

Ifcnt1=7 then
cnt2<=cnt2+1;
reg<=reg (7 downto 0) & not infared_in;
end if;                                 
if  cnt2=12 then
cnt2<=0;
speaker<='1';
end if;

這是用來(lái)記錄移入寄存器reg的次數(shù),計(jì)到12時(shí),說(shuō)明已經(jīng)接收了1個(gè)完整的信號(hào)了,此時(shí)把cnt2清零,以便下一次接收信號(hào)時(shí)使用。

3) 指示燈跟蜂鳴器的問題:

當(dāng)接收一個(gè)完整的信號(hào)之后,當(dāng)讓就是對(duì)這存在reg中的一串01代碼進(jìn)行譯碼了,同時(shí)根據(jù)題目要求,蜂鳴器要相應(yīng)的響一聲。故當(dāng)cnt2=12時(shí)sound賦為高電平,并啟用第三個(gè)計(jì)數(shù)器cnt3,cnt3在下一個(gè)時(shí)鐘上升沿開始自加,加至16000,即延時(shí)16000/16k=1秒后停止,后將sound從新賦0。具體實(shí)現(xiàn)如下:

if cnt2=12 then
cnt2<=0;
speaker<='1';
end if;
if speaker='1' then
cnt3<=cnt3+1;
if cnt3=16000 then
cnt3<=0;
                              speaker<='0';
end if;
end if;
4、EDA板上的按鍵問題:EDA試驗(yàn)板的按鍵的每一行的四個(gè)按鍵分別對(duì)應(yīng)B1 ,B2,B3,B4,具體實(shí)現(xiàn)只是在時(shí)鐘上升沿下加入一下程序段即可。
if B1='0' then
reg<="100100000";
             end if;
             if B2='0' then
reg<="100010000";
             end if;
             if B3='0' then
reg<="100001000";
             end if;
             if B4='0' then
reg<="100000100";
             end if;
  • 源程序
綜合上面所討論的幾點(diǎn),可的得到本次設(shè)計(jì)的源程序(帶注釋)
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. entity infared is
  5. port (clk,infared_in,B1,B2,B3,B4,reset:in std_logic;
  6. --B1.B2.B3.B4為實(shí)驗(yàn)版上4*4鍵盤每一行對(duì)應(yīng)的4個(gè)按鍵
  7. --infared_in為紅外接收頭接收并解碼輸出的信號(hào)
  8. BCD_out : out std_logic_vector(3 downto 0);   
  9. --芯片輸出到4511的經(jīng)紅外編碼后的12位按鍵碼對(duì)應(yīng)的4位代碼
  10. selet: out std_logic_vector(1 downto 0);        
  11. --數(shù)碼顯示管十位和個(gè)位的選擇信號(hào)
  12. led,speaker : buffer std_logic);               
  13. --連續(xù)鍵的指示燈信號(hào),按鍵按下即蜂鳴器信號(hào)
  14. end infared;
  15.   architecture behav of infared is
  16.       type state_type is (s0,s1,s2);
  17.       signal state : state_type;
  18.       signal reg : std_logic_vector(8 downto 0);
  19.       signal cnt1 : integer range 0 to 14;
  20. --0, 1解碼計(jì)數(shù)器。對(duì)0的個(gè)數(shù)的計(jì)數(shù),遇到0則開始計(jì)數(shù),遇到1就停止,以區(qū)別0和1的編碼
  21.       signal cnt2 : integer range 0 to 12;
  22. --輸入的編碼位數(shù)計(jì)數(shù)器,計(jì)數(shù)到到12就把編碼輸出到infared_in
  23.       signal cnt3 : integer range 0 to 16000;
  24. --蜂鳴器延時(shí)計(jì)數(shù)器
  25.       signal cnt4 : integer range 0 to 1;
  26. --個(gè)位十位選擇計(jì)數(shù)器,為0時(shí)數(shù)碼管顯示個(gè)位,為1顯示十位
  27.   begin
  28. judge:process (clk,infared_in,cnt1)  
  29. --進(jìn)程1,判斷是否接受到低電平,紅外接受低電平有效,infared_in=0時(shí)表示有編碼輸入
  30.       begin        
  31.         if clk'event and clk='1' then
  32.           case state is
  33.             when s0=> if infared_in='0' then
  34.                          state<=s1;
  35.                       else
  36.                          state<=s0;               
  37. --檢測(cè)輸入信號(hào),如果是高電平則繼續(xù)檢測(cè);如果為低電平則進(jìn)入狀態(tài)s1
  38.                       end if;
  39.             when s1=> if cnt1=12 then
  40.                          cnt1<=0;
  41.                          state<=s2;
  42.                       else cnt1<=cnt1+1;              
  43. --計(jì)數(shù)到12時(shí),跳到s2狀態(tài),繼續(xù)檢測(cè)低電平
  44.                       end if;
  45.             when s2=>
  46. if infared_in='1' then         
  47. --若出現(xiàn)高電平則跳回s0狀態(tài)
  48.                          state<=s0;
  49.                                                                         else
  50.                          state<=s2;
  51.                     end if;
  52.            end case;
  53.         end if;                                       
  54. --當(dāng)計(jì)數(shù)到7時(shí),自動(dòng)跳到進(jìn)程com2,每接收完一個(gè)完整的0或1信號(hào)后,自動(dòng)接收下一個(gè)信號(hào),自身不停地在兩個(gè)狀態(tài)中輪換。
  55.      end process judge;
  56. coding:process(clk,cnt1,cnt2,cnt3,B1,B2,B3,B4)      
  57. --編碼譯碼進(jìn)程
  58. begin
  59.      if clk'event and clk='1' then
  60.          if B1='0' then
  61.            reg<="100100000";         
  62. --B1按下,寄存器儲(chǔ)存表示00000001的代碼。
  63.          end if;
  64.          if B2='0' then
  65.            reg<="100010000";         
  66. --B2按下,寄存器儲(chǔ)存表示00000010的代碼。
  67.          end if;
  68.          if B3='0' then
  69.            reg<="100001000";         
  70. --B3按下,寄存器儲(chǔ)存表示00000011的代碼。
  71.          end if;
  72.          if B4='0' then
  73.            reg<="100000100";         
  74. --B4按下,寄存器儲(chǔ)存表示00000100的代碼。
  75.          end if;
  76.          if cnt1=7 then                             
  77.             cnt2<=cnt2+1;                           
  78. --cnt2加1,表示移入一位數(shù)據(jù)
  79.            reg<=reg (7 downto 0) & not infared_in;
  80.           end if;                                 
  81. --當(dāng)計(jì)數(shù)到7時(shí),將接收到的infared_in的相反值移入寄存器。
  82.            if cnt2=12 then                        
  83. --當(dāng)cnt2計(jì)數(shù)到12時(shí),表示接收到了完整的一串?dāng)?shù)據(jù),自身清零并開啟蜂鳴器
  84.                cnt2<=0;
  85.                speaker<='1';
  86.             end if;
  87.             if speaker='1' then
  88.                  cnt3<=cnt3+1;
  89.               if cnt3=16000 then
  90.                  cnt3<=0;
  91.                  speaker<='0';                        
  92. --計(jì)數(shù)cnt3計(jì)到16000時(shí)賦0,蜂鳴器停止,即蜂鳴器鳴響時(shí)間持續(xù)16000/16k=1秒后停止
  93.               end if;
  94.             end if;
  95.         end if;

  96.      end process coding;
  97. display:process(clk,reg,reset)                          
  98. --顯示進(jìn)程。低9位編碼轉(zhuǎn)換成對(duì)應(yīng)的BCD輸出,1-6連續(xù)按鍵燈亮,7-18單擊鍵燈滅,
  99.    begin
  100.      if(reset='1') then                                  --高電平復(fù)位
  101.        BCD_out<="0000";
  102.        selet<="11";
  103.        led<='1';                                       
  104. --若按下復(fù)位鍵,十位個(gè)位同時(shí)顯示0,指示燈亮
  105.      elsif (clk'event and clk='1') then
  106.        led<='1';                              
  107.          case reg is
  108.           when "100100000" => BCD_out<="0001";            --顯示1
  109.                             selet<="01";
  110.                             led<='0';
  111.           when "100010000" =>BCD_out<="0010";              --顯示2
  112.                              selet<="01";
  113.                              led<='0';
  114.           when "100001000" => BCD_out<="0011";              --顯示3
  115.                             selet<="01";
  116.                             led<='0';
  117.           when "100000100" => BCD_out<="0100";              --顯示4
  118.                             selet<="01";
  119.                             led<='0';
  120.           when "100000010" => BCD_out<="0101";              --顯示5
  121.                             selet<="01";
  122.                             led<='0';
  123.           when "100000001" => BCD_out<="0110";              --顯示6
  124.                             selet<="01";   
  125.                             led<='0';
  126.           when "010100000" => BCD_out<="0111";              --顯示7
  127.                             selet<="01";
  128.                             led<='1';
  129.           when "010010000" => BCD_out<="1000";              --顯示8
  130.                             selet<="01";
  131.                             led<='1';
  132.           when "010001000" => BCD_out<="1001";             --顯示9
  133.                             selet<="01";
  134.                             led<='1';                     
  135. --連續(xù)鍵時(shí)led賦為高電平,燈亮;sel賦值''01''表示采用個(gè)位顯示
  136.           when "010000100" =>if (cnt4=0) then
  137.                              cnt4<=cnt4+1;
  138.                             BCD_out<="0000";            --個(gè)位顯示0
  139.                              selet<="01";
  140.                             else cnt4<=0;
  141.                             BCD_out<="0001";             --十位顯示1
  142.                              selet<="10";
  143.                             end if;                     
  144. --兩位數(shù)利用計(jì)數(shù)器cnt4實(shí)現(xiàn)個(gè)、十位輪流顯示。
  145.           when "010000010" =>if (cnt4=0) then
  146.                               cnt4<=cnt4+1;
  147.                              BCD_out<="0001";           --個(gè)位顯示1
  148.                               selet<="01";   
  149.                              else cnt4<=0;
  150.                              BCD_out<="0001";            --十位顯示1
  151.                               selet<="10";   
  152.                              end if;     
  153.           when "010000001" => if (cnt4=0) then
  154.                                cnt4<=cnt4+1;
  155.                               BCD_out<="0010";           --個(gè)位顯示2
  156.                                selet<="01";
  157.                              else cnt4<=0;
  158.                                BCD_out<="0001";           --十位顯示1
  159.                                selet<="10";
  160.                              end if;
  161.           when "001100000" => if (cnt4=0) then
  162.                                cnt4<=cnt4+1;
  163.                                BCD_out<="0011";           --個(gè)位顯示3
  164.                                selet<="01";
  165.                              else cnt4<=0;
  166.                                BCD_out<="0001";           --十位顯示1
  167.                                selet<="10";
  168.                             end if;

  169.           when "001010000" => if (cnt4=0) then
  170.                               cnt4<=cnt4+1;
  171.                               BCD_out<="0100";            --個(gè)位顯示4
  172.                              selet<="01";
  173.                             else cnt4<=0;
  174.                              BCD_out<="0001";             --十位顯示1
  175.                              selet<="10";
  176.                             end if;
  177.           when "001001000" =>if (cnt4=0) then
  178.                              cnt4<=cnt4+1;
  179.                              BCD_out<="0101";             --個(gè)位顯示5
  180.                              selet<="01";
  181.                           else cnt4<=0;
  182.                              BCD_out<="0001";             --十位顯示1
  183.                             selet<="10";
  184.                          end if;
  185.           when "001000100" => if (cnt4=0) then
  186.                              cnt4<=cnt4+1;
  187.                              BCD_out<="0110";             --個(gè)位顯示6
  188.                              selet<="01";
  189.                            else cnt4<=0;
  190.                              BCD_out<="0001";             --十位顯示1
  191.                             selet<="10";
  192.                            end if;
  193.                              led<='1';
  194.           when "001000010" => if (cnt4=0) then
  195.                              cnt4<=cnt4+1;
  196.                              BCD_out<="0111";             --個(gè)位顯示7
  197.                              selet<="01";
  198.                            else cnt4<=0;
  199.                              BCD_out<="0001";             --十位顯示1
  200.                              selet<="10";
  201.                          end if;
  202.           when "001000001" =>if (cnt4=0) then
  203.                              cnt4<=cnt4+1;
  204.                              BCD_out<="1000";             --個(gè)位顯示8
  205.                              selet<="01";
  206.                            else cnt4<=0;
  207.                              BCD_out<="0001";             --十位顯示1
  208.                              selet<="10";
  209.                           end if;
  210.          when others => led<='1';
  211.                       selet<="00";                           
  212. --其他數(shù)碼無(wú)顯示,指示燈亮
  213.        end case;
  214.     end if;
  215.   end process display;
  216. end behav;
復(fù)制代碼


第五部分  程序仿真

本次設(shè)計(jì)程序的一個(gè)仿真波形圖見下頁(yè):

該波形圖可分為兩部分,第一部分是EDA板對(duì)紅外發(fā)射所發(fā)射的信號(hào)進(jìn)行譯碼 ,并輸出BCD碼,即其他輸出的部分,第二部分是對(duì)EDA試驗(yàn)板的鍵盤矩陣輸入信號(hào)的譯碼BCD碼輸出。

一、紅外譯碼部分

   在B2的低電平脈沖輸入前的部分屬于剛才講的第一部分,即紅外譯碼部分,此時(shí)EDA試驗(yàn)板上的按鍵均沒有按下,所也B1,B2,B3,B4都把保持高電平。

   這部分波形圖示仿真紅外發(fā)射器的按鍵1按下是的情況。根據(jù)紅外編碼芯片PT2248的編碼規(guī)則,按鍵1按下是的編碼應(yīng)該是“100100000”,上面也提到,每個(gè)代碼‘0’或‘1’的波形包括4個(gè)時(shí)鐘周期:‘0’是1個(gè)時(shí)鐘周期的低電平加3個(gè)時(shí)鐘周期的高電平;‘1’是3個(gè)時(shí)鐘周期的低電平加1個(gè)時(shí)鐘周期的高電平。所以“100100000”的波形應(yīng)該如下圖所示:

    當(dāng)9位編碼“100100000”全部接收完后,CPLD的BCD碼輸出為“0001”,即數(shù)碼管顯示1,如下圖:

Selet輸出,即選擇個(gè)位數(shù)碼管顯示。

二 、EDA板上的按鍵編碼及BCD碼輸出

   EDA板上的按鍵按下時(shí),紅外發(fā)射板的信號(hào)不能被EDA板接收,故CPLD是對(duì)EDA板上的按鍵信號(hào)進(jìn)行譯碼的。

這部分波形從B2低電平脈沖,即B2按下開始,B1,B2,B3,B4分別是4*4鍵盤的右數(shù)第一,二,三,四列的任何一個(gè)按鍵,隨后是B3,B1,B4的低電平脈沖,如下圖:

   先后輸出的BCD碼為“0010”,“0011”,“0001”,“0100”,如下圖:

   即B2按下時(shí)數(shù)碼管顯示2,B3按下時(shí)數(shù)碼管顯示3,B1按下時(shí)數(shù)碼管顯示1,B4按下時(shí)數(shù)碼管顯示4,仿真無(wú)誤。

第六部分  設(shè)計(jì)體會(huì)及心得

一、設(shè)計(jì)過程中遇到的問題及解決方法

上面已經(jīng)提過,本次設(shè)計(jì)的設(shè)計(jì)分為兩個(gè)方面:電路板和程序。

程序設(shè)計(jì)遇到的問題的解決方案及解決方法幾經(jīng)在第四部分闡述,這部分主要討論電路板設(shè)計(jì),焊接及調(diào)試遇到的問題和解決方法。

  • EDA試驗(yàn)板和數(shù)據(jù)線電路板

這兩塊板發(fā)下來(lái)時(shí)電路已經(jīng)設(shè)計(jì)好,主要出現(xiàn)的問題在焊接上。

在焊接前先觀察這兩塊板,看清哪面是元件面,哪面是焊接面,畫有元件圖案的那面是元件面,焊接是要把元放在這一面上。

在焊接過程中最容易犯的錯(cuò)誤就是把IC,晶振,三級(jí)管,穩(wěn)壓器,紅外接收器,排阻,二極管等元件的管腳焊錯(cuò)。

IC中管角最多的就是CPLD的IC座了,要是焊錯(cuò)了,這個(gè)83個(gè)腳的元件拆下來(lái)的困難程度將是很難想象的。其實(shí)把它含對(duì)不難,在IC座內(nèi)部的IC槽有一個(gè)是缺腳的,而實(shí)驗(yàn)板元件面上畫圖案也是有一個(gè)缺角的,只要把位置對(duì)好,先把IC座的兩個(gè)對(duì)角的管腳焊好,再焊其他腳就可以順利焊好它了。其他IC都有一個(gè)缺口,只要把缺口和板上畫的缺口對(duì)齊,同樣把對(duì)角的兩個(gè)管腳焊好再焊其他腳,就行了,IC上有一個(gè)管腳的旁邊有一個(gè)圓形的凹陷,板上和這個(gè)角對(duì)應(yīng)的焊盤是方行的,根據(jù)這個(gè)規(guī)則也可以可方便的把IC焊好。

焊晶振,三級(jí)管,穩(wěn)壓器,紅外接收器時(shí),只要把元件和板上畫的圖案對(duì)齊,就可以焊好。比如:晶振的四個(gè)角只有一個(gè)角是直角,其他三個(gè)角都是圓角,板上畫的圖案也是這樣,只要把直角對(duì)齊,就可以焊好了。

普通二極管有一頭印有一個(gè)黑色的環(huán),試驗(yàn)板上普通二級(jí)管的圖案也是有一頭是有黑色(或白色)的,對(duì)其再焊就可以把二極管的正負(fù)極焊對(duì)。發(fā)光二級(jí)管的兩個(gè)管腳是一長(zhǎng)一短的,長(zhǎng)的那根是正極,試驗(yàn)板已經(jīng)把發(fā)光二極管的正負(fù)極標(biāo)上去,真樣也很容易就把放光二極管焊好。

在焊接過程中遇到的另一個(gè)問題就是焊電阻等比較矮的元件時(shí),焊好后發(fā)現(xiàn)元件沒有緊貼在板上,這是就要把焊錫熔調(diào),調(diào)整元件的位置,有時(shí)候在熔焊錫時(shí),會(huì)把焊盤弄調(diào),這時(shí)可以在元件面上焊,應(yīng)為試驗(yàn)板元件面和焊接面都有焊盤的。另外,焊接元件時(shí)一定要記住先焊矮的元件,再焊高的,這樣就方便把元件緊貼在板上。

焊接結(jié)束后,把測(cè)數(shù)碼管的程序下載到CPLD里,發(fā)現(xiàn)有一個(gè)數(shù)碼管的亮得不正常,程序?qū)懙氖?為數(shù)碼管從右向左依次顯示0——9,發(fā)現(xiàn)左數(shù)第四位的二級(jí)管是在其他管亮過一編后再閃一下,懷疑是于這為數(shù)碼管連接的三極管壞了,根據(jù)電路圖,找到和這為數(shù)碼管相連的三級(jí)管是Q6,把這個(gè)三極管換掉后,數(shù)碼管就正常顯示了。

2.發(fā)射板部分

發(fā)射板是采用面包板,根據(jù)PT2248和少量外圍元件組成的紅外遙控發(fā)射電路設(shè)計(jì)成的,焊接部分遇到的問題和EDA板焊接遇到的問題類似,只不過,發(fā)射板的電路顯得比較擁擠,焊盤挨得比較緊,很容易造成短路,焊接時(shí)要十分小心,發(fā)現(xiàn)兩個(gè)焊盤有可能短路時(shí)馬上用萬(wàn)用表的歐姆檔檢測(cè)。

發(fā)射板焊接電路最復(fù)雜的就是3*6鍵盤矩陣的焊接電路。考慮到按鍵的四個(gè)管角中,在同一測(cè)的兩個(gè)角是不導(dǎo)通的,而不再同一側(cè)的相對(duì)的兩隊(duì)管腳是內(nèi)部導(dǎo)通的,當(dāng)按鍵按下時(shí),四個(gè)管角全部連通,開關(guān)就相當(dāng)于一個(gè)節(jié)點(diǎn),把18個(gè)按鍵豎著排列在板上,同一側(cè)的管角處于上下位置,把每個(gè)同側(cè)管角的右邊那個(gè)和它正上方(或下方)的按鍵的管腳焊在一起,這樣6根豎線就形成了。在三行按鍵之間和最下面那行按鍵的下方固定一條導(dǎo)線,把三行按鍵下方同測(cè)管腳的左邊那個(gè)通過導(dǎo)線連起來(lái),這樣三條橫線也形成了。到此,3*6的鍵盤矩陣電路就焊接完畢,再把這3根橫線和6根豎線根據(jù)電路圖接到芯片上,再焊其他元件,發(fā)射板電路就完成了。

在設(shè)計(jì)發(fā)射板電路時(shí),我在紅外發(fā)射二極管的旁邊串連了一個(gè)發(fā)光二級(jí)管,這樣有按鍵按下時(shí),發(fā)光二級(jí)光就會(huì)亮。這樣就能檢測(cè)發(fā)射板是否有信號(hào)發(fā)出,也可以檢測(cè)發(fā)射板是工作正常。


二、心得體會(huì)

歷經(jīng)快學(xué)期的兩周的數(shù)字系統(tǒng)設(shè)計(jì)在我把我親手做的EDA試驗(yàn)板和紅外發(fā)射板,還有CPLD里面的程序交到老師手中并通過驗(yàn)收的那一克結(jié)束了?吹阶约旱淖髌,雖然不管從外表還是實(shí)現(xiàn)的功能都和其他同學(xué)的相差無(wú)幾,但心里有一股很強(qiáng)的成就感,也有如釋重負(fù)的輕快。

短短兩周的時(shí)間很可能是我走向社會(huì),走向工作的一個(gè)縮影,遇到難題,積極求證,分析問題,解決問題…一系列的過程不僅讓我體會(huì)到了面對(duì)問題無(wú)從下手的尷尬,也讓我體味到問題迎刃而解的喜悅。這次設(shè)計(jì)使我學(xué)到了許多東西,不僅理論知識(shí),實(shí)踐能力得到了很大的提高,也鍛煉了自己的意志。

無(wú)可非議,數(shù)字系統(tǒng)設(shè)計(jì)時(shí)四門設(shè)計(jì)中設(shè)計(jì)面最廣,科技含量最大,難度最大,立時(shí)最久的一門設(shè)計(jì)。程序方面,設(shè)計(jì)的程序比微機(jī)設(shè)計(jì)的復(fù)雜;焊板方面,工作量比高頻設(shè)計(jì)的大;實(shí)現(xiàn)的功能方面,比模電設(shè)計(jì)的更前衛(wèi),這些因素時(shí)使這次設(shè)計(jì)給我留下了及其極其深刻的印象,也使我學(xué)到許多課堂上,課本里根本就學(xué)不到的東西。

數(shù)字系統(tǒng)是現(xiàn)在社會(huì)上的熱門話題,這方面的人才的社會(huì)需求量也是相當(dāng)大的。這方面的知識(shí)也是很有趣的,特別是程序下載,通過編程可以使實(shí)驗(yàn)板有自己想要的功能,這是一件很有趣的事情。

   這次設(shè)計(jì)加深了我對(duì)FPGA/CPLD的認(rèn)識(shí),也是我鞏固可VHDL語(yǔ)言的知識(shí),還鍛煉了動(dòng)手能力,可以說(shuō)是受益匪淺。我在這方面的知識(shí)還是比較薄弱的,但我對(duì)這方面的知識(shí)很感興趣,這次設(shè)計(jì)給了我一個(gè)很好的機(jī)會(huì)學(xué)習(xí)數(shù)字系統(tǒng)的實(shí)踐知識(shí)的機(jī)會(huì)。

這次設(shè)計(jì)也是我學(xué)會(huì)了不輕言放棄,不怕困難,不怕麻煩,在做實(shí)驗(yàn)的過程中,會(huì)重復(fù)不斷的遇到一些相同的問題,特別是程序和電路的調(diào)試時(shí),往往要經(jīng)過很多次反復(fù)的檢查、測(cè)量才能找到問題的所在,要使不能靜下心來(lái),仔細(xì)研究,完成設(shè)計(jì)時(shí)不可能的。

這次的設(shè)計(jì)給了我又一次認(rèn)識(shí)自我的機(jī)會(huì),讓我學(xué)會(huì)了從更多角度分析解決問題,設(shè)計(jì)的過程中也積攢了一些相關(guān)的項(xiàng)目經(jīng)驗(yàn),我想對(duì)我以后的實(shí)際操作肯定會(huì)有很大幫助的。設(shè)計(jì)給與了我們一個(gè)平臺(tái)去發(fā)揮自己的學(xué)到的理論知識(shí),鍛煉了我們的動(dòng)手能力,鞏固了我們所學(xué)的知識(shí),為我們以后步入社會(huì)做了準(zhǔn)備,使大學(xué)生學(xué)習(xí)相當(dāng)重要的、不可或缺的一部份。


完整的Word格式文檔51黑下載地址:

紅外線遙控設(shè)計(jì)-課程設(shè)計(jì)(含源代碼).rar (714.07 KB, 下載次數(shù): 24)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表