實驗三序列發(fā)生器與序列檢測器實驗報告_第1頁
實驗三序列發(fā)生器與序列檢測器實驗報告_第2頁
實驗三序列發(fā)生器與序列檢測器實驗報告_第3頁
實驗三序列發(fā)生器與序列檢測器實驗報告_第4頁
實驗三序列發(fā)生器與序列檢測器實驗報告_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、南昌大學(xué)實驗報告姓名: 學(xué)號: 6100210173 專業(yè)班級: 中興通信101 實驗類型:驗證 綜合 設(shè)計 創(chuàng)新 實驗日期:2012、11、16 實驗四 序列信號發(fā)生器與檢測器設(shè)計一、實驗?zāi)康?、.學(xué)習(xí)VHDL文本輸入法2、學(xué)習(xí)有限狀態(tài)機(jī)的設(shè)計3、設(shè)計序列信號發(fā)生器和檢測器二實驗內(nèi)容與要求1. 設(shè)計序列發(fā)生器,完成序列為11010的序列生成器2用有限狀態(tài)機(jī)設(shè)計序列檢測器,實現(xiàn)串行序列11010的檢測器3. 若檢測到符合要求的序列,則輸出顯示位為“1”,否則為“0”4. 對檢測到的次數(shù)計數(shù)三 設(shè)計思路1. 設(shè)計分頻器 因為最終要把待檢測序列的檢測次數(shù)在數(shù)碼管上顯示出,所以必須設(shè)計一個分頻器,將

2、起始頻率作為數(shù)碼管的掃描頻率,而將分頻后的頻率作為序列發(fā)生器的移位頻率,所以在程序中設(shè)置10KHZ進(jìn)行分頻分成1HZ脈沖(10KHZ的掃描頻率是為了讓數(shù)碼管的動態(tài)顯示更加清晰)2. 設(shè)計序列發(fā)生器在這次的設(shè)計序列發(fā)生器時沒有用狀態(tài)轉(zhuǎn)移的方法來來形成一個16位的序列,而是通過直接設(shè)計一串16位的序列,通過對最高位的輸出與并置來形成一串循環(huán)的16位序列,這樣設(shè)計簡單方便,易于操作與控制,也減少了在狀態(tài)轉(zhuǎn)移產(chǎn)生的誤差,其主要的核心程序為:architecture bhv of p2 is signal bs: std_logic_vector(15 downto 0):="11010&qu

