

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 電子線路設計報告</b></p><p> (數(shù)字鐘及汽車尾燈)</p><p> 題目:數(shù)字鐘與汽車尾燈</p><p> 院系:電子與信息工程系</p><p><b> 班級:</b></p><p><b> 姓名:&
2、lt;/b></p><p><b> 學號:</b></p><p><b> 試驗號:</b></p><p><b> 指導老師:</b></p><p><b> 2009.6.24</b></p><p>
3、 【實驗目的】 ①掌握可編程邏輯器件的應用開發(fā)技術——設計輸入、編譯、仿真和器件編程;</p><p> ?、谑煜ひ环NEDA軟件——MAX+PlusⅡ的使用;</p><p> ?、壅莆誚erilog設計方法;</p><p> ④掌握分模塊分層次的設計方法;</p><p> ⑤用Verilog完成一個多功能數(shù)字鐘和汽車尾燈控制的設計。
4、</p><p> 【實驗原理】 采用分模塊分層次的設計方法,用Verilog語言由頂層模塊逐層向下設計,頂層模塊調用底層模塊來完成相應的功能。完成電路的編譯與適配后進行電路的仿真實驗,在仿真結果滿足實驗要求的情況下進行電路的配置,即將生成的*.sof文件下載到開發(fā)板上,驗證實驗結果。</p><p><b> 【實驗開發(fā)環(huán)境】</b></p>&l
5、t;p> ①開發(fā)軟件:MAX+PlusⅡ,其開發(fā)流程為設計輸入、編譯、仿真、和編程與驗證。</p><p> ?、陂_發(fā)語言:Verilog,一種專門為ASIC設計而開發(fā)的,通常用于寄存器傳輸級(RTL)門電路級的描述,是一種相對低級的描述語言。</p><p> ?、蹖嶒灠澹篍DA Pro2K實驗開發(fā)系統(tǒng),是一種基于CPLD可編程邏輯器件的開發(fā)板。</p><p
6、><b> 【實驗模塊設計】</b></p><p> 多功能數(shù)字鐘系統(tǒng)組成</p><p> 圖1 多功能數(shù)字鐘系統(tǒng)組成框圖</p><p> 由上面的設計框圖容易看出,數(shù)字鐘部分的實驗由主體電路和擴展電路組成,其中主體電路主要是完成小時、分鐘、秒的顯示,通過分頻器得到秒脈沖,通過秒計數(shù)器完成60進制的計數(shù),然后用譯碼電路完成秒
7、在數(shù)碼管上的顯示,分鐘和小時顯示的實現(xiàn)與秒類似,主要是脈沖不同而已,其中小時又分為12進制和24進制;擴展電路是用來完成計時之外的一些附加功能,比如定時控制、仿電臺報時、自動報整點時數(shù)、觸摸報整點時數(shù)等。其詳細設計將在下面逐一提到。</p><p><b> 各模塊的設計及仿真</b></p><p> 數(shù)字鐘主體電路頂層模塊</p><p&g
8、t; 圖2 數(shù)字鐘主體電路的層次結構圖</p><p> 數(shù)字鐘主體電路頂層模塊由三部分組成,小時計數(shù)器、分計數(shù)器和秒計數(shù)器,分計數(shù)器和秒計數(shù)器是60進制的,用8位BCD碼表示,高4位為6進制,0、1、2、3、4、5、0、1…這樣顯示;低4位為10進制,0、1、2、3、4、5、6、7、8、9、0、1…這樣顯示。小時計數(shù)器用12進制和24進制同時計時,12進制為01、02、03、04、05、06、07、08、0
9、9、10、12、01、02…這樣顯示;24進制為00、01、02、03、04、05、06、07、08、09、10、12、13、14、15、16、17、18、19、20、21、22、23、00、01…這樣顯示。</p><p> ?、?6進制計數(shù)器的設計及仿真</p><p> 在沒計數(shù)到5之前,每來一個CP脈沖計數(shù)就加1,到5時變?yōu)?.</p><p> ?、?,V
10、erilog代碼:</p><p> //counter6.v 6進制計數(shù)器</p><p> module counter6(Q,nCR,EN,CP);</p><p> input CP,nCR,EN; //時鐘CP、清零nCR、使能EN</p><p> output[3:0] Q;</p><p>
11、 reg[3:0] Q;</p><p> always@(posedge CP or negedge nCR)</p><p><b> begin</b></p><p> if(~nCR) Q<=4'b0000; //異步清零</p><p> else if(~EN) Q<=Q;&
12、lt;/p><p> else if(Q==4'b0101) Q<=4'b0000; //計數(shù)到5時賦值為0</p><p> else Q<=Q+1'b1; //未計數(shù)到5時在時鐘來時加1</p><p><b> end</b></p><p><b> endm
13、odule</b></p><p><b> Ⅱ,仿真結果:</b></p><p> 圖3 6進制計數(shù)器仿真截圖</p><p> 由仿真截圖可以看出在CP的上升沿來臨時輸出Q的值加1,計數(shù)到5時變?yōu)?</p><p> 0,繼續(xù)計數(shù),完成了6進制計數(shù)器的功能。仿
14、真結果與實驗的預期結果吻合,</p><p> 說明此模塊是成功的。</p><p><b> ?、螅K符號圖:</b></p><p> ?、?10進制計數(shù)器的設計及仿真</p><p> ?、?,Verilog代碼:</p><p> //counter10.v 10進制計數(shù)器</
15、p><p> module counter10(Q,nCR,EN,CP);</p><p> input CP,nCR,EN; //時鐘CP、清零nCR、使能EN</p><p> output[3:0]Q;</p><p> reg[3:0]Q;</p><p> always@(posedge CP or
16、negedge nCR)</p><p><b> begin</b></p><p> if(~nCR) Q<=4'b0000; //異步清零</p><p> else if(~EN) Q<=Q;</p><p> else if(Q==4'b1001) Q<=4'
17、b0000; //計數(shù)到9時賦值為0</p><p> else Q<=Q+1'b1; //未計數(shù)到9時在時鐘來時加1</p><p><b> end</b></p><p><b> endmodule</b></p><p><b> ?、?,仿真結果:<
18、;/b></p><p> 圖4 10進制計數(shù)器仿真截圖</p><p> 由仿真截圖可以看出在CP的上升沿來臨時輸出Q的值加1,計數(shù)到9時變?yōu)?</p><p> 0,繼續(xù)計數(shù),完成了10進制計數(shù)器的功能。仿真結果與實驗的預期結果吻合,</p><p> 說明此模塊是成功的。</p&g
19、t;<p><b> Ⅲ,模塊符號圖:</b></p><p> ④ 60進制計數(shù)器的設計及仿真</p><p><b> 模塊結構圖如下</b></p><p> 圖5 60進制計數(shù)器的層次結構</p><p> ?、瘢琕erilog代碼:</p><p
20、> //counter60.v 60進制計數(shù)器</p><p> module counter60 (Cnt,nCR,EN,CP);</p><p> input nCR,EN,CP; //時鐘CP、清零nCR、使能EN</p><p> output [7:0] Cnt; </p><p> wire [7 :0] C
21、nt;</p><p><b> wire ENP;</b></p><p> counter10 UC0 (Cnt[3:0],nCR,EN,CP); //低4位調用10進制計數(shù)器</p><p> counter6 UC1(Cnt[7:4],nCR,ENP,CP);//高4位調用6進制計數(shù)器</p><p>
22、assign ENP=(Cnt[3:0]==4'h9);//低位計到9時向高位發(fā)送使能信號</p><p><b> endmodule</b></p><p><b> ?、颍抡娼Y果:</b></p><p> 圖6 60進制計數(shù)器仿真截圖_1</p><p> 圖7 60進制
23、計數(shù)器仿真截圖_2</p><p> 由仿真截圖可以看出在CP的上升沿來臨時輸出Q的值加1,計數(shù)到59時為 </p><p> 0,繼續(xù)計數(shù),完成了60進制計數(shù)器的功能。仿真結果與實驗的預期結果吻合,</p><p> 說明此模塊是成功的。</p><p><b> ?、?,模塊符號圖:<
24、/b></p><p> ?、?12進制計數(shù)器的設計及仿真</p><p> ?、?,Verilog代碼:</p><p> //counter12.v 12進制計數(shù)器</p><p> module counter12(CntH,CntL,nCR,EN,CP);</p><p> input CP,nCR
25、,EN; //時鐘CP、清零nCR、使能EN</p><p> output[3:0] CntH,CntL;//高4位和低4為輸出</p><p> reg[3:0] CntH,CntL;</p><p> always@(posedge CP or negedge nCR)</p><p><b> begin</
26、b></p><p> if(~nCR) {CntH,CntL}<=8'h00; //異步清零</p><p> else if(~EN) {CntH,CntL}<={CntH,CntL};</p><p> else if((CntH>1)||((CntH==1)&&(CntL>=2)))</p&
27、gt;<p> {CntH,CntL}<=8'h01;//非法計數(shù)情況均置數(shù)為8'h01</p><p> else if((CntH==0)&&(CntL==9))</p><p> {CntH,CntL}<=8'h10;//到9時變?yōu)?0</p><p> else if((CntH==1
28、)&&CntL<2) //11與12 的計數(shù)</p><p><b> begin </b></p><p> CntH<=CntH;</p><p> CntL<=CntL+1'b1; </p><p><b> end</b></p>
29、;<p><b> else</b></p><p><b> begin</b></p><p> CntH<=CntH; //其它情況低位加1計數(shù)</p><p> CntL<=CntL+1'b1;</p><p><b> end</
30、b></p><p><b> end</b></p><p><b> endmodule</b></p><p><b> ?、?,仿真結果:</b></p><p> 圖8 12進制計數(shù)器仿真截圖</p><p> 由仿真截圖可以看出
31、在CP的上升沿來臨時輸出Q的值加1,計數(shù)到12時為</p><p> 01,繼續(xù)計數(shù),完成了12進制計數(shù)器的功能。仿真結果與實驗的預期結果吻合,</p><p> 說明此模塊是成功的。</p><p><b> Ⅲ,模塊符號圖:</b></p><p> ⑥24進制計數(shù)器的設計及仿真</p><
32、;p> ?、?,Verilog代碼:</p><p> //counter24.v 24進制計數(shù)器</p><p> module counter24(CntH,CntL,nCR,EN,CP);</p><p> input CP,nCR,EN; //時鐘CP、清零nCR、使能EN</p><p> output[3:0] C
33、ntH,CntL; //高4位和低4為輸出</p><p> reg[3:0] CntH,CntL;</p><p> always@(posedge CP or negedge nCR)</p><p><b> begin</b></p><p> if(~nCR) {CntH,CntL}<=8'
34、;h00;//異步清零</p><p> else if(~EN) {CntH,CntL}<={CntH,CntL};</p><p> else if((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3)))</p><p> {CntH,CntL}<=8'h00; //非法
35、計數(shù)情況均置數(shù)為00</p><p> else if((CntH==2)&&CntL<3) //20,21,22,23的計數(shù)</p><p><b> begin </b></p><p> CntH<=CntH;</p><p> CntL<=CntL+1'b1;&
36、lt;/p><p><b> end</b></p><p> else if(CntL==9)//低位為9時,高位加1,低位置4'b0000 </p><p><b> begin</b></p><p> CntH<=CntH+1'b1;</p
37、><p> CntL<=4'b0000;</p><p><b> end</b></p><p><b> else</b></p><p><b> begin</b></p><p> CntH<=CntH; //其它情況
38、低位正常計數(shù)</p><p> CntL<=CntL+1'b1;</p><p><b> end</b></p><p><b> end</b></p><p><b> endmodule</b></p><p><b&
39、gt; ?、颍抡娼Y果:</b></p><p> 圖9 24進制計數(shù)器仿真截圖</p><p> 由仿真截圖可以看出在CP的上升沿來臨時輸出Q的值加1,計數(shù)到23時為</p><p> 00,繼續(xù)計數(shù),完成了24進制計數(shù)器的功能。仿真結果與實驗的預期結果吻合,</p><p> 說明此模塊是成功的。</p>
40、<p><b> ?、?,模塊符號圖:</b></p><p> ?、叻诸l模塊的設計與仿真</p><p> ?、?,Verilog代碼:</p><p> //Divided_Frequency.v 分頻模塊產(chǎn)成1Hz與512Hz的脈沖</p><p> module Divided_Frequency
41、 (_1HzOut,_512HzOut,nCR,_1024HzIN);</p><p> input _1024HzIN,nCR;</p><p> output _1HzOut,_512HzOut; //輸出1Hz與512Hz</p><p> supply1 Vdd;</p><p> wire[11:0] Q;</p&g
42、t;<p> wire EN1,EN2;</p><p> counter10 DU0(Q[3:0],nCR,Vdd,_1024HzIN);</p><p> counter10 DU1(Q[7:4],nCR,EN1,_1024HzIN);</p><p> counter10 DU2(Q[11:8],nCR,EN2,_1024HzIN);//
43、3次調用10進制</p><p> assign EN1=(Q[3:0]==4'h9);</p><p> assign EN2=(Q[7:4]==4'h9)&&(Q[3:0]==4'h9);</p><p> assign _1HzOut=Q[11];//最高位為1.024Hz</p><p>
44、 assign _512HzOut=Q[0];//最低位為512Hz</p><p><b> endmodule</b></p><p><b> Ⅱ,仿真結果:</b></p><p> 圖10 分頻模塊1Hz輸出(最下的)仿真截圖</p><p> 圖11 分頻模塊512Hz輸出
45、(倒數(shù)第二的)仿真截圖</p><p> 由上圖可以看出512Hz的輸出脈沖符合要求,周期是1024Hz的兩倍,1Hz的脈沖輸出由于是1024Hz的1000倍,在仿真圖上無法準確驗證,只能猜想大概是對的,者還需將程序下載到開發(fā)板上來驗證,而且由于我在開始的設計師想調用更多的模塊,所以1Hz脈沖的產(chǎn)生有些誤差。其它的從仿真來看與設計相吻合。</p><p><b> Ⅲ,模塊符
46、號圖:</b></p><p> ?、?選1選擇器的設計與仿真</p><p> Ⅰ,Verilog代碼:</p><p> //_2to1MUX.v 2選1選擇器</p><p> module _2to1MUX (OUT,SEL,X,Y);</p><p> input[7:0] X,Y; /
47、/兩輸入變量</p><p> input SEL;</p><p> output[7:0] OUT;</p><p> assign OUT=SEL?X:Y;</p><p><b> endmodule</b></p><p><b> ?、?,仿真結果:</b>
48、</p><p> 圖12 2選1選擇器仿真截圖</p><p> 由上圖可以清晰地看出,當SEL為高電平時輸出OUT為X的值,當SEL為低電平時輸出OUT 為Y的值,仿真結果與設計預期結果相吻合,說明此模塊的設計是成功的。</p><p><b> ?、?,模塊符號圖:</b></p><p> ⑨4比特比較器的
49、設計與仿真</p><p> Ⅰ,Verilog代碼:</p><p> //_4bitcomparator.v 4比特比較器</p><p> module _4bitcomparator (EQU,AMORPM,AMORPMCLOCK,A,B);</p><p> input[3:0]A,B;</p><p
50、> input AMORPM,AMORPMCLOCK;//顯示的上下午與鬧鐘設置的上下午</p><p> output EQU;</p><p> assign EQU=((A==B)&&(AMORPM==AMORPMCLOCK));</p><p><b> endmodule</b></p>&
51、lt;p><b> ?、颍抡娼Y果:</b></p><p> 圖13 4比特比較器仿真截圖</p><p> 有上面的仿真圖可以看出當A=B且AMORPM=AMORPMCLOCK是,輸出EQU會有一個高電平輸出,當兩者有一個不滿足條件時,EQU為低電平時。此模塊用于下面的鬧鐘模塊,當設置的時間與當前時間相等時,EQU會有一個高電平輸出。仿真結果與設計相吻
52、合,說明此模塊是成功的。</p><p><b> ?、螅K符號圖:</b></p><p> ?、夥码娕_報時模塊的設計與仿真</p><p> ?、瘢琕erilog代碼:</p><p> // Radio.v 仿電臺報時</p><p> module Radio (ALARM_Rad
53、io,Minute,Second,_1024HzIN,_512Hz);</p><p> input _1024HzIN,_512Hz;</p><p> input[7:0] Minute,Second;</p><p> output ALARM_Radio;</p><p> reg ALARM_Radio;</p>
54、<p> always@(Minute or Second)</p><p> if(Minute==8'h59)</p><p> case(Second)</p><p><b> 8'h51,</b></p><p><b> 8'h53,</b>
55、;</p><p><b> 8'h55,</b></p><p> 8'h57: ALARM_Radio=_512Hz;//在每個小時的59分51,53,55, 57秒的//時候發(fā)出4聲512Hz的低/音</p><p> 8'h59: ALARM_Radio=_1024HzIN;//在每個小時的59分59秒時發(fā)
56、1024Hz</p><p><b> //的一聲高音</b></p><p> default: ALARM_Radio=1'b0;//其它情況在此模塊下不發(fā)出聲音</p><p><b> endcase</b></p><p> else ALARM_Radio=1'b
57、0; //其它情況在此模塊下不發(fā)出聲音</p><p><b> endmodule</b></p><p><b> ?、颍抡娼Y果:</b></p><p> 圖14 仿電臺報時仿真截圖</p><p> 有上面的仿真可以清楚地看出,在某小時的59分51,53,55,57秒的時候,ALA
58、RM_Radio發(fā)出了四聲512Hz的低音,在59分59秒的時候發(fā)出了一聲1024Hz的高音,仿真結果與設計預期相符,說明此模塊是成功的。</p><p><b> Ⅲ,模塊符號圖:</b></p><p> 鬧鐘模塊的設計與仿真</p><p> 鬧鐘設模塊設計框圖如下:</p><p> 圖15 鬧鐘設定模
59、塊框圖</p><p> 由以上框圖很容易用Verilog語言實現(xiàn)鬧鐘功能。</p><p> Ⅰ,Verilog代碼:</p><p><b> //Bell.v </b></p><p> module Bell (ALARM_Clock,Set_Hr,Set_Min,Hour,Minute,Second,S
60、etHrkey,</p><p> SetMinkey,AMORPM,AMORPMCLOCK,_1024HzIN,_512Hz,_1Hz,CtrlBell);</p><p> output ALARM_Clock;</p><p> output[7:0] Set_Hr,Set_Min;//設定的鬧鐘的小時與分鐘</p><p>
61、wire ALARM_Clock;</p><p> wire[7:0] Set_Hr,Set_Min;</p><p> input _1024HzIN,_512Hz,_1Hz;</p><p> input SetHrkey,SetMinkey;//設定鬧鐘的小時與分鐘的按鍵</p><p> input CtrlBell; //
62、鬧鈴控制,CtrlBel=1時,鬧鐘在設定的時刻發(fā)出鬧鈴</p><p> input AMORPM;//主時鐘的上下午標志</p><p> wire AMORPM;</p><p> input AMORPMCLOCK;//鬧鐘的上下午標志</p><p> wire AMORPMCLOCK;</p><p&g
63、t; input[7:0] Hour,Minute,Second; //主時鐘的小時,分鐘,秒</p><p> supply1 Vdd;</p><p> wire HrH_EQU,HrL_EQU,MinH_EQU,MinL_EQU;</p><p> wire Time_EQU;</p><p> counter60 SU1(S
64、et_Min,Vdd,SetMinkey,_1Hz); </p><p> counter12 SU2(Set_Hr[7:4],Set_Hr[3:0],Vdd,SetHrkey,_1Hz);</p><p> //鬧鐘小時與分鐘的設定</p><p> _4bitcomparator SU4(HrH_EQU,AMORPM,AMORPMCLOCK,Set_Hr[
65、7:4],Hour[7:4]); </p><p> //比較主時鐘與鬧鐘的小時高4位是否相等</p><p> _4bitcomparator SU5(HrL_EQU,AMORPM,AMORPMCLOCK,Set_Hr[3:0],Hour[3:0]);</p><p> //比較主時鐘與鬧鐘的小時低4位是否相等</p><p> _
66、4bitcomparator SU6(MinH_EQU,AMORPM,AMORPMCLOCK,Set_Min[7:4],Minute[7:4]);</p><p> //比較主時鐘與鬧鐘的分鐘高4位是否相等</p><p> _4bitcomparator SU7(MinL_EQU,AMORPM,AMORPMCLOCK,Set_Min[3:0],Minute[3:0]);</p&
67、gt;<p> //比較主時鐘與鬧鐘的分鐘低4位是否相等</p><p> assign Time_EQU=(HrH_EQU && HrL_EQU && MinH_EQU && MinL_EQU);</p><p><b> //時間相等</b></p><p> assig
68、n ALARM_Clock=CtrlBell?(Time_EQU && (((Second[0]==1'b1)&&_512Hz)||((</p><p> Second[0]==1'b0)&&_1024HzIN))): 1'b0;</p><p> //若兩時間相等則發(fā)出高低音交錯的鬧鈴1024HzIN和512Hz
69、</p><p><b> Endmodule</b></p><p><b> ?、颍抡娼Y果:</b></p><p> 圖16 鬧鐘模塊仿真截圖</p><p> 由以上的仿真截圖可以清晰地看出當主時鐘與鬧鐘設定的時間相等時,ALARM_Clock會輸出1024HzIN和512Hz高低
70、交錯的脈沖,且會持續(xù)1分鐘,這與設計預期相符,說明此模塊是成功的。</p><p><b> ?、螅K符號圖:</b></p><p> 自動整點報時模塊的設計與仿真</p><p> 此模塊的設計思想為利用case語句將所有小時都包含進去,并且在相應小時的case通過賦值語句將相應應該響的聲數(shù)定義好,從而實現(xiàn)了幾點報幾時的功能,考慮到要
71、與整點報時的聲音區(qū)分開來故選擇了在偶數(shù)秒響。具體如下:</p><p> Ⅰ,Verilog代碼:</p><p> //Complete_auto.v</p><p> module Complete_auto (ALARM_Complete_auto,Hour,Minute,Second,_512Hz);</p><p> inp
72、ut[7:0] Hour,Minute,Second;</p><p> input _512Hz;</p><p> output ALARM_Complete_auto;</p><p> reg ALARM_Complete_auto;</p><p> always@(Minute or Second)</p>
73、<p> if(Minute==8'h00)</p><p> case(Hour)</p><p> 8'h01:ALARM_Complete_auto=(Second==8'h02)&&_512Hz;</p><p><b> //1點是響1下</b></p><
74、p> 8'h02:ALARM_Complete_auto=(Second==8'h02||Second==8'h04)&&_512Hz;</p><p><b> //2點是響2下</b></p><p> 8'h03:ALARM_Complete_auto=(Second==8'h02||Secon
75、d==8'h04||Second==8'h 06)&&_512Hz;</p><p><b> //3點是響3下</b></p><p> 8'h04:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==
76、8'h08)&&_512Hz;</p><p><b> //4點是響4下</b></p><p> 8'h05:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==8'h08||Second==8
77、9;h10)&&_512Hz;</p><p><b> //5點是響5下</b></p><p> 8'h06:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==8'h08||Second==8'h1
78、0 ||Second==8'h12)&&_512Hz;</p><p><b> //6點是響6下</b></p><p> 8'h07:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==8'h08||
79、Second==8'h10||Second==8'h12||Second==8'h14)&&_512Hz;</p><p><b> //7點是響7下</b></p><p> 8'h08:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Secon
80、d==8'h 06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16)&&_512Hz;</p><p><b> //8點是8下</b></p><p> 8'h09:ALARM_Comple
81、te_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8'h18)&&_512Hz;</p><p>&l
82、t;b> //9點是響9下</b></p><p> 8'h10:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Secon
83、d==8'h16||Second==8'h18 ||Second==8'h20)&&_512Hz;</p><p> //10點是響10下</p><p> 8'h11:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second
84、==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8'h18||Second==8'h20||Second==8'h22)&&_512Hz;</p><p> //11點是響11下</p><p> 8&
85、#39;h12:ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h 06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8'h18||Second==8'h20||
86、Second==8'h22||Second==8'h24)&&_512Hz;</p><p> //12點是響12下</p><p><b> endcase</b></p><p> else ALARM_Complete_auto=1'b0;</p><p><b&
87、gt; endmodule</b></p><p><b> ?、?,仿真結果:</b></p><p> 圖17 自動整點報時仿真(7點時)截圖</p><p> 圖18 自動整點報時仿真(11點時)截圖</p><p> 由以上仿真的截圖可以看出,隨便選取兩個整點時刻7點和11點ALARM_Co
88、mplete_auto都輸出了相應的脈沖,7點時每隔一秒就會有512Hz的脈沖輸出,相當于是響了7下,11點時也如此,有兩仿真圖可以看出仿真結果與實驗預期相符得很好,說明該模塊是成功的。</p><p><b> ?、?,模塊符號圖:</b></p><p> 觸摸報時模塊設計(未成功故不能仿真)</p><p> 對于此模塊,我設想的思路與
89、自動整點報時相似,在按鍵按下時,啟動另一個時鐘,而此時鐘的秒是以0開始計數(shù)的,故可調用自動整點報時來完成功能。</p><p> 在此就不把代碼附上去了。</p><p><b> 模塊符號圖:</b></p><p><b> 主時鐘模塊的設計</b></p><p> 主時鐘模塊主要完成
90、小時、分鐘和秒的計時,調節(jié)分鐘與小時,12和24進制時間的切換等功能。Verilog代碼如下:</p><p> //top_clock.v</p><p> module top_clock(Hour,Minute,Second,_1Hz,nCR,AdjMinkey,AdjHrkey,_12OR24);</p><p> input _1Hz,nCR,Ad
91、jMinkey,AdjHrkey,_12OR24;</p><p> output[7:0] Hour,Minute,Second;</p><p> wire[7:0] Hour,Minute,Second;</p><p> wire[7:0] Hour_12,Hour_24;</p><p> supply1 Vdd;</
92、p><p> wire MinCP,HrCP;</p><p> counter60 UT1(Second,nCR,Vdd,_1Hz);</p><p> counter60 UT2(Minute,nCR,Vdd,~MinCP);</p><p> counter12 UT3(Hour_12[7:4],Hour_12[3:0],nCR,V
93、dd,~HrCP);</p><p> counter24 UT4(Hour_24[7:4],Hour_24[3:0],nCR,Vdd,~HrCP); //完成12進制和24</p><p><b> //進制的計數(shù)</b></p><p> _2to1MUX MU0(Hour,_12OR24,Hour_24,Hour_12);//選擇顯
94、示的進制小時</p><p> assign MinCP=AdjMinkey?_1Hz:(Second==8'h59);</p><p> assign HrCP=AdjHrkey?_1Hz:({Minute,Second}==16'h5959);</p><p><b> endmodule</b></p>
95、<p><b> 模塊符號圖:</b></p><p> 完整模塊(頂層模塊)的設計</p><p> //Complete_top_Clock.v </p><p> module Complete_top_Clock(LED_Hr,LED_Min,LED_Sec,ALARM,AMORPM,AMORPMCLOCK,_102
96、4HzIN,</p><p> AdjHrkey,AdjMinkey, ALARM_Ctrl_Byhand,_12OR24,CtrlBell,Mode,nCR);</p><p> input _1024HzIN;</p><p> input nCR;</p><p> output[7:0] LED_Hr,LED_Min,LED_
97、Sec;</p><p> output AMORPM;</p><p> output AMORPMCLOCK;</p><p> wire[7:0] LED_Hr,LED_Min,LED_Sec;</p><p> wire _512Hz,_1Hz;</p><p> wire _nCR;</p&g
98、t;<p> input AdjMinkey,AdjHrkey,_12OR24,ALARM_Ctrl_Byhand;</p><p> //input SetHrkey,SetMinkey;</p><p> wire[7:0] Hour,Minute,Second;</p><p> wire[7:0] Set_Hr,Set_Min;<
99、/p><p> wire[7:0] Minute_Byhand,Second_Byhand;</p><p> supply0 _0;</p><p> supply1 _1;</p><p> wire[7:0] Hour_temp,Minute_temp,Second_temp;</p><p> wire
100、ALARM_Radio;</p><p> wire ALARM_Clock;</p><p> wire ALARM_Complete_auto,ALARM_Complete_Byhand;</p><p> output ALARM;</p><p> input CtrlBell;</p><p> i
101、nput Mode;</p><p> assign AMORPM=(Hour==8'h12)?(~AMORPM):AMORPM;</p><p> assign AMORPMCLOCK=(Set_Hr==8'h12)?(~AMORPMCLOCK):AMORPMCLOCK;</p><p> Divided_Frequency U0(_1Hz,
102、_512Hz,nCR,_1024HzIN);</p><p> //調用分頻模塊產(chǎn)生1Hz和512Hz的脈沖</p><p> top_clock U1(Hour,Minute,Second,_1Hz,nCR,((~Mode)&&AdjMinkey),((~Mode)&&AdjHrkey),_12OR24);</p><p>&l
103、t;b> //調用主時鐘模塊</b></p><p> Radio U2(ALARM_Radio,Minute,Second,_1024HzIN,_512Hz);</p><p><b> //調用仿電臺報時</b></p><p> Bell U3(ALARM_Clock,Set_Hr,Set_Min,Hour,Mi
104、nute,Second,(Mode&&AdjHrkey),(Mode&&AdjMinkey),</p><p> AMORPM,AMORPMCLOCK,_1024HzIN,_512Hz,_1Hz,CtrlBell);</p><p><b> //調用鬧鐘模塊</b></p><p> Complete_a
105、uto U4(ALARM_Complete_auto,Hour,Minute,Second,_512Hz);</p><p> //調用自動整點報時模塊</p><p> //Complete_Byhand U5(_1Hz,ALARM_Ctrl_Byhand,Minute_Byhand,_nCR);</p><p> //Complete_Byhand U5
106、(Hour,Second,_512Hz,ALARM_Ctrl_Byhand,ALARM_Complete_Byhand);</p><p> //Complete_Byhand U5 (Hour,_512Hz,ALARM_Ctrl_Byhand,ALARM_Complete_Byhand);</p><p> assign ALARM=(ALARM_Radio||ALARM_Clock
107、||ALARM_Complete_auto);</p><p><b> //最終蜂鳴器輸出</b></p><p> _2to1MUX MU0(LED_Hr,Mode,Set_Hr,Hour);</p><p> _2to1MUX MU1(LED_Min,Mode,Set_Min,Minute);</p><p>
108、; _2to1MUX MU2(LED_Sec,Mode,8'h00,Second);//選擇顯示主時鐘還是設定的鬧鐘時間</p><p><b> Endmodule</b></p><p><b> 模塊符號圖:</b></p><p><b> 引腳分配</b></p>
109、<p><b> 【汽車尾燈】</b></p><p> 汽車尾燈實際上是一個簡單的狀態(tài)機,利用狀態(tài)機的方法設計如下:</p><p> ?、?,Verilog代碼:</p><p> // car_light.v 汽車尾燈模塊</p><p> module car_light(CP,brake,
110、right,left,back,l1,l2,l3,l4,l5,l6,sta);</p><p> input CP,brake,right,left,back;</p><p> output l1,l2,l3,l4,l5,l6;</p><p> output [3:0]sta;</p><p> reg l1,l2,l3,l4,l
111、5,l6;</p><p> reg [3:0] sta,c;</p><p><b> reg ba;</b></p><p> always@(posedge CP)</p><p><b> begin</b></p><p> if (brake)</
112、p><p><b> begin</b></p><p> if (right) //右轉彎剎車</p><p><b> begin</b></p><p> l1<=1; l2<=1; l3<=1;</p><p> if(c==4'h0)
113、 begin l4<=1; l5<=0; l6<=0; c<=c+4'h1; end </p><p> if(c==4'h1) begin l4<=0; l5<=1; l6<=0; c<=c+4'h1; end</p><p> if(c>=4'h2) begin l4<=0; l5<=
114、0; l6<=1; c<=4'h0; end</p><p> sta<=4'h5;</p><p><b> end</b></p><p> else if (left) //左轉彎剎車</p><p><b> begin</b></p>
115、<p> l4<=1; l5<=1; l6<=1;</p><p> if(c==4'h0) begin l1<=0; l2<=0; l3<=1; c<=c+4'h1; end </p><p> if(c==4'h1) begin l1<=0; l2<=1; l3<=0; c<=c
116、+4'h1; end</p><p> if(c>=4'h2) begin l1<=1; l2<=0; l3<=0; c<=4'h0; end</p><p> sta<=4'h6;</p><p><b> end</b></p><p> e
117、lse //剎車</p><p><b> begin</b></p><p> l1<=1; l2<=1; l3<=1; l4<=1; l5<=1; l6<=1;</p><p> sta<=4'h2;</p><p><b> end</b&
118、gt;</p><p><b> end</b></p><p><b> else </b></p><p><b> begin </b></p><p> if (right) //右轉彎</p><p><b> begin&
119、lt;/b></p><p> l1<=0; l2<=0; l3<=0;</p><p> if(c==4'h0) begin l4<=1; l5<=0; l6<=0; c<=c+4'h1; end </p><p> if(c==4'h1) begin l4<=0; l5<=
120、1; l6<=0; c<=c+4'h1; end</p><p> if(c>=4'h2) begin l4<=0; l5<=0; l6<=1; c<=4'h0; end</p><p> sta<=4'h3;</p><p><b> end</b><
121、/p><p> else if (left) //左轉彎</p><p><b> begin</b></p><p> l4<=0; l5<=0; l6<=0;</p><p> if(c==4'h0) begin l1<=0; l2<=0; l3<=1; c<=
122、c+4'h1; end </p><p> if(c==4'h1) begin l1<=0; l2<=1; l3<=0; c<=c+4'h1; end</p><p> if(c>=4'h2) begin l1<=1; l2<=0; l3<=0; c<=4'h0; end</p>
123、<p> sta<=4'h4;</p><p><b> end</b></p><p> else if (back) //倒車</p><p><b> begin</b></p><p><b> ba<=~ba;</b><
124、/p><p> sta<=4'h7;</p><p> if (ba) begin l1<=1; l2<=1; l3<=1; l4<=1; l5<=1; l6<=1; end</p><p> else begin l1<=0; l2<=0; l3<=0; l4<=0; l5<=0;
125、l6<=0; end</p><p><b> end</b></p><p><b> else</b></p><p> begin //正常</p><p> sta<=4'h1; l1<=0; l2<=0; l3<=0; l4<=0; l
126、5<=0; l6<=0;</p><p><b> end</b></p><p><b> end</b></p><p><b> end</b></p><p><b> endmodule</b></p><
127、p><b> ?、?,仿真結果:</b></p><p> 圖19 汽車尾燈仿真截圖</p><p> 由以上的仿真截圖可以清楚地看出,①為右轉彎剎車,②為左轉彎剎車,③為剎車,④為右轉彎,⑤為左轉彎,⑥倒車。在各種情況下,仿真結果與實驗結果均相符,說明模塊是成功的。</p><p><b> ?、?,模塊符號圖:</b
128、></p><p><b> Ⅳ,引腳分配</b></p><p><b> 【實驗總結與心得】</b></p><p> 通過本次試驗讓我了解和掌握了VerilogHDL硬件語言,并且實地操作應用在FPGA上,讓我獲益匪淺。在實際操作編程的過程中,我發(fā)現(xiàn)很多東西都得學會轉換,不能死搬硬套的去使用任何一門語言或
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論