題目:多功能信號發(fā)生器的設計
1? 系統(tǒng)設計
1.1 設計要求
1.1.1 設計任務
設計并實現(xiàn)一個基于FPGA的多功能信號發(fā)生器。
1.1.2 性能指標要求
1.能夠產(chǎn)生兩種以上輸出波形(正弦波、三角波、鋸齒波等)。
2.輸出的波形的頻率允許有多種選擇。
3.輸出波形的幅度在 1V~5V 范圍內(nèi)。
4.輸出的波形能夠用示波器測量。
1.2 設計思路及設計框圖
1.2.1設計思路
多功能信號發(fā)生器的原理框圖如圖所示。其中,CLKGEN是分頻器,提供的50MHz的主頻率進行分頻,以得到滿足多功能信號發(fā)生器設計需要的時鐘頻率。
之后是三選一 數(shù)據(jù)選擇器,分別為8hz,13hz,18hz。
Lpm_counter256是參數(shù)可設置的計數(shù)器,用于產(chǎn)生lpm_rom256的8位地址,并從q[7..0]端輸出。
lpm_rom只讀存儲器,用于存放多功能信號發(fā)生器的波形數(shù)據(jù)信號。
設計了三個波形為的正弦波,方波,三角波。結果由輸出端q[7..0]輸出到四選一選擇器,由sel[1..0]選擇控制。
1.2.2總體設計框圖
2? 各個模塊程序的設計
數(shù)據(jù)選擇器,分頻器程序見下表
計數(shù)器模塊:計數(shù)器的元件生成時,首先在執(zhí)行File然后New,打開一個分頻器計數(shù)器鋸齒波正弦波三角波方波輸出波形選擇器新的模塊或者原理圖文件編輯窗口,雙擊窗口并選擇libraries欄中的選著ari?themtic的lpm?couter(計數(shù)器)?lpm元件,之后點擊ok并在彈出窗口中完成對參數(shù)的設置之后就可得到一個計數(shù)器元件。波形?ROM模塊:為了將數(shù)據(jù)裝入ROM中,在加入并設置ROM之前,應首先新建一個Memory?initial?izationfile文件,并設置波形最后保存后綴為,mif,生成的存儲器初值設定文件保存在工程的目錄中,完成存儲器初始值設定后,就可以加入波形只讀存儲器ROM,在library中選著storage中的lpm?rom即只讀存儲器ROM的lpm元件,輸出位為8位,字數(shù)是256,采用但時鐘控制方式。由于我的設計出的波形有四種,所以我要加的ROM有四個元件,他們分別輸出鋸齒波,方波,正弦波還有三角波,生成四個元件后,波形ROM模塊就完成了。
3? 調(diào)試過程
在QuartusII中打開工程,連接好試驗箱和示波器,編譯成功后將程序燒錄到硬件中,并將硬件中的輸出波形端與波形發(fā)生器相連,最后在硬件中撥動相應的開關,觀察波形發(fā)生器的波形,對波形進行來回測試,即可得出結果。
4? 功能測試
4.1 測試儀器與設備
筆記本,EDA試驗箱。
4.2 性能指標測試
能產(chǎn)生四種波形且頻率可調(diào)。
4.3 誤差分析
無
附錄
附錄1:仿真波形圖(部分模塊)
部分程序清單:
分頻器:
module div5hz #(
parameter WIDTH=27,
parameter N=50_000_000, //開發(fā)板上的時鐘MHz
parameter M=5_000_000???? ??????//待分頻的頻率
)
(clkin,clkout,rst_n);??? //0.1S->10Hz
input clkin,rst_n;
output reg clkout;
reg[WIDTH-1:0] cnt;
always @(posedge clkin,negedge rst_n) //50_000_000MHz
begin???????????????????????????????? //1s->1Hz 50_000_000/1=50_000_000/2=25_000_000
if(!rst_n)? cnt=0;
else if(cnt<N/(2*M)-1)? cnt=cnt+1;
else??????? cnt=0;
end
always @(posedge clkin,negedge rst_n)
begin
if(!rst_n)? clkout=0;
else if(cnt==N/(2*M)-1)? clkout=~clkout;
else clkout=clkout;
end
endmodule
數(shù)據(jù)選擇器:
`timescale 1 ps / 1 ps
// synopsys translate_on
module mux_04 (
data0x,
data1x,
data2x,
data3x,
sel,
result);
input?????? [7:0]? data0x;
input?????? [7:0]? data1x;
input?????? [7:0]? data2x;
input?????? [7:0]? data3x;
input?????? [1:0]? sel;
output???? [7:0]? result;
wire [7:0] sub_wire5;
wire [7:0] sub_wire4 = data3x[7:0];
wire [7:0] sub_wire3 = data2x[7:0];
wire [7:0] sub_wire2 = data1x[7:0];
wire [7:0] sub_wire0 = data0x[7:0];
wire [31:0] sub_wire1 = {sub_wire4, sub_wire3, sub_wire2, sub_wire0};
wire [7:0] result = sub_wire5[7:0];