版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、EDA技術及應用實驗報告系 部: 指導教師: 學 號: 姓 名: 實驗一 點亮LED設計一、實驗目的通過此實驗讓用戶逐步了解、熟悉和掌握FPGA開發(fā)軟件QuartusII的使用方法及Verilog HDL的編程方法。本實驗力求以詳細的步驟和講解讓讀者以最快的方式了解EDA技術開發(fā)以及軟件的使用,從而快速入門并激起讀者對EDA技術的興趣。二、實驗內容SmartSOPC實驗箱上有8個發(fā)光二極管LED18,并分別與FPGA的50、5355、176和4749引腳相連。本實驗的內容是建立可用于控制LED亮/滅的簡單硬件電路,要求點亮SmartSOPC實驗箱上的4個發(fā)光二極管(LED1、LED3、LED5
2、和LED7)。三、實驗原理FPGA器件同單片機一樣,為用戶提供了許多靈活獨立的輸入/輸出I/O口(單元)。FPGA每個I/O口可以配置為輸入、輸出、雙向I/O、集電極開路和三態(tài)門等各種組態(tài)。作為輸出口時,FPGA的I/O口可以吸收最大為24mA的電流,可以直接驅動發(fā)光二極管LED等器件。所以只要正確分配并鎖定引腳后,在相應的引腳上輸出低電平“0”,就可以實現點亮該發(fā)光二級管的功能。四、實驗步驟1、啟動Quarters II建立一個空白工程,命名為led_test.qpf。然后分別建立圖形設計文件,命名為led_test.bdf,以及文本編輯文件led1.v,將他們都添加進工程中。2、對工程進行
3、設計。在led1.v中輸入程序代碼,并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。從設計文件中創(chuàng)建模塊,由led1.v生成名為led1.bsf的模塊符號文件。在led_test.bdf中任意空白處雙擊鼠標左鍵,將symbol對話框中l(wèi)ibraries:project下的led1模塊添加到圖形文件led_test.bdf中,加入輸入、輸出引腳,雙擊各管腳符號,進行管腳命名。完整的頂層模塊原理圖如下圖所示。選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。3、設置編譯選項并編譯硬件系統(tǒng)。將led_test.bdf設置為頂層實體。對該工程文件進行全程編譯處理。
4、若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。4、下載硬件設計到目標FPGA。將產生的led_test.sof輸出對FPGA進行配置。5、觀察LED的狀態(tài)。五、實驗程序/利用連續(xù)賦值assign語句實現module led1(led); /模塊名 led1output7:0 led; /定義輸出端口、assign led =8'b10101010; /輸出0xAAendmodule/利用過程賦值語句實現(暫時已屏蔽)/*module led1(led); /模塊名 led1output7:0 led; /定義輸出端口reg7:0 led; /定義寄存器always /過程
5、1,無敏感變量begin led = 8'b10101010; /輸出0xAAendendmudule*/六、思考題寫出使用QuartusII軟件開發(fā)工程的完整的流程。實驗二流水燈實驗一、實驗目的通過此實驗讓用戶進一步了解、熟悉和掌握CPLD/FPGA開發(fā)軟件的使用方法及Verilog HDL的編程方法。學習簡單時序電路的設計和硬件測試。二、實驗內容本實驗的內容是建立可用于控制LED流水燈的簡單硬件電路,要求在SmartSOPC實驗箱上實現LED1LED8發(fā)光二極管流水燈顯示。三、實驗原理1、在LED1LED8引腳上周期性的輸出流水數據,如原來輸出的數據是11111100則表示點亮LE
6、D1、LED2,流水一次后,輸出的數據應該為11111000,而此時則應點亮LED1LED3三個LED發(fā)光二極管,就可以實現LED流水燈。為了觀察方便,流水速率最好在2Hz左右。在QuickSOPC核心板上有一個48MHz的標準時鐘源,該時鐘脈沖Clock與芯片的28管腳相連。為了產生2Hz的時鐘脈沖,在此調用了一個分頻模塊(int_div模塊,位于光盤中EDA_Component目錄下),通過修改分頻系數來改變輸出頻,當分頻系數為24x106時,輸出即為2Hz的頻率信號。2、Int_div分頻模塊說明:int_div模塊是一個占空比為50%的任意整數分頻器。輸入時鐘為clock,輸出時鐘為c
7、lk_out。其中F_DIV為分頻系數,分頻系數范圍為12n (n=F_DIV_WIDTH),若要改變分頻系數,改變參數F_DIV和F_DIV_WIDTH到相應范圍即可。在本例中輸入時鐘為48MHz,要得到2Hz的信號,所以分頻系數為48x106/2=24x106;對于分頻系數為24x106的數需要一個25位寬的計數器即可。四、實驗步驟1、啟動Quarters II建立一個空白工程,命名為led_water.qpf。2、新建Verilog HDL源程序文件ledwater.v,輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。3、從設計文件中創(chuàng)建模塊,由
8、ledwater.v生成名為ledwater.bsf的模塊符號文件。4、將光盤中EDA_Component目錄下的int_div.bsf和int_div.v拷貝到工程目錄。5、新建圖形設計文件命名為led_water.bdf并保存。在空白處雙擊鼠標左鍵,分別將symbol對話框中l(wèi)ibraries:project下的ledwater和int_div模塊放在圖形文件led_water.bdf中,加入輸入、輸出引腳,雙擊各管腳符號,進行管腳命名。雙擊int_div的參數框,并修改參數,將F_DIV的值改為24000000,F_DIV_WIDTH的值改為25. 完整的頂層模塊原理圖如下圖所示。6、選
9、擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。7、將led_water.bdf設置為頂層實體。對該工程文件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。8、將產生的led_water.sof輸出對FPGA進行配置。9、更改分頻模塊(int_div)的分頻系數,并重新編譯下載,觀察流水燈的變化。五、實驗程序module ledwater (led,clk); /模塊名ledwateroutput7:0 led; /定義LED輸出口input clk; /定義時鐘輸入口reg8:0 led_r; /定義輸出寄存器assign led = led_r7:0;
10、 /寄存器輸出always (posedge clk) /在時鐘上升沿觸發(fā)進程begin led_r <= led_r << 1; /是,則輸出左移一位 if(led_r = 9'd0) /循環(huán)完畢嗎? led_r <= 9'b111111111; /是,則重新賦初值endendmodule六、思考題本實驗頂層采用了圖形輸入的方式,若采用文本輸入方式,如何編寫頂層文件?寫出相應程序。實驗三 鍵盤、LED發(fā)光實驗一、實驗目的通過此實驗讓用戶進一步了解、熟悉和掌握CPLD/FPGA開發(fā)軟件的使用方法及Verilog HDL的編程方法,熟悉以Verilog H
11、DL文件為頂層模塊的設計。學習和體會分支條件語句case的使用方法及FPGA I/O口的輸出控制。二、實驗內容SmartSOPC實驗箱上有8個發(fā)光二極管LED18和8個按鍵KEY1KEY8。本實驗的內容要求在SmartSOPC實驗箱上完成對8個按鍵KEY1KEY8進行監(jiān)控,一旦有按鍵輸入判斷其鍵值,并點亮相應的發(fā)光二極管,如若KEY3按下,則點亮LED1LED3發(fā)光二極管。三、實驗原理FPGA的所有I/O控制塊允許每個I/O口引腳單獨配置為輸出口,不過這種配置是系統(tǒng)自動完成的,一旦該I/O口被設置為輸入口使用時(如定義key0為輸入引腳:input key0;)該I/O控制模塊將直接使三態(tài)緩沖
12、區(qū)的控制端接地,使得該I/O口引腳對外呈高阻態(tài),這樣該I/O口引腳即可用作專用輸入引腳。只要正確分配并鎖定引腳后,一旦在KEY1KEY8中有按鍵輸入,在檢測到鍵盤輸入的情況下,繼續(xù)判斷其鍵值并做出相應的處理。四、實驗步驟1、啟動Quarters II建立一個空白工程,命名為keyled.qpf。2、新建Verilog HDL源程序文件keyled.v,輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。3、選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。4、對該工程文件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。
13、5、將產生的keyled.sof輸出對FPGA進行配置。按下不同按鍵觀察LED發(fā)光管的狀態(tài)。五、實驗程序module keyled(key,led);/模塊名keyledinput7:0 key;/定義鍵盤輸入口output7:0led;/定義發(fā)光管輸出口reg7:0led_r;/定義寄存器reg7:0buffer_r;assign led = led_r;/輸出鍵值always(key)/過程1beginbuffer_r = key;/讀取鍵值case(buffer_r)8'b11111110:led_r = 8'b11111110;/是鍵KEY1,則給寄存器賦值0xfe8&
14、#39;b11111101:led_r = 8'b11111100;/是鍵KEY2,則給寄存器賦值0xfc8'b11111011:led_r = 8'b11111000;/是鍵KEY3,則給寄存器賦值0xf88'b11110111:led_r = 8'b11110000;/是鍵KEY4,則給寄存器賦值0xf08'b11101111:led_r = 8'b11100000;/是鍵KEY5,則給寄存器賦值0xe08'b11011111:led_r = 8'b11000000;/是鍵KEY6,則給寄存器賦值0xc08'b
15、10111111:led_r = 8'b10000000;/是鍵KEY7,則給寄存器賦值0x808'b01111111:led_r = 8'b00000000;/是鍵KEY8,則給寄存器賦值0x00default:led_r = 8'b11111111;/否則給寄存器賦值0xffendcaseendendmodule六、思考題能否用if語句改寫本實驗程序?如果能,寫出相應程序。實驗四 靜態(tài)數碼管顯示實驗一、實驗目的學習7段數碼管顯示譯碼器的設計,進一步了解、熟悉和掌握FPGA開發(fā)軟件Quartus II的使用方法及Verilog HDL的編程方法,學習LPM兆功
16、能模塊的調用。二、實驗內容SmartSOPC實驗箱上有2個4位動態(tài)共陽極數碼管LED12和LED13。其中8個位碼DIG0DIG7和8位段碼SEG0SEG7分別與FPGA相應的引腳相連。這樣,只要DIG0DIG7上一直輸出低電平“0”,則8個數碼管將顯示相同的數碼(因為8個LED數碼管的段碼線分別接到了同一引腳上),這樣8位動態(tài)的LED數碼管就變成了靜態(tài)的LED。本實驗的內容是建立7段譯碼顯示模塊,用于控制LED數碼管的靜態(tài)顯示。要求在SmartSOPC實驗箱上的數碼管依次顯示09和AF16個字符。三、實驗原理數碼管LED顯示是工程項目中使用較廣的一種輸出顯示器件。常見的數碼管有共陰和共陽2種
17、。共陰數碼管是將8個發(fā)光二極管的陰極連接在一起作為公共端,而共陽數碼管是將8個發(fā)光二極管的陽極連接在一起作為公共端。公共端常被稱作位碼,而將其他的8位稱作段碼。數碼管有8個段分別為:h、g、f、e、d、c、b和a(h為小數點),只要公共端為高電平“1”,某個段輸出低電平“0”則相應的段就亮。本實驗通過分頻模塊int_div分頻得到1Hz的頻率信號,加載于4位計數器的時鐘輸入端,計數循環(huán)輸出09、AF16個數。最后通過七段譯碼模塊譯碼后在數碼管上顯示出來。四、實驗步驟1、啟動Quarters II建立一個空白工程,命名為sled.qpf。2、新建Verilog HDL源程序文件decl7s.v,
18、輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。3、從設計文件中創(chuàng)建模塊,由decl7s.v生成名為decl7s.bsf的模塊符號文件。4、將光盤中EDA_Component目錄下的int_div.bsf和int_div.v拷貝到工程目錄。5、添加4位計數器兆功能模塊。6、新建圖形設計文件命名為sled.bdf并保存。在空白處雙擊鼠標左鍵,分別將symbol對話框中l(wèi)ibraries:project下的counter、decl7s和int_div模塊放在圖形文件sled.bdf中,在symbol對話框中Name:輸入gnd,添加gnd符號。加入輸入、輸
19、出引腳,雙擊各管腳符號,進行管腳命名。雙擊int_div的參數框,并修改參數,將F_DIV的值改為48000000,F_DIV_WIDTH的值改為26。完整的頂層模塊原理圖如下圖所示。7、選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。8、將sled.bdf設置為頂層實體。對該工程文件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。9、將產生的sled.sof輸出對FPGA進行配置。觀察LED顯示狀態(tài)。五、實驗程序module decl7s(d,seg);/模塊名decl7sinput3:0 d;/輸入4位二進制碼output7:0seg;/七段譯碼輸出
20、reg7:0 seg_r;/定義數碼管輸出寄存器assign seg = seg_r;/輸出數碼管譯碼結果always (d)begincase(d)/七段譯碼4'h0:seg_r = 8'hc0;/顯示04'h1:seg_r = 8'hf9;/顯示14'h2:seg_r = 8'ha4;/顯示24'h3:seg_r = 8'hb0;/顯示34'h4:seg_r = 8'h99;/顯示44'h5:seg_r = 8'h92;/顯示54'h6:seg_r = 8'h82;/顯示64
21、39;h7:seg_r = 8'hf8;/顯示74'h8:seg_r = 8'h80;/顯示84'h9:seg_r = 8'h90;/顯示94'ha:seg_r = 8'h88;/顯示a4'hb:seg_r = 8'h83;/顯示b4'hc:seg_r = 8'hc6;/顯示c4'hd:seg_r = 8'ha1;/顯示d4'he:seg_r = 8'h86;/顯示e4'hf:seg_r = 8'h8e;/顯示fendcaseendendmodule六、思考題
22、1.本實驗采用的是共陽極數碼管,若采用共陰極數碼管,有什么不同?2.如何顯示HHHHHHHH和PPPPPPPP?實驗五 動態(tài)數碼管顯示實驗一、實驗目的學習動態(tài)掃描顯示的原理及電路的設計。二、實驗內容本實驗的內容是建立數碼管動態(tài)掃描顯示模塊,具體內容如下:1、在SmartSOPC實驗箱上完成LED數碼管的動態(tài)顯示“18”8個數字;2、放慢掃描速度演示動態(tài)顯示的原理過程。三、實驗原理一個FPGA的片子如果帶動多個(比如說8個)數碼管,選用靜態(tài)顯示的話,管腳很容易不夠用,于是大多采用動態(tài)顯示的方式。本次采用共陽極的數碼管,其中每個數碼管的8個段:h、g、f、e、d、c、b和a(h為小數點)都分別連接
23、到SEG0SEG7,8個數碼管分別由8個選通信號DIG0DIG7來選擇。被選通的數碼管顯示數據,其余關閉。如果在某一時刻DIG2為低電平“0”,其余選通信號為高電平“1”,這時僅DIG2對應的數碼管顯示來自段碼信號端的數據,其余7個數碼管呈現關閉狀態(tài)。根據這種電路狀態(tài),如果希望8個數碼管顯示希望的數據,就必須使得8個選通信號DIG0DIG7分別被單獨選通,并在此同時,在段信號輸入口加上希望在該對應數碼管上顯示的數據,于是隨著選通信號的掃描就能實現掃描顯示的目的。雖然每次只有一個LED顯示,但只要掃描顯示速率足夠快,由于人的視覺余輝效應,使我們仍會感覺所有的數碼管都在同時顯示。四、實驗步驟1、啟
24、動Quarters II建立一個空白工程,命名為dled.qpf。2、新建Verilog HDL源程序文件scan_led.v,輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。3、從設計文件中創(chuàng)建模塊,由scan_led.v生成名為scan_led.bsf的模塊符號文件。4、將光盤中EDA_Component目錄下的int_div.bsf和int_div.v拷貝到工程目錄。5、添加常量兆功能模塊。6、新建圖形設計文件命名為dled.bdf并保存。在空白處雙擊鼠標左鍵,分別將symbol對話框中l(wèi)ibraries:project下的constant、sc
25、an_led和int_div模塊放在圖形文件dled.bdf中,加入輸入、輸出引腳,雙擊各管腳符號,進行管腳命名。雙擊int_div的參數框,并修改參數,將F_DIV的值改為48000,F_DIV_WIDTH的值改為16。完整的頂層模塊原理圖如下圖所示。7、選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。8、將dled.bdf設置為頂層實體。對該工程文件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。9、將產生的sled.sof輸出對FPGA進行配置。觀察LED數碼管上的數字是否為“12345678”,然后把分頻模塊的參數改為F_DIV:24000000
26、,F_DIV_WIDTH:25,再重新編譯下載,觀察這次LED數碼管上的顯示數據,可以看到數據“12345678”動起來了,這正是動態(tài)掃描的方法和過程。五、實驗程序module scan_led(clk_1k,d,dig,seg);/模塊名scan_ledinput clk_1k;/輸入時鐘input31:0 d;/輸入要顯示的數據output7:0dig;/數碼管選擇輸出引腳output7:0 seg;/數碼管段輸出引腳reg7:0 seg_r;/定義數碼管輸出寄存器reg7:0 dig_r;/定義數碼管選擇輸出寄存器reg3:0 disp_dat;/定義顯示數據寄存器reg2:0count
27、;/定義計數寄存器assign dig = dig_r;/輸出數碼管選擇assign seg = seg_r;/輸出數碼管譯碼結果always (posedge clk_1k) /定義上升沿觸發(fā)進程begincount <= count + 1'b1;endalways (posedge clk_1k) begincase(count)/選擇掃描顯示數據3'd0:disp_dat = d31:28;/第一個數碼管3'd1:disp_dat = d27:24;/第二個數碼管3'd2:disp_dat = d23:20;/第三個數碼管3'd3:disp
28、_dat = d19:16;/第四個數碼管3'd4:disp_dat = d15:12;/第五個數碼管3'd5:disp_dat = d11:8; /第六個數碼管3'd6:disp_dat = d7:4;/第七個數碼管3'd7:disp_dat = d3:0;/第八個數碼管endcasecase(count)/選擇數碼管顯示位3'd0:dig_r = 8'b01111111;/選擇第一個數碼管顯示3'd1:dig_r = 8'b10111111;/選擇第二個數碼管顯示3'd2:dig_r = 8'b11011111
29、;/選擇第三個數碼管顯示3'd3:dig_r = 8'b11101111;/選擇第四個數碼管顯示3'd4:dig_r = 8'b11110111;/選擇第五個數碼管顯示3'd5:dig_r = 8'b11111011;/選擇第六個數碼管顯示3'd6:dig_r = 8'b11111101;/選擇第七個數碼管顯示3'd7:dig_r = 8'b11111110;/選擇第八個數碼管顯示endcaseendalways (disp_dat)begincase(disp_dat)/七段譯碼4'h0:seg_r =
30、8'hc0;/顯示04'h1:seg_r = 8'hf9;/顯示14'h2:seg_r = 8'ha4;/顯示24'h3:seg_r = 8'hb0;/顯示34'h4:seg_r = 8'h99;/顯示44'h5:seg_r = 8'h92;/顯示54'h6:seg_r = 8'h82;/顯示64'h7:seg_r = 8'hf8;/顯示74'h8:seg_r = 8'h80;/顯示84'h9:seg_r = 8'h90;/顯示94'h
31、a:seg_r = 8'h88;/顯示a4'hb:seg_r = 8'h83;/顯示b4'hc:seg_r = 8'hc6;/顯示c4'hd:seg_r = 8'ha1;/顯示d4'he:seg_r = 8'h86;/顯示e4'hf:seg_r = 8'h8e;/顯示fendcaseendendmodule六、思考題說出數碼管動態(tài)顯示的原理。實驗六 按鍵去抖動實驗一、實驗目的學習按鍵去抖動電路的硬件設計。二、實驗內容本實驗的內容是建立按鍵消抖模塊。通過SmartSOPC實驗箱上的按鍵KEY1(經過消抖)或K
32、EY2(沒有消抖)控制數碼管顯示數字。對比有加消抖和沒有加消抖模塊電路的區(qū)別。三、實驗原理作為機械開關的鍵盤,在按鍵操作時,由于機械觸點的彈性及電壓突跳等原因,在觸點閉合或開啟的瞬間會出現電壓抖動,實際應用中如果不進行處理將會造成誤觸發(fā)。由于這里是低電平表示按鍵按下,所以按鍵去抖動的關鍵在于提取穩(wěn)定的低電平狀態(tài),慮除前沿、后沿抖動毛刺。對于一個按鍵信號,可以用一個脈沖對他進行取樣,如果連續(xù)三次取樣為低電平,可以認為信號已經處于鍵穩(wěn)定狀態(tài),這時輸出一個低電平按鍵信號。繼續(xù)取樣的過程中如果不能滿足連續(xù)三次取樣為低,則認為鍵穩(wěn)定狀態(tài)結束,這時輸出變?yōu)楦唠娖?。一通道的消抖電路原理圖如下:四、實驗步驟1
33、、啟動Quarters II建立一個空白工程,命名為key_debounce.qpf。2、將上圖所示消抖電路用Verilog HDL語言描述出來,并拓展多個通道。新建Verilog HDL源程序文件debounce.v,輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。3、從設計文件中創(chuàng)建模塊,由debounce.v生成名為debounce.bsf的模塊符號文件。4、將光盤中EDA_Component目錄下的int_div.bsf和int_div.v拷貝到工程目錄。5、添加4位計數器兆功能模塊。6、新建圖形設計文件命名為key_debounce.bdf并
34、保存。在空白處雙擊鼠標左鍵,分別將symbol對話框中l(wèi)ibraries:project下的counter、debounce、decl7s和int_div模塊放在圖形文件debounce.bsf中,在symbol對話框中Name:輸入gnd,添加gnd符號,輸入and2,添加與門。加入輸入、輸出引腳,雙擊各管腳符號,進行管腳命名。雙擊int_div的參數框,并修改參數,將F_DIV的值改為240000,F_DIV_WIDTH的值改為18。完整的頂層模塊原理圖如下圖所示。7、選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。8、將key_debounce.bdf設置為頂層實體。對該工程文
35、件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。9、將產生的key_debounce.sof輸出對FPGA進行配置。分別連續(xù)按KEY1或KEY2觀察數碼管顯示狀態(tài),看數值是否連續(xù)遞增,比較前后兩次操作有何不同。五、實驗程序module debounce(clk,key_in,key_out);/按鍵消抖模塊input clk;/系統(tǒng)時鐘輸入inputKEY_WIDTH-1:0 key_in;/外部按鍵輸入outputKEY_WIDTH-1:0key_out;/按鍵消抖輸出regKEY_WIDTH-1:0dout1,dout2,dout3;/寄存器paramete
36、r KEY_WIDTH = 8;/參數assign key_out = (dout1 | dout2 | dout3);/按鍵消抖輸出always (posedge clk)begindout1 <= key_in;dout2 <= dout1;dout3 <= dout2;endendmodule六、思考題比較下面兩段程序的異同,并畫出電路結構圖。always ( posedge clk)begin dout1<=key_in; /非阻塞賦值 dout2<=dout1; dout3<=dout2;endalways ( posedge clk)begin
37、dout1<=key_in; /阻塞賦值 dout2<=dout1; dout3<=dout2;end實驗七 硬件電子琴實驗一、實驗目的學習利用蜂鳴器和按鍵設計硬件電子琴。二、實驗內容在SmartSOPC實驗箱上實現一個簡易電子琴。按下KEY1KEY7分別表示中音DO、RE、MI、FA、SOL、LA、SI;按住KEY8再按KEY1KEY7分別表示高音的DO、RE、MI、FA、SOL、LA、SI。三、實驗原理樂曲演奏的原理是:由于組成樂曲的每個音符的頻率值(音調)及其持續(xù)時間(音長)是樂曲演奏的2個基本數據,因此需要控制輸出到揚聲器的激勵信號的頻率高低和該頻率信號持續(xù)的時間。頻
38、率的高低決定了音調的高低,而樂曲的簡譜與各音名的頻率之間也有固定的對應關系。所有不同頻率的信號都是從同一基準頻率分頻而得來的,由于音階頻率多為非整數,而分頻系數又不能為小數,故必須將計算的到的分頻數進行四舍五入取整,基準頻率和分頻系數應綜合考慮加以選擇,從而保證音樂不會走調。如在48MHz時鐘下,中音1(對應的頻率值為523.3Hz)的分頻系數應該為:48000000/(2*523.3)=0xb327,這樣只需對系統(tǒng)時鐘進行45863次分頻即可得到所要的中音1。至于其他音符,同樣可求出對應的分頻系數,這樣利用程序可以很輕松地得到對應的樂聲。四、實驗步驟1、在Quarters II中建立一個工程
39、項目文件beep1.qpf。并在該項目下新建Verilog HDL源程序文件beep1.v,輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。2、選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。3、對該工程文件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。4、將產生的beep1.sof輸出對FPGA進行配置。按下按鍵KEY1KEY8就可以開始使用電子琴來演奏音樂了。五、實驗程序module beep1(clk,key,beep,led);/模塊名稱beep1input clk;/系統(tǒng)時鐘48MHzinput7:0
40、key;/按鍵輸入output beep;/蜂鳴器輸出端output7:0led;/LED輸出reg beep_r;/寄存器reg15:0count,count_end;reg7:0key_r;always(posedge clk)begincount <= count + 1'b1;/計數器加1if(count = count_end)&(!(count_end = 16'hffff)begincount <= 16'h0;/計數器清零beep_r <= !beep_r;/取反輸出信號endendalways (key)beginkey_r
41、= key;/取鍵值case(key_r)8'b11111110:count_end = 16'hb327;/中音1的分頻系數值8'b11111101:count_end = 16'h9fa0;/中音2的分頻系數值8'b11111011:count_end = 16'h8e32;/中音3的分頻系數值8'b11110111:count_end = 16'h8637;/中音4的分頻系數值8'b11101111:count_end = 16'h7794;/中音5的分頻系數值8'b11011111:count_en
42、d = 16'h6a88;/中音6的分頻系數值8'b10111111:count_end = 16'h5ee8;/中音7的分頻系數值8'b01111110:count_end = 16'h59ab;/高音1的分頻系數值8'b01111101:count_end = 16'h4fce;/高音2的分頻系數值8'b01111011:count_end = 16'h471a;/高音3的分頻系數值8'b01110111:count_end = 16'h431c;/高音4的分頻系數值8'b01101111:co
43、unt_end = 16'h3bca;/高音5的分頻系數值8'b01011111:count_end = 16'h3544;/高音6的分頻系數值8'b00111111:count_end = 16'h2f74;/高音7的分頻系數值default:count_end = 16'hffff;endcaseendassign beep =beep_r;/輸出音樂assign led =key_r;/輸出按鍵狀態(tài)endmodule六、思考題舉例說明產生不同音符的原理。實驗八 數字時鐘設計一、實驗目的學習數字時鐘的硬件設計。二、實驗內容在SmartSOPC
44、實驗箱上完成一個可以計時的數字時鐘,其顯示時間范圍是00:00:0023:59:59,,且該時鐘具有暫停計時和清零等功能。三、實驗原理一個完整的時鐘應由3部分組成:秒脈沖發(fā)生電路、計數顯示部分和時鐘調整部分。一個時鐘的準確與否主要取決于秒脈沖的精確度。為了保證時鐘計時準確我們對系統(tǒng)時鐘48MHz進行了48000000分頻,從而得到1Hz的秒脈沖。至于顯示部分與LED數碼管原理相同,而校時電路用戶可以自由發(fā)揮,如定義3個按鍵keystart、keymon和keyadd,分別用于控制時鐘的計時開始、調整功能選擇和加1處理,從而完成對現在時間的調整。本實驗的校時電路在此僅僅完成了暫停、清零等基本功能
45、。四、實驗步驟1、在Quarters II中建立一個工程項目文件clock.qpf。并在該項目下新建Verilog HDL源程序文件clock.v,輸入程序代碼并保存,進行綜合編譯,若在編譯中發(fā)現錯誤,則找出并更正錯誤,直至編譯成功為止。2、選擇目標器件并進行引腳鎖定。將未使用的管腳設置為三態(tài)輸入。3、對該工程文件進行全程編譯處理。若在編譯過程中發(fā)現錯誤,則找出并更正錯誤,直到編譯成功為止。4、將產生的clock.sof輸出對FPGA進行配置。觀察數碼管的顯示狀態(tài)。按下按鍵KEY1、KEY2觀察數字鐘上的時間有什么變化。五、實驗程序module clock(clk,key,dig,seg);/
46、模塊名clockinput clk;/輸入時鐘input1:0 key;/輸入按鍵output7:0dig;/數碼管選擇輸出引腳output7:0 seg;/數碼管段輸出引腳reg7:0 seg_r;/定義數碼管輸出寄存器reg7:0 dig_r;/定義數碼管選擇輸出寄存器reg3:0 disp_dat;/定義顯示數據寄存器reg24:0count;/定義計數寄存器reg23:0hour;/定義現在時刻寄存器reg sec,keyen;/定義標志位reg1:0dout1,dout2,dout3;/寄存器wire1:0key_done;/按鍵消抖輸出assign dig = dig_r;/輸出數
47、碼管選擇assign seg = seg_r;/輸出數碼管譯碼結果/秒信號產生部分always (posedge clk) /定義clock上升沿觸發(fā)begincount = count + 1'b1;if(count = 25'd24000000)/0.5S到了嗎?begincount = 25'd0;/計數器清零sec = sec;/置位秒標志endend/按鍵消抖處理部分assign key_done = (dout1 | dout2 | dout3);/按鍵消抖輸出always (posedge count17)begindout1 <= key;dout
48、2 <= dout1;dout3 <= dout2;endalways (negedge key_done0)beginkeyen = keyen;/將琴鍵開關轉換為乒乓開關end/數碼管動態(tài)掃描顯示部分always (posedge clk) /count17:15大約1ms改變一次begincase(count17:15)/選擇掃描顯示數據3'd0:disp_dat = hour3:0;/秒個位3'd1:disp_dat = hour7:4;/秒十位3'd2:disp_dat = 4'ha;/顯示"-"3'd3:disp_dat = hour11:8;/分個位3'd4:disp_dat = hour15:12; /分十位3'd5:disp_dat = 4'ha;/顯示"-"3'd6:disp_dat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房地產面積測繪與房地產營銷合同3篇
- 二零二五年度宗教場所租賃合同樣本3篇
- Unit 3 Sports and Fitness Listening and Talking 說課稿-2024-2025學年高一英語人教版(2019)必修第一冊
- 冬季滑雪運動
- Unit 7 International charities-study skills 說課稿 2024-2025學年牛津譯林版八年級英語下冊
- 二零二五年度房地產開發(fā)前期合同翻譯與國際化服務合同3篇
- 貴州商學院《模具CAD》2023-2024學年第一學期期末試卷
- 貴州輕工職業(yè)技術學院《電子商務A》2023-2024學年第一學期期末試卷
- 二零二五年度企業(yè)年金管理服務合同規(guī)范文本3篇
- 2024年九年級語文教學計劃方案(31篇)
- 圍墻維修 施工方案
- 創(chuàng)傷關節(jié)骨科年度總結
- 2022-2023學年江蘇省鹽城第一學期高一期末考試數學試卷及答案解析-普通用卷
- 醫(yī)師病理知識定期考核試題與答案
- 履約情況證明(共6篇)
- 礦井提升容器課件
- 云南省迪慶藏族自治州各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 《潔凈工程項目定額》(征求意見稿)
- 城鎮(zhèn)燃氣設計規(guī)范
- 年零售藥店操作規(guī)程版
- 日有所誦(二年級)
評論
0/150
提交評論