聲明:代碼部分使用了AI工具
實驗六 ?綜合考核
Quartus 18.0
FPGA ?5CSXFC6D6F31C6N
?
1. 實驗項目
要求利用硬件描述語言Verilog(或VHDL)、圖形描述方式、IP核,結合數字系統設計方法,在Quartus開發環境下,2人1組本班內自由組隊,從下列3個實驗項目中任選1項(3選1)進行實現。因材料限制,每個項目每個班級最多6組選擇,第一次實驗時填表選定,不得變更。
實驗分為2部分內容,基礎實驗12學時,使用FPGA開發板實現。拓展實驗需要搭建外圍電路與開發板連接實現相關功能,可利用課余時間進行開放實驗,第二次實驗時進行集中實驗驗收(4學時)。
注意事項:需自帶計算機(安裝有Quartus、multisim等軟件);還需帶烙鐵、焊錫焊接工具和萬用表等,實驗室提供相關元器件。?
實驗項目名稱 | 基礎實驗內容(12學時) | 拓展實驗內容 (開放實驗+4學時驗收實驗) |
項目1:簡易頻率計的設計與實現 | 利用硬件描述語言或圖形描述方式,結合數字電路設計方法,實現以下功能: 1.對1kHz-1MHz方波信號的頻率測量功能,進行quartus/modelsim仿真驗證;(60分) 2.使用實驗室提供開發板完成對1kHz-1MHz方波信號的頻率測量功能,控制數碼管實時顯示測量結果。(20分) 3.可通過開發板上的USB-Uart接口,將測量頻率結果傳送至計算機上的串口調試助手顯示。(20分) | 在基礎實驗內容的基礎上,使用元器件搭建外圍電路,經multisim/proteus仿真驗證后,制作實物電路與開發板連接,實現以下功能: 1.可對幅度0.1V-4V,頻率1kHz-10kHz范圍的正弦信號進行頻率測量;(60分) 2.對輸入正弦信號同時進行幅度和頻率測量,并將測量結果實時顯示并發送至計算機。(40分) |
項目2:簡易信號發生器的設計與實現 | 利用硬件描述語言或圖形描述方式,結合數字電路設計方法,實現以下功能: 1.產生1kHz-1MHz范圍內的方波信號,信號頻率可由按鍵調節,步進間隔1kHz,進行quartus/modelsim仿真驗證;(60分) 2.使用實驗室提供開發板輸出1kHz-1MHz方波信號,信號頻率可由按鍵調節,控制數碼管實時顯示當前頻率值。(20分) 3.實現用計算機調節開發板輸出方波信號頻率的功能。(20分) | 在基礎實驗內容的基礎上,使用元器件搭建外圍電路,經multisim/proteus仿真驗證后,制作實物電路與開發板連接,實現以下功能: 1.產生1kHz-10kHz范圍內的三角波信號,頻率可由按鍵和計算機進行調節;(60分) 2.產生7kHz-10kHz范圍內的正弦波信號,頻率可由按鍵和計算機進行調節。(40分)? |
項目3:電壓電流表的設計與實現 | 利用硬件描述語言或圖形描述方式,結合數字電路設計方法,實現以下功能: 1.使用實驗室提供開發板對介于0-4V之間的直流電壓值進行測量,分辨率1mV,測量結果在數碼管上顯示,每秒至少刷新1次;(60分) 2.對兩路0-4V之間的直流電壓值同時進行測量,測量結果交替顯示。(20分) 3.可通過開發板上的USB-Uart接口,將測量電壓結果傳送至計算機上的串口調試助手顯示。(20分) | 在基礎實驗內容的基礎上,使用元器件搭建外圍電路,經multisim/proteus仿真驗證后,制作實物電路與開發板連接,實現以下功能: 1.對直流電源輸出到負載上的電壓和電流進行測量,并將測量結果實時顯示并發送至計算機;(60分) 2.使用電壓電流測量結果計算負載實時功率和耗電量,將計算結果發送至計算機。(40分) |
2. 實驗要求
(1)每人對于所選擇完成的實驗項目,通過查閱資料理解實驗原理,設計實驗方案,并將實驗原理和方案寫于實驗報告中。
(2)按照實驗要求,完成電路設計、通過編譯無誤后,完成測試代碼編寫,實現功能仿真,記錄仿真波形并寫于實驗報告。
(3)編譯的輸出文件下載到FPGA電路板,完成指定功能,進行拍照和結果分析,寫入實驗報告。
(4)基礎實驗內容完成后由老師驗收并記錄實驗成績。
(5)設計外圍電路完成相關功能,使用Multisim、Proteus對外圍電路功能進行驗證,截圖寫入實驗報告。
(6)利用開放實驗時間搭建外圍電路實物,進行測試驗證,對測試結果進行拍照和分析,寫入實驗報告。
(7)集中驗收實驗時經老師檢查電路無誤后,將搭建電路與FPGA開發板連接,進行測試。測試完成后由老師驗收并記錄實驗成績,認真撰寫實驗報告,按時上交實驗報告。
(8)實驗六實驗報告使用智慧樹平臺網上填寫提交,每組僅需提交1份,按自己選擇題目提交相應作業,截止時間為第二次實驗當晚23:59前。建議邊做實驗邊拍照記錄,減少實驗報告撰寫時間。
3. 實驗器材清單
(1)FPGA開發板,有DE1SOC和DE10-Standard這2種,隨機領用,看準自己開發板型號,查找相關資料。
(2)直流電源、信號源、示波器、萬用表(需自備)。
(3)直插1/4W電阻
??? 阻值:10Ω, 22Ω, 47Ω,? 100Ω ,? 150Ω ,? 200Ω ,? 220Ω ,? 270Ω ,? 330Ω,? 470Ω,? 510Ω, 680Ω, 1kΩ, 2kΩ, 2.2kΩ, 3.3kΩ, 4.7kΩ, 5.1kΩ, 6.8kΩ, 10kΩ, 20kΩ, 47kΩ, 51kΩ, 68kΩ, 100kΩ, 220kΩ, 300kΩ, 470kΩ, 680kΩ, 1MΩ
(4)瓷片電容
? 容值:2pF, 3pF, 5pF, 10pF, 15pF, 22pF, 30pF, 47pF, 68pF, 75pF, 82pF, 100pF, 150pF, 220pF, 330pF, 470pF, 680pF, 1npF, 1.5nF, 2.2nF, 3.3nF, 4.7nF, 6.8nF, 10nF, 15nF, 22nF, 47nF, 68nF, 100nF
3. 實驗器材清單
(5)電解電容(焊接務必注意正負極)
50V0.22uF, 50V0.47uF, 50V1uF, 50V2.2uF, 50V4.7uF, 25V10uF, 25V22uF, 16V33uF, 16V47uF, 16V100uF, 10V220uF, 10V470uF
(6)二極管
1N4148, 1N4007, 1N5819, 1N5399, FR107, FR207, 1N5408, 1N5822
(7)運算放大器LM324及芯片座
(8)比較器LM393及芯片座
(9)USB轉TTL轉換器(計算機和開發板通信用,用后需歸還)
驅動及安裝說明: https://zhuanlan.zhihu.com/p/370245114
(10)萬用板5*7cm單面(每組一塊), 杜邦線。
聲明:我們選擇的是項目二;隔得時間太久,有的照片找不著了;分頻器部分,由于采用了除法,受限于有限字長,得到的實際頻率有一定誤差,雖然人為進行了修正,但在高頻時仍比較明顯,可以考慮其他算法改進;正弦波部分的帶通濾波器沒有問題;但三角波部分的積分器需要改進,現在的問題是頻率較高時幅值衰減較明顯。
考核內容
1.1.【問答題】(10分)
產生1kHz-1MHz范圍內的方波信號,信號頻率可由按鍵調節,步進間隔1kHz,進行
quartus,/modelsim仿真驗證;簡述該設計的主要功能和原理?
?
主要功能:
????????可以通過按鈕調節輸出1kHz-1MHz的方波、7kHz-10kHz正弦波、1kHz-10kHz三角波(步進均為1kHz);可以通過串口從電腦上控制輸出1kHz-1MHz的方波、7kHz-10kHz正弦波、1kHz-10kHz三角波(步進均為1kHz)。
? ? ? ? 不過,串口控制功能只能輸入十六進制數,所以在測試時需要先把想輸入的十進制數轉換為十六進制,允許輸入范圍為0x0001~0x03E8(注意,1MHz即為1000kHz,我們這里使用三位數碼管,故顯示為000)。比如,我想通過串口控制輸出726kHz方波,只需在電腦串口助手上輸入02D6再發送即可。
原理:時鐘脈沖信號經過可調分頻器后得到可控頻率的矩形脈沖信號,矩形脈沖信號分別經過濾波器和積分器后可得到正弦波和三角波。編寫一個調節模塊用以傳遞輸入的指令,并聯系輸入部分和輸出部分。
1.2.【問答題】(5分)
上傳設計框圖、源程序等截圖:
1.3.【問答題】(5分)
上傳仿真結果截圖,描述圖中結果:
引腳分配:
?quartus/modelsim聯合仿真:
1.4.【問答題】(5分)
使用實驗室提供開發板輸出1kHz-1MHz方波信號,信號頻率可由按鍵調節,控制數碼管實時顯示
當前頻率值。上傳輸出最低頻率方波的照片,照片中需包含設置頻率和示波器測量波形。
實驗六項目二按鈕演示
實驗六項目二串口演示
1.5.【問答題】(5分)
上傳輸出最高頻率方波的照片,照片中需包含設置頻率和示波器測量波形。
找不著照片了
1.6.【問答題】(5分)
你最終實現了多少范圍內的頻率輸出功能?誤差是多少?
范圍達到了題目要求,這里誤差不是我算的,不知道。
1.7.【問答題】(10分)
在基礎實驗內容的基礎上,使用元器件搭建外圍電路,簡述外圍電路原理?
帶通濾波器設計:
1.8.【問答題】(10分)
上傳外圍電路圖及仿真測試結果,并說明仿真情況
帶通濾波器:
積分器:
1.9.【問答題】(10分)
制作實物電路與開發板連接,實現以下功能:
產生1kHz-10kHz范圍內的三角波信號,頻率可由按鍵和計算機進行調節;上傳最低頻率和最高頻
率時輸出三角波的測量結果照片。
1.10.【問答題】(10分)
產生7kHz-10kHz范圍內的正弦波信號,頻率可由按鍵和計算機進行調節。上傳最低頻率和最高頻
率時輸出正弦波的測量結果照片。
2.【問答題】(10分)
上傳搭建的外圍電路與開發板連接的實物照片。
3.【問答題】(10分)
你在實驗調試過程中出現了哪些問題?如何解決的?有何實驗心得體會?
(1)有時會出現不明原因的報錯,報錯中會出現“License”相關字眼,這是在程序運行途中發生了破解失效,需要妥善保存工程后再一次進行破解。
(2)在仿真過程中,程序選擇的文件保存路徑經常會出現問題,“.vwf”文件與“.vt"文件可能會被寫入不同路徑,這會導致報錯并且仿真錯誤。摸索出來的解決方法是在可能的路徑中分別復制一份對應文件。
(3)可以通過給FPGA斷電后再上電來清除上一次下載到FPGA中的程序。
(4)遇到報錯,可將報錯信息輸送給一些大語言模型,往往會得到不錯的改進建議,適時適量使用AI工具并非壞事。
附錄(代碼及資源)
代碼
dds.v
//主程序
module dds(input wire clk, // FPGA主時鐘input wire rst_n, // 復位信號input wire button_up, // 增加頻率按鈕input wire button_down, // 減少頻率按鈕input wire uart_rx, // 計算機控制的UART輸入input wire select_control,// 選擇控制信號:0為按鍵控制,1為UART控制output wire wave_out, // 輸出方波信號output wire [6:0] hex0, // 數碼管顯示output wire [6:0] hex1,output wire [6:0] hex2
);wire [19:0] freq_from_button; // 來自按鍵控制的頻率選擇wire [19:0] freq_from_uart; // 來自UART控制的頻率選擇reg [19:0] freq_sel; // 實際選擇的頻率// 按鍵控制模塊button_control btn_ctrl (.clk(clk),.rst_n(rst_n),.button_up(button_up),.button_down(button_down),.freq_sel(freq_from_button));// 方波信號生成模塊clock_divider clk_div (.clk(clk),.rst_n(rst_n),.freq_sel(freq_sel),.wave_out(wave_out));// 數碼管顯示模塊seven_segment_display display (.clk(clk),.rst_n(rst_n),.freq_sel(freq_sel),.hex0(hex0),.hex1(hex1),.hex2(hex2));// 計算機調節模塊uart_control uart_ctrl (.clk(clk),.rst_n(rst_n),.uart_rx(uart_rx),.freq_sel(freq_from_uart));// 多路選擇器always @(*) beginif (select_control) freq_sel = freq_from_uart; // 如果select_control為1,用UART控制頻率else freq_sel = freq_from_button; // 否則用按鍵控制頻率endendmodule
clock_divider.v?
// 時鐘分頻器模塊
module clock_divider(input wire clk, // FPGA主時鐘,例如50MHzinput wire rst_n, // 復位信號input wire [31:0] freq_sel, // 選擇的頻率(步進為1kHz)output reg wave_out // 輸出方波信號
);reg [31:0] counter;reg [31:0] threshold;always @(posedge clk or negedge rst_n) beginthreshold = 85899*freq_sel;if(!rst_n) counter <= 0; else counter <= counter + threshold; end always@(posedge clk or negedge rst_n) begin if(!rst_n) wave_out <= 0; else if(counter < 32'h7FFF_FFFF) wave_out <= 0; else wave_out <= 1; end endmodule
button_control.v
module button_control(input wire clk,input wire rst_n,input wire button_up, // 增加頻率按鈕input wire button_down, // 減少頻率按鈕output reg [19:0] freq_sel // 輸出選擇的頻率
);reg [19:0] freq_max = 20'd1000; // 最大頻率 1 MHz (1000 kHz)reg [19:0] freq_min = 20'd1; // 最小頻率 1 kHzreg button_up_last;reg button_down_last;// 檢測下降沿wire button_up_fall = (button_up_last == 1) && (button_up == 0);wire button_down_fall = (button_down_last == 1) && (button_down == 0);always @(posedge clk) beginif (!rst_n) beginfreq_sel <= 20'd1;button_up_last <= 1'b1; button_down_last <= 1'b1; // 默認頻率1 kHzend else begin// 更新按鍵的上一個狀態button_up_last <= button_up;button_down_last <= button_down;// 處理按鍵下降沿if (button_up_fall && freq_sel < freq_max)freq_sel <= freq_sel + 1;else if (button_down_fall && freq_sel > freq_min)freq_sel <= freq_sel - 1;end
endendmodule
seven_segment_display.v
// 數碼管顯示模塊
module seven_segment_display(input wire clk,input wire rst_n,input wire [19:0] freq_sel, // 當前選擇的頻率值(單位kHz)output reg [6:0] hex0, // 數碼管顯示頻率的最低位output reg [6:0] hex1, // 數碼管顯示頻率的中間位output reg [6:0] hex2 // 數碼管顯示頻率的最高位
);wire [3:0] digit0 = freq_sel % 10; // 頻率個位wire [3:0] digit1 = (freq_sel / 10) % 10; // 頻率十位wire [3:0] digit2 = (freq_sel / 100) % 10; // 頻率百位always @(*) beginhex0 = digit_to_segment(digit0);hex1 = digit_to_segment(digit1);hex2 = digit_to_segment(digit2);endfunction [6:0] digit_to_segment;input [3:0] digit;case (digit)4'd0: digit_to_segment = 7'b1000000; // 顯示04'd1: digit_to_segment = 7'b1111001; // 顯示14'd2: digit_to_segment = 7'b0100100; // 顯示24'd3: digit_to_segment = 7'b0110000; // 顯示34'd4: digit_to_segment = 7'b0011001; // 顯示44'd5: digit_to_segment = 7'b0010010; // 顯示54'd6: digit_to_segment = 7'b0000010; // 顯示64'd7: digit_to_segment = 7'b1111000; // 顯示74'd8: digit_to_segment = 7'b0000000; // 顯示84'd9: digit_to_segment = 7'b0010000; // 顯示9default: digit_to_segment = 7'b1111111; // 默認不顯示endcaseendfunction
endmodule
uart_control.v
module uart_control(input wire clk, // FPGA主時鐘input wire rst_n, // 復位信號input wire uart_rx, // 接收來自計算機的UART信號output reg [19:0] freq_sel // 輸出設置的頻率值
);wire [7:0] uart_data; // 單字節UART數據wire uart_data_ready; // 數據是否接收完成的標志reg [15:0] received_data; // 兩字節拼接后的數據reg [1:0] byte_counter; // 字節計數器,跟蹤接收的字節數reg data_processed; // 數據是否已處理標志// 實例化UART接收器uart_receiver uart_rx_inst (.clk(clk),.rst_n(rst_n),.rx(uart_rx),.data(uart_data),.data_ready(uart_data_ready));always @(posedge clk or negedge rst_n) beginif (!rst_n) beginfreq_sel <= 20'd1; // 默認頻率1 kHzreceived_data <= 16'd0;byte_counter <= 2'd0;data_processed <= 1'b0;end else begin// 當UART數據接收完成且尚未處理時if (uart_data_ready && !data_processed) begin// 處理接收到的第一個或第二個字節if (byte_counter == 2'd0) beginreceived_data[7:0] <= uart_data; // 保存第一個字節byte_counter <= byte_counter + 1;end else if (byte_counter == 2'd1) beginreceived_data[15:8] <= uart_data; // 保存第二個字節byte_counter <= 2'd0; // 重置字節計數器// 檢查拼接后的頻率是否在有效范圍內if (received_data >= 16'd1 && received_data <= 16'd1000) beginfreq_sel <= {4'd0, received_data}; // 將16位數據擴展為20位enddata_processed <= 1'b1; // 標記數據已處理endend// 當數據未準備好時,重置標志以等待下一個數據if (!uart_data_ready) begindata_processed <= 1'b0;endendend
endmodule
uart_receiver.v
module uart_receiver (input wire clk, // FPGA主時鐘input wire rst_n, // 復位信號input wire rx, // UART接收信號output reg [7:0] data, // 接收到的數據output reg data_ready // 數據接收完成標志
);parameter CLK_FREQ = 50000000; // FPGA主時鐘頻率(例如50MHz)parameter BAUD_RATE = 9600; // UART波特率(例如9600)localparam BIT_PERIOD = CLK_FREQ / BAUD_RATE; // 每個位的時鐘周期數reg [15:0] clk_counter; // 時鐘計數器reg [3:0] bit_index; // 當前位索引reg [7:0] rx_shift_reg; // 接收移位寄存器reg receiving; // 接收狀態標志always @(posedge clk or negedge rst_n) beginif (!rst_n) beginclk_counter <= 16'd0;bit_index <= 4'd0;rx_shift_reg <= 8'd0;data_ready <= 1'b0;receiving <= 1'b0;end else begin// 開始接收:檢測到起始位(rx == 0)if (!receiving && rx == 1'b0) beginreceiving <= 1'b1;clk_counter <= 16'd0;bit_index <= 4'd0;data_ready <= 1'b0;end// 接收狀態:按波特率接收位if (receiving) beginif (clk_counter == BIT_PERIOD - 1) beginclk_counter <= 16'd0;if (bit_index == 4'd8) begin// 停止位接收完成,數據完整receiving <= 1'b0;data <= rx_shift_reg; // 將移位寄存器中的數據存入datadata_ready <= 1'b1; // 設置數據接收完成標志end else begin// 繼續接收數據位,移位存儲rx_shift_reg <= {rx, rx_shift_reg[7:1]};bit_index <= bit_index + 1;endend else beginclk_counter <= clk_counter + 1;endend else begindata_ready <= 1'b0; // 重置data_ready標志endendendendmodule
資源
1.Quartus搭配Modelsim仿真全流程/Bug解決文章瀏覽閱讀1.6w次,點贊20次,收藏178次。Quartus搭配Modelsim仿真全流程教學,可能遇到的問題以及解決方法_quartus仿真https://blog.csdn.net/weixin_43680772/article/details/117791151?fromshare=blogdetail&sharetype=blogdetail&sharerId=117791151&sharerefer=PC&sharesource=AhandsomeA&sharefrom=from_linkhttps://blog.csdn.net/weixin_43680772/article/details/117791151?fromshare=blogdetail&sharetype=blogdetail&sharerId=117791151&sharerefer=PC&sharesource=AhandsomeA&sharefrom=from_link
Quartus使用步驟及聯合Modelsim仿真教程文章瀏覽閱讀2.1w次,點贊52次,收藏300次。Quartus使用記錄及與modelsim聯合仿真_quartus仿真https://blog.csdn.net/m0_64605336/article/details/134355651?fromshare=blogdetail&sharetype=blogdetail&sharerId=134355651&sharerefer=PC&sharesource=AhandsomeA&sharefrom=from_linkhttps://blog.csdn.net/m0_64605336/article/details/134355651?fromshare=blogdetail&sharetype=blogdetail&sharerId=134355651&sharerefer=PC&sharesource=AhandsomeA&sharefrom=from_link
2.Quartus串口驅動及USB-Blaster驅動下載指南https://blog.csdn.net/gitblog_09700/article/details/143154139https://blog.csdn.net/gitblog_09700/article/details/143154139
3.AI工具ChatGPThttps://chat.openai.com/https://chat.openai.com/
豆包https://www.doubao.com/chat/2377401https://www.doubao.com/chat/2377401
DeepSeekhttps://chat.deepseek.com/https://chat.deepseek.com/
4.使用手冊:Terasic - All FPGA Boards - Cyclone V - DE1-SoC Boardhttps://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=836&PartNo=4https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=836&PartNo=4
Terasic - SoC Platform - Cyclone - DE10-Standardhttps://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=1081&PartNo=4https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=1081&PartNo=4