3、ot; begin xlout<=bs(15); process (clk1hz) begin if (clk1hz'event and clk1hz='1') then bs<= bs(14 downto 0)&bs(15); 先將序列最高位輸出至序列檢測器中,然后在一個脈沖作用下,將此時最高位變成最低位,其余14位不變,使序列循環(huán)移動,最終形成一個16位循環(huán)序列。3. 設(shè)計序列檢測器基本思想是采用有限狀態(tài)機(jī)設(shè)計,通過狀態(tài)的轉(zhuǎn)移來實現(xiàn)被檢測序列的的檢測,首先設(shè)定6個狀態(tài)S0 S1 S2 S3 S4 S5 通過這6個狀態(tài)的轉(zhuǎn)移情況來檢測出11010這

4、個序列。但因為序列發(fā)生器發(fā)生的序列不斷循環(huán)過程中也會出現(xiàn)一些類似11010的特殊序列,則在狀態(tài)轉(zhuǎn)移中則需要通過一些狀態(tài)的變換來檢測出里面包含的11010序列,如下文所講的兩種特殊情形便是我們序列發(fā)生器產(chǎn)生序列中出現(xiàn)的特殊序列:(1)在序列發(fā)生器產(chǎn)生序列不斷循環(huán)過程中出現(xiàn)該序列1110100,此序列中也有一個要檢測到的序列但在狀態(tài)轉(zhuǎn)移過程需要注意: 1 1 1 0 1 0 0 S0 S1 S2 S2 S3 S4 S5 S0 即當(dāng)S2狀態(tài)轉(zhuǎn)移到S3狀態(tài)時,如果此時序列值為1,則只需轉(zhuǎn)移到狀態(tài)本身S2而不需要轉(zhuǎn)移至S0,這樣即可節(jié)約轉(zhuǎn)移時間也可提高檢測效率,之后的狀態(tài)按正常轉(zhuǎn)移并且最后從狀態(tài)S5回到

5、S0。(2)在序列發(fā)生器產(chǎn)生序列不斷循環(huán)過程中出現(xiàn)該序列110110100,此序列中也有一個要檢測到的序列但是在狀態(tài)團(tuán)轉(zhuǎn)移時同樣需要注意: 1 1 0 1 1 0 1 0 0 S0 S1 S2 S3 S4 S2 S3 S4 S5 S0即當(dāng)狀態(tài)S4轉(zhuǎn)移到S5狀態(tài)時,如果此時序列值為1,則需要將狀態(tài)轉(zhuǎn)移至S2狀態(tài),從S2狀態(tài)重新開始檢測,而不需要轉(zhuǎn)移至S0,之后其它狀態(tài)正常轉(zhuǎn)移并且最后由S5狀態(tài)轉(zhuǎn)移至S0狀態(tài)。 S5S1S0S4S3S201101001010從上面的流程圖可以看出所有的回路在檢測完一次序列后在下一次沒有該序列時會流向初始狀態(tài)S0,而當(dāng)兩個或多個被檢測序列連續(xù)在一起時,狀態(tài)S5會跳過

6、狀態(tài)S0直接轉(zhuǎn)移至狀態(tài)S1完成序列的的檢測,直到檢測完后再次回到初始狀態(tài)S0,并且為了避免上面所講的兩種特殊序列在狀態(tài)轉(zhuǎn)移都進(jìn)行了改進(jìn),在狀態(tài)S2至狀態(tài)S3時若序列值為1則返回自身,消除第一種特殊情況下序列的檢測問題,在狀態(tài)S4至狀態(tài)S5時若序列值為1返回到狀態(tài)S2,消除第二種特殊情況對1101016序列的檢測。3、 此外在設(shè)計序列檢測器時,為了使實驗現(xiàn)象更明顯,更好的觀測序列的的移動與檢測情況我使用了5個LED分別來顯示最新產(chǎn)生的五個序列位,分別輸出到端口ledag(4),ledag(3),ledag(2),ledag(1),ledag(0)實現(xiàn)程序語句如下 if(clk1hz'ev

7、ent and clk1hz='1') then ledag(4)<=ledag(3);-移位輸出顯示在led上以便觀看 ledag(3)<=ledag(2); ledag(2)<=ledag(1); ledag(1)<=ledag(0); ledag(0)<=xlout;-將最近生產(chǎn)的序列賦給最前端的ledge(0)位 end if; 4、 設(shè)計計數(shù)器模塊100計數(shù)模塊因為序列發(fā)生器產(chǎn)生的序列不斷地循環(huán),待檢測序列11010的個數(shù)很多,則在程序中設(shè)計計數(shù)模塊,當(dāng)序列檢測器模塊檢測完一次待檢測序列11010時產(chǎn)生一次下降沿,而計數(shù)器模塊通過該下降沿

8、進(jìn)行計數(shù)自動加一,因為用兩個數(shù)碼管來表示待檢測序列的個數(shù),所以計數(shù)模塊取上限為99即用數(shù)碼管譯碼模塊將計數(shù)值在數(shù)碼管表示出來時最多能計99檢測序列之后清零重新計數(shù),這樣設(shè)計之后比通過LED的亮滅來統(tǒng)計被檢測序列的個數(shù)更加具體直觀。掃描譯碼模塊四、實驗程序(程序來源于自己編寫)序列檢測模塊-總的設(shè)計模塊如圖所示:流水燈(顯示序列移動)模塊序列產(chǎn)生模塊分頻模塊 -分頻器模塊 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity p1 is rt(clk:in std_logic; clk

9、1hz:out std_logic -分頻的頻率1HZ的輸出端口 ); end p1; architecture behave of p1 is Signal Clk_Count1 : std_logic_vector(13 downto 0); begin process(clk) -將10KHZ的頻率分頻成1HZ begin if(Clk'event and Clk='1') then if(Clk_Count1<10000) then Clk_Count1<=Clk_Count1+1; -在小于10000時,自動加1 else Clk_Count1&l

10、t;="001" -超過10000后返回1 end if; end if; end process; Clk1Hz<=Clk_Count1(13); -將Clk_Count1的第14位賦給Clk1Hzend behave;-序列發(fā)生器模塊library ieee; use ieee.std_logic_1164.all; entity p2 is port (clk1hz : in std_logic; -定義輸入端口此時頻率為1HZ xlout : out std_logic -輸出序列發(fā)生器產(chǎn)生的序列端口 ); end entity; architecture b

11、hv of p2 is signal bs: std_logic_vector(15 downto 0):="11010" begin xlout<=bs(15); -將bs的第16位值賦給xlout process (clk1hz) begin if (clk1hz'event and clk1hz='1') then bs<= bs(14 downto 0)&bs(15); -前15位保持不變,將bs的第16位并到最前來形 成序列的循環(huán) end if; end process; end bhv; -序列檢測器模塊library

12、 ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity p3 is port ( clr :in std_logic; -清零端口 clk1hz:in std_logic; -輸入信號頻率 xlout : in std_logic; -輸入序列 result: out std_logic ); end entity; architecture bhv of p3 is type state_value is(s0,s1,s2,s3,s4,s5); -定義6個狀態(tài)signal state: state

13、_value; signal dclk: std_logic; begin result<=dclk; process (clr,clk1hz) begin if (clr='0') then state<=s0; dclk<='0' -檢測輸入序列“11010”由左開始 elsif(clk1hz'event and clk1hz='0') then case state is when s0=> if xlout='1' then -序列值為1S0轉(zhuǎn)態(tài)S1,若序列值為0,返回自身state<

14、=s1; else state<=s0;end if; when s1=> if xlout='1' thenstate<=s2; else state<=s0;end if; when s2=> if xlout='0' then -序列值為1,S2轉(zhuǎn)向自身,序列值為0,轉(zhuǎn)向S3state<=s3; else state<=s2;end if; when s3=> if xlout='1' then state<=s4; else state<=s0; end if; when s4=

15、> if xlout='0' then -序列值為0,S4轉(zhuǎn)向S5,輸出端為1state<=s5; dclk<='1' else state<=s2; -若此時序列值為1,S4轉(zhuǎn)向S2end if; when s5=> if xlout='0' then -序列值1,S5轉(zhuǎn)移至S1,若為0,轉(zhuǎn)向S0 state<=s0; else state<=s1; end if; dclk<='0' when others => state<=s0; -其它狀態(tài)都將返回初始狀態(tài) en

16、d case; end if; end process; end bhv; -100計數(shù)模塊library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity p5 is port ( result:in std_logic; -前面序列檢測模塊中檢測到序列后產(chǎn)生的跳變信號 d6,d7: out std_logic_vector(3 downto 0) -定義十位個位數(shù)值 ); end entity; architecture behave of p5 is signal cnt0,cnt1:st

17、d_logic_vector(3 downto 0):="0000" -初始化begin process (result) begin if (result'event and result='0') thenif (cnt0="1001" and cnt1="1001") then -設(shè)置計數(shù)上限為99cnt0<="0000" cnt1<="0000" elsif (cnt0="1001") then -BCD碼的調(diào)整 cnt0<=

18、"0000" cnt1<=cnt1+1; -接受跳變信號后自動加1計數(shù)else cnt0<=cnt0+1; end if; end if; end process; d6<=cnt1;d7<=cnt0; end behave;-數(shù)碼管譯碼模塊library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity p6 isport(clk:in std_logic; -掃描頻率10KHZ的輸入端口 sel0,sel1,sel2:buffer std_logic;

19、-數(shù)碼管的位選信號 sg:out std_logic_vector(6 downto 0); -數(shù)碼管的段選 sel:out std_logic_vector(7 downto 0); d6,d7:in std_logic_vector(3 downto 0) -計數(shù)模塊中個位十位的數(shù)值 ); end p6; architecture behave of p6 is signal cnt:std_logic_vector(1 downto 0); signal A:std_logic_vector(3 downto 0); begin process(clk) begin if clk'

20、;event and clk='1' then if cnt<"01" then cnt<=cnt+1; else cnt<=(others=>'0'); end if; end if; sel(0)<=sel0; sel(1)<=sel1; sel(2)<=sel2; case cnt is when "00"=>sel2<='1'sel1<='1'sel0<='1'A<=d7; -選擇數(shù)碼管的位置 w

21、hen "01"=>sel2<='1'sel1<='1'sel0<='0'A<=d6; when others=>null; end case; end process; process(A) begin case A is when "0000" =>sg<="0111111" -數(shù)碼管顯示值為0時的譯碼值 when "0001" =>sg<="0000110" when "0

22、010"=>sg<="1011011" when "0011"=>sg<="1001111" when "0100"=>sg<="1100110" when "0101"=>sg<="1101101" when "0110"=>sg<="1111101" when "0111"=>sg<="0000111&

23、quot; when "1000"=>sg<="1111111" when "1001"=>sg<="1101111" when others=>null; end case; end process; end behave; -顯示序列移動模塊library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity p4 isport(clk1hz:in std_logic; -分頻后的頻率輸入端口

24、 xlout:in std_logic; -序列發(fā)生器產(chǎn)生的序列 ledag :buffer std_logic_vector(4 downto 0) -5位序列值的輸出口 );end p4;architecture behave of p4 isbeginprocess(clk1hz)beginif(clk1hz'event and clk1hz='1') thenledag(4)<=ledag(3); -序列值向左移動ledag(3)<=ledag(2);ledag(2)<=ledag(1);ledag(1)<=ledag(0);ledag(

25、0)<=xlout; -將最近生產(chǎn)的序列賦給最前端的ledge(0)位 end if;end process;end behave;四 實驗步驟1 建立工程項目2. 在VHDL編輯窗口下寫好程序,并保存3、進(jìn)行全編譯,沒有錯誤。顯示出狀態(tài)機(jī)如圖所示:完全符合前面的設(shè)計思想,說明了程序的正確性。4再新建波形仿真文件,引入端口,設(shè)置輸入經(jīng)過了7個移位脈沖檢測到下一個110105、 接下來就是波形仿真了,點擊,時序仿真,結(jié)果如下圖所示經(jīng)過了9個移位脈沖檢測到下一個11010每一個檢測到11010的地方都有此特征序列中第一個滿足11010的地方(對應(yīng)ledag顯示26)在計數(shù)到99的地方數(shù)碼管顯

26、示o(ASCLL碼為01101111)正好是數(shù)碼管上顯示的9下一個數(shù)碼管應(yīng)顯示0,仿真出“?”(ASCLL為00111111)正好顯示0五、仿真波形分析 結(jié)合仿真圖和圖上的注釋對設(shè)計的模塊進(jìn)行功能的檢測。由于序列產(chǎn)生的是11010,而要檢測的序列是11010,因此,當(dāng)檢測到一個序列時,須經(jīng)7或9的移位脈沖才能檢測到下一個序列,根據(jù)第一個仿真圖,可看出仿真是正確的。 由于總體的仿真正確了,所以對細(xì)節(jié)的仿真,例如:序列是如何在移位脈沖的輸入下輸出的:每檢測到一個11010序列,數(shù)碼管的具體輸出是多少等,就不一一作分析了。六、硬件測試1.Assignments-.>device->引腳鎖

27、定,參照下載實驗板引腳號說明書,選擇適當(dāng)?shù)囊_2.引腳鎖定后,保存,必須重新進(jìn)行一次全程編譯,編譯通過后才能編程下載。3.編程下載,用下載線將計算機(jī)并口和試驗箱上的JTAG口接起來,接通電源。選擇Tools>Programmer菜單,打開programmer窗口。在mode中選中JTAG,將Program/Configure下的方框選中4在開始編程之前,必須正確設(shè)置編程硬件。點擊“Hardware Setup”按鈕,打開硬件設(shè)置口。點擊“Add Hardware”打開硬件添加窗口,在“Hardware type”下拉框中選擇“USB”,點擊OK按鈕確認(rèn),關(guān)閉Hardware Setup窗

28、口,完成硬件設(shè)置。5、點擊“Start”按鈕,開始編程下載然后就可以根據(jù)實驗要就進(jìn)行檢測,看是否能產(chǎn)生正確的序列,是不是在正確的狀態(tài)計數(shù)等等功能。七、硬件測試結(jié)果(1)序列發(fā)生器測試結(jié)果,實驗中產(chǎn)生了序列11010而且產(chǎn)生的原理即為通過預(yù)先設(shè)計的一個序列11010,然后通過把最高位移至最低位后與其余不變的15位相并接形成一個新的序列,然后循環(huán)往復(fù),便可循環(huán)的產(chǎn)生該序列例如:第一步為01110第二次為11100第三次為11001第四次為10011第五次為00111等等然后繼續(xù)循環(huán)相并即產(chǎn)生了序列11010每一次的最高位都會輸出到LED中顯示,然后通過循環(huán)次數(shù),不斷地向右推進(jìn),例如上面所寫的:LED顯示的是01110即滅、亮、亮、亮、滅 ,第五次的最高位0就是最近新產(chǎn)生的,而該LED就顯示在鎖定的ledag(4),ledag(3), ledag(2),ledag(1),ledag(0)五個LED管中并且一一對應(yīng)產(chǎn)生的序列值。(2)序列檢測器測試結(jié)果當(dāng)ledag(4)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論