




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
18/18實驗6隨機數(shù)生成電路的設(shè)計與實現(xiàn)實驗任務(wù)要求設(shè)計并實現(xiàn)一個隨機數(shù)生成電路,每2秒隨機生成一個0~999之間的數(shù)字,并在數(shù)碼管上顯示生成的隨機數(shù)。為系統(tǒng)設(shè)置一個復(fù)位鍵,復(fù)位后數(shù)碼管顯示學(xué)號后三位(“092”),2秒后再開始每2秒生成并顯示隨機數(shù),要求使用按鍵復(fù)位。電路設(shè)計及VHDL代碼設(shè)計思路總體的構(gòu)思是分模塊化設(shè)計分模塊化實現(xiàn),頂層采用狀態(tài)機的方式實現(xiàn)。根據(jù)系統(tǒng)所需要的功能,大概可以分為7個模塊,按鍵防抖模塊,分頻器模塊(一個20xx分頻,一個10分頻,外部時鐘為1kHz),M序列發(fā)生器模塊,譯碼模塊,位選信號模塊,以及頂層。其連接關(guān)系如圖1-1。圖1-1分模塊化流程圖對于防抖模塊,采用100Hz的時鐘,進行采樣型防抖,兩個采樣點之間為從0變到1時才認(rèn)為是一次有效的按鍵發(fā)生,同時輸出的時候與時鐘的下降沿作一個同步。對于分頻模塊,通過計數(shù)器進行分頻,現(xiàn)舉分頻比為20xx,進行說明。通過計數(shù)器從0計數(shù)到999,實現(xiàn)一次電平的翻轉(zhuǎn),這樣輸出的時鐘中低電平包含1000個時鐘周期,高電平包含1000個時鐘周期,這樣就構(gòu)成了占空比為50%的,頻率為原頻率1/20xx的輸出信號。10分頻也是同理,不再贅述。對于M序列發(fā)生器,偽隨機序列的產(chǎn)生已經(jīng)有了比較成熟的思路。通過移位寄存器加反饋便可以實現(xiàn),如圖1-2所示。而相應(yīng)位數(shù)的反饋函數(shù)可以通過查表知道。本實驗要求產(chǎn)生的隨機數(shù)為0-999,所以采用10位的M序列發(fā)生器,查表得知反饋函數(shù)為D0=Q6?Q9。但是10位的二進制數(shù)最大可以到1023,比9圖1-2移位寄存器加反饋構(gòu)成M序列發(fā)生器對于產(chǎn)生位選信號的模塊,其實就是一個順序脈沖發(fā)生器,因為位選信號為低電平有效,故用一個模3的計數(shù)器控制哪一位輸出低電平。對于數(shù)碼管譯碼模塊,可用圖1-3進行說明。圖1-3數(shù)碼管內(nèi)部原理圖輸出的7位譯碼從高位到低位分別對應(yīng)abcdefg段二極管,實驗板上的數(shù)碼管是輸出高電平,對應(yīng)段點亮,也就是共陰極,因此對數(shù)字的顯示只需要控制,相應(yīng)的幾段進行點亮即可,例如對于數(shù)字‘8’,應(yīng)點亮abcdef于是輸出的7位譯碼應(yīng)該是“1111111”。對于頂層,自定義一個枚舉類型,state包含s0,s1,s2,三個狀態(tài),分別對應(yīng)數(shù)碼管,顯示的三個位置,狀態(tài)轉(zhuǎn)移關(guān)系為:s0->s1->s2->s0,將這此狀態(tài)轉(zhuǎn)移關(guān)系寫成一個以clk為時鐘的狀態(tài)機。用seg2,seg1,seg0,分別存儲三個位置要顯示的數(shù)字對應(yīng)的4位向量。在clockslow的上升沿到來或者resetn信號為高電平時,更新一次seg2,seg1,seg0。用信號temp存儲當(dāng)前需要輸出到譯碼器的4位向量,在狀態(tài)機的輸出process中通過對temp進行更新,達到改變輸出的目的。VHDL代碼防抖模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;entityxiaodouis --anjianxiaodou port(clk:instd_logic; reset:instd_logic; resetn:outstd_logic);endxiaodou;architecturexiaodou_archofxiaodouis signalrestlast,restnow:std_logic; --caiyangxingxiaodou,whenrestlast=0 --resenow=1,considerasaanjian,outputaresetsignalbegin process(clk) begin if(clk'eventandclk='1')then restlast<=restnow; restnow<=reset; endif; endprocess; --outputthesamewidthastheclk’shalfperiod’ resetn<=(notclk)andrestnowand(notrestlast); endxiaodou_arch;分頻模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;entitydivideis --dividethefrequencyto1/n generic(n:natural:=200); port(clk:instd_logic; clk_out:outstd_logic);enddivide;architecturediv_archofdivideis --temporarysignal signaltemp:std_logic; begin process(clk) --countvariablecountfrom0ton/2-1 --meanseveryn/2periodreversetheclk variablecount:integerrange0ton/2-1; begin if(clk'eventandclk='1')then if(count=n/2-1)then temp<=nottemp; count:=0; else count:=count+1; endif; endif; endprocess; clk_out<=temp;enddiv_arch;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entitydiv_10is --frequencydivision,coefficientis10 port(clk:instd_logic; clkout:outstd_logic);enddiv_10;architecturediv_10_archofdiv_10is signaltemp:std_logic; --temporarysignalbegin p1:process(clk) variablecount:integerrange0to4; --countvariablecountfrom0to4 --meansevery5periodreversetheclk begin if(clk'eventandclk='1')then if(count=4)then temp<=nottemp; count:=0; else count:=count+1; endif; endif; endprocessp1; clkout<=temp;end;M序列發(fā)生器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entityM_sequenceis--Msequenceproducer--data_widthrepresentthepositions generic(data_width:natural:=10); port( clk,reset:instd_logic; seq:outunsigned(data_width-1downto0);--outputtheregistertoseethechanges reg:outunsigned(data_width-1downto0) );endM_sequence;architecturearch_MofM_sequenceis signalfeedback:std_logic; signallfsr_reg:unsigned(data_width-1downto0);begin feedback<=lfsr_reg(6)xorlfsr_reg(data_width-1); p1:process(clk,reset) variableflag:std_logic; begin if(reset='1')then --studentid'slast3numbers"092" lfsr_reg<="0001011100"; elsif(clk'eventandclk='1')then --shiftplace lfsr_reg<=lfsr_reg(lfsr_reg'high-1downto0)&feedback; endif; --rangingfrom0-999 if(lfsr_reg>999)then seq<=lfsr_reg-999; else seq<=lfsr_reg; endif; endprocessp1; --towhatchtheregister reg<=lfsr_reg;endarch_M;產(chǎn)生位選信號的模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entitycat_signalis--producethesequencepulsefortheCat port( clk,reset:instd_logic; cat:outstd_logic_vector(7downto0) );endcat_signal;architecturearchofcat_signalisbegin process(clk,reset) --binarysystemcounter variablecount:integerrange0to2; begin if(reset='1')then count:=0; elsif(clk'eventandclk='1')then if(count=2)then count:=0; else count:=count+1; endif; endif; --negativeimpulse casecountis when0=>cat<="11111110"; when1=>cat<="11111101"; when2=>cat<="11111011"; endcase; endprocess;endarch;數(shù)碼管譯碼模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYseg7IS --seg7decoding PORT( a:INSTD_LOGIC_VECTOR(3DOWNTO0); --input b:OUTSTD_LOGIC_VECTOR(6DOWNTO0) --output );ENDseg7;ARCHITECTUREaaOFseg7ISBEGIN PROCESS(a) BEGIN CASEaIS --b6-0->abcdefg WHEN"0000"=>b<="1111110"; --0 WHEN"0001"=>b<="0110000"; --1 WHEN"0010"=>b<="1101101"; --2 WHEN"0011"=>b<="1111001"; --3 WHEN"0100"=>b<="0110011"; --4 WHEN"0101"=>b<="1011011"; --5 WHEN"0110"=>b<="1011111"; --6 WHEN"0111"=>b<="1110000"; --7 WHEN"1000"=>b<="1111111"; --8 WHEN"1001"=>b<="1111011"; --9 WHENOTHERS=>b<="0000000"; ENDCASE; ENDPROCESS;ENDaa;頂層LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entitycontrolDisplayis--produce'random'numanddisplayontheseg7 port( clk,reset:instd_logic; cat:outstd_logic_vector(7downto0); b:outstd_logic_vector(6downto0); resetwatch:outstd_logic );endcontrolDisplay;architecturearchofcontrolDisplayis ponentcat_signalis --toproducethesequencepulsefortheCat port( clk,reset:instd_logic; cat:outstd_logic_vector(7downto0) ); endponent; ponentdivideis --dividethefrequencyto1/n generic(n:natural:=20xx); port(clk:instd_logic; clk_out:outstd_logic); endponent; ponentM_sequenceis --Msequenceproducer generic(data_width:natural:=10); port( clk,reset:instd_logic; seq:outunsigned(data_width-1downto0); reg:outunsigned(data_width-1downto0) ); endponent; ponentseg7IS --seg7decoding PORT( a:INSTD_LOGIC_VECTOR(3DOWNTO0); b:OUTSTD_LOGIC_VECTOR(6DOWNTO0) ); ENDponent; ponentxiaodouis --anjianxiaodou port(clk:instd_logic; reset:instd_logic; resetn:outstd_logic); endponent; ponentdiv_10is --frequencydivision,coefficientis10 port(clk:instd_logic; clkout:outstd_logic); endponent; signalclkslow:std_logic; signalclkslow_xiaodou:std_logic; signalresetn:std_logic; signalMseq:unsigned(9downto0); signaltemp:std_logic_vector(3downto0); signalseg2:std_logic_vector(3downto0); signalseg1:std_logic_vector(3downto0); signalseg0:std_logic_vector(3downto0); --s0->unitss1->tenss2->thousands typestateis(s0,s1,s2); signalpresentstate,nextstate:state;begin p1_everyseg:process(clk,resetn) --discribletheregister begin if(resetn='1')then presentstate<=s0; elsif(clk'eventandclk='1')then presentstate<=nextstate; endif; endprocess; p2_everyseg:process(presentstate) --discriblethenextstate begin casepresentstateis whens0=>nextstate<=s1; whens1=>nextstate<=s2; whens2=>nextstate<=s0; endcase; endprocess; p3_everysegOut:process(presentstate) --discribletheoutput begin casepresentstateis whens0=>temp<=seg0; whens1=>temp<=seg1; whens2=>temp<=seg2; endcase; endprocess; p1_segChange:process(clkslow,resetn) --gettheMsequence variablenum:integerrange0to1000; begin num:=conv_integer(Mseq); if(resetn='1')then seg2<=conv_std_logic_vector(num/100,4); seg1<=conv_std_logic_vector((num/10)mod10,4); seg0<=conv_std_logic_vector(nummod10,4); elsif(clkslow'eventandclkslow='1')then seg2<=conv_std_logic_vector(num/100,4); seg1<=conv_std_logic_vector((num/10)mod10,4); seg0<=conv_std_logic_vector(nummod10,4); endif; endprocess; resetwatch<=resetn; --ponentconfigurations u0:xiaodouportmap(clk=>clkslow_xiaodou,reset=>reset,resetn=>resetn); u1:divideportmap(clk=>clk,clk_out=>clkslow); u2:cat_signalportmap(clk=>clk,reset=>resetn,cat=>cat); u3:M_sequenceportmap(clk=>clkslow,reset=>resetn,seq=>Mseq); u4:seg7portmap(a=>temp,b=>b); u5:div_10portmap(clk=>clk,clkout=>clkslow_xiaodou);endarch;仿真波形圖及分析按鍵防抖模塊圖2-1按鍵防抖波形圖由圖2-1,我們可以看到有三個帶有抖動的按鍵信號,當(dāng)?shù)谝粋€按鍵信號發(fā)生時,當(dāng)restlast=‘0’且resetnow=‘1’且時鐘信號為‘0’時輸出一個和時鐘低電平寬度相同的正脈沖信號,其余時候都輸出‘0’,可以看到對其它兩個按鍵的防抖也做得是和設(shè)想符合的,由此完成了按鍵防抖的功能。分頻器模塊(用分頻200來說明)圖2-2(a)輸出時鐘由低電平翻高電平圖2-2(b)輸出時鐘由高電平翻低電平圖2-2(c)分頻器整體圖由圖2-2(a)我們可以看到,當(dāng)計數(shù)器記到99時輸出時鐘由‘0’翻為‘1’,由圖2-2(b)我們可以看到,當(dāng)計數(shù)器再次計到99時,輸出時鐘由‘1’翻為‘0’,由此實現(xiàn)了,100個輸入時鐘周期對應(yīng)輸出時鐘周期的一半,也就實現(xiàn)了200分頻的功能。M序列發(fā)生器模塊圖2-3(a)M序列發(fā)生器移位寄存器的反饋圖2-3(b)隨機數(shù)的展示圖2-3(b)當(dāng)產(chǎn)生的隨機數(shù)大于999時圖2-3(c)當(dāng)reset信號發(fā)生時圖2-3(d)延遲性說明由圖2-3(a)可以看到,在紅框中,reg[9]為‘0’,reg[6]為‘1’,異或之后反饋函數(shù)為‘1’,可以看到下一列的reg[0]為‘1’,同理當(dāng)?shù)诙械膔eg[9]為‘1’,reg[6]為‘0’,下一列的reg[0]就是’1’,當(dāng)?shù)谒牧?,reg[9]為‘1’,reg[6]為‘1’時異或之后,應(yīng)為‘0’,下一列的reg[0]也是‘0’,由此反饋函數(shù)完成了它的功能。由圖2-3(b)可以看到產(chǎn)生的隨機數(shù)幾乎沒有重復(fù)的。由圖2-3(c)可以看到當(dāng)產(chǎn)生的隨機數(shù)>999時,輸出會減去999,就比如第一個箭頭所對應(yīng)的“1111110100”是1012,減去999就是13,與設(shè)計相符。由圖2-3(c),可以看到當(dāng)reset信號發(fā)生時,輸出變?yōu)?2,也就是學(xué)號的后三位對應(yīng)的十進制數(shù),并且在下一個時鐘上升沿到來時,由于輸出seq的變化會晚于時鐘上升沿(如圖2-3(d)),所以在頂層將seq時取出時仍然是92,由此實現(xiàn)了保持2s的功能。譯碼模塊圖2-4(a)譯碼的對應(yīng)關(guān)系圖2-4(b)譯碼波形圖圖2-5(c)譯碼波形圖(1010-1111)由圖2-4(b),當(dāng)輸入為“0000”時,輸出“1111110”,與0對應(yīng)的數(shù)碼管譯碼相同;當(dāng)輸入為“0100”,輸出“0110011”,與4所對應(yīng)的數(shù)碼管譯碼相同。將余下的輸入輸出的對應(yīng)關(guān)系列在表1中。表1:輸入信號譯碼輸出信號00001111110000101100000010110110100111111001010001100110101101101101101011111011111100001000111111110011111011其它0000000位選信號模塊圖2-5位選信號波形圖由圖2-5,可以看到當(dāng)方框中的時鐘第一個上升沿到來時,count記到00,cat輸出11111110,也就是cat[0]為0,選擇最低位的一個數(shù)碼管,之后count依次為00,01,10,cat依次輸出11111110,11111101,11111011,實現(xiàn)了位選信號為順序負脈沖信號的輸出。當(dāng)reset信號發(fā)生時變?yōu)?1111110。頂層圖2-6(a)整體波形圖(帶reset)圖2-6(b)整體波形圖圖2-6(c)reset信號發(fā)生細節(jié)圖圖2-6(d)整體波形圖細節(jié)由圖2-6(a)(b)可以看出seg2seg1seg0分別取出了偽隨機數(shù)的百位十位個位,當(dāng)reset發(fā)生時也回到了學(xué)號后三位“092”,同時第五行信號為20xx分頻對應(yīng)的信號(仿真時用的200分頻),每個數(shù)字保持的時間為此信號的周期,實現(xiàn)了2s切換
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 印刷業(yè)互聯(lián)網(wǎng)+與融合發(fā)展考核試卷
- 冷藏車運輸企業(yè)風(fēng)險管理與內(nèi)部控制系統(tǒng)考核試卷
- 天然氣藏動態(tài)模擬與預(yù)測考核試卷
- 影視錄放設(shè)備顯示技術(shù)考核試卷
- 文化藝術(shù)與城市品牌建設(shè)考核試卷
- 木片干燥技術(shù)與木材應(yīng)力釋放考核試卷
- 健身器材行業(yè)企業(yè)文化建設(shè)與品牌形象提升考核試卷
- 保險業(yè)與新能源保險市場的機遇與挑戰(zhàn)應(yīng)對策略案例分析考核試卷
- 制糖業(yè)的可持續(xù)發(fā)展評估考核試卷
- 木材的采伐和森林管理考核試卷
- 高等數(shù)學(xué)上冊目錄同濟第七版
- 中國古代餐具
- 電動執(zhí)行機構(gòu)安裝施工工藝標(biāo)準(zhǔn)
- 儒釋道文化秒解詳解課件
- 施工日志模板
- 粗原料氣的凈化-二氧化碳的脫除(合成氨生產(chǎn))
- Agilent7820A氣相色譜儀操作規(guī)程知識講解
- 中醫(yī)適宜技術(shù)模擬試題(附答案)
- 加涅的信息加工理論-課件
- 400字作文稿紙(方格)A4打印模板
- 不領(lǐng)證的夫妻離婚協(xié)議書
評論
0/150
提交評論