FPGA信號發生器的頂層實體圖如下:
0.png (361.63 KB, 下載次數: 99)
下載附件
2017-5-16 02:02 上傳
上圖為FPGA信號發生器頂層實體電路圖,其中包括,矩陣鍵盤模塊、頻率主控制模塊、相位累加器模塊、LCD1602顯示器模塊、波形數據存儲模塊ROM、信號選擇器模塊、幅度調制模塊、頻率調制模塊。以上每個模塊都是由程序模塊生成。下面對各個模塊的功能和程序進行介紹.vhdl和veriligHDL程序都有.可產生正弦波 三角波 方波
keynum[0]按下切換4個波形輸出.JPG (209.87 KB, 下載次數: 102)
下載附件
2017-5-16 02:03 上傳
方波仿真輸出.jpg (411.44 KB, 下載次數: 96)
下載附件
2017-5-16 02:03 上傳
幅度控制.jpg (624.16 KB, 下載次數: 94)
下載附件
2017-5-16 02:03 上傳
鋸齒波.png (13.98 KB, 下載次數: 107)
下載附件
2017-5-16 02:03 上傳
三角波仿真輸出.jpg (300.13 KB, 下載次數: 122)
下載附件
2017-5-16 02:03 上傳
三種波形的仿真輸出.jpg (342 KB, 下載次數: 109)
下載附件
2017-5-16 02:03 上傳
正弦波仿真輸出.jpg (392.42 KB, 下載次數: 121)
下載附件
2017-5-16 02:03 上傳
正弦波頻率可調,KEYNUM3加,KEYNUM2減,.jpg (382.38 KB, 下載次數: 107)
下載附件
2017-5-16 02:03 上傳
正弦波頻率可調.jpg (382.38 KB, 下載次數: 106)
下載附件
2017-5-16 02:03 上傳
Altium Designer畫的FPGA信號發生器原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (60 KB, 下載次數: 95)
下載附件
2017-5-16 02:04 上傳
0.png (55.56 KB, 下載次數: 93)
下載附件
2017-5-16 02:04 上傳
verilog源程序如下:
- module control(CLK,reset,//時鐘和復位
- keynum,//按鍵值輸入
- freq_data,//頻率控制字輸出
- vol_ctrl,//電壓輸出
- show_vol_ctrl,//顯示電壓輸出
- WAVE_MODE,//波形選擇輸出
- show_freq//頻率顯示
- );
- input CLK,reset; //
- input [3:0]keynum;
- output[7:0]show_vol_ctrl,vol_ctrl;
- output [31:0]freq_data;
- output [2:0]WAVE_MODE;
- output [27:0]show_freq;
- reg [31:0]freq_data;
- reg [27:0]show_freq;
- reg [31:0]fre_reg; //INIT
- reg [2:0]WAVE_MODE=3'b000;
- reg[7:0]show_vol_ctrl,vol_ctrl;
- reg[2:0]cnt;
- reg keyup_flag;
- reg [2:0]state=3'b000;//狀態控制
- reg[7:0]vol_ctrl_reg;
- always @(posedge CLK or negedge reset )//控制進程
- begin
- if(!reset) begin
- fre_reg<=32'h00000000;
- vol_ctrl<=3'b000;//幅度控制
- show_freq=27'h0002000;//復位后顯示2000HZ
- keyup_flag =1'b0; //按鍵按下標志
- state<=3'b000;//默認進入狀態轉換控制狀態
- WAVE_MODE=3'b000;
- freq_data<= 32'h00029f18;//默認輸出2000HZ--1718->20hz,20 000->1718*1000=1718000=x"001a36f0" --29f18=2000
- vol_ctrl<=68;//幅度控制
- vol_ctrl_reg<=8'h68;
- show_vol_ctrl<=8'h68;
- end
- else begin
- case (state)
- 3'b000: begin//狀態 0
- fre_reg<=32'h00000000;
- vol_ctrl<=3'b000;//幅度控制
- show_freq=27'h0002000;//復位后顯示2000HZ
- keyup_flag =1'b0; //按鍵按下標志
- state<=3'b010;//默認進入狀態轉換控制狀態
- WAVE_MODE=3'b000;
- freq_data<= 32'h00029f18;//默認輸出2000HZ--1718->20hz,20 000->1718*1000=1718000=x"001a36f0" --29f18=2000
- vol_ctrl<=68;//幅度控制
- vol_ctrl_reg<=8'h68;
- show_vol_ctrl<=8'h68;
- end
- 3'b101: begin//狀態1 實現頻率的輸入 按A鍵確認輸入
- if (keynum==4'b1111 ) keyup_flag =1'b1; //判斷按鍵是否松開
- else begin
- if(keyup_flag==1'b1) begin
- if(keynum<4'b1010 )begin //按下的按鍵小于10
- show_freq=show_freq<<4; //顯示器移位
- show_freq[3:0]=keynum;
- keyup_flag =1'b0;
- end
- else if(keynum==4'b1010)//A ok確認輸入頻率
- begin
- keyup_flag =1'b0;
- cnt=0;
- state<=3'b001;//跑去下一個狀態
- fre_reg<=32'h00000000;
- end
- else if(keynum==4'b1011)//* select wave out b選擇波形輸出
- begin
-
- WAVE_MODE=WAVE_MODE+1'b1;
- if(WAVE_MODE==3'b100) WAVE_MODE=3'b000;
- keyup_flag =1'b0;
- end
- end
- end
- end
- 3'b001: begin//狀態2 計算頻率控制字
- case(cnt)
- 0:begin fre_reg<=show_freq[27:24]*1000000;cnt=cnt+1'b1; end
- 1:begin fre_reg<=fre_reg+show_freq[23:20]*100000;cnt=cnt+1'b1; end
- 2:begin fre_reg<=fre_reg+show_freq[19:16]*10000;cnt=cnt+1'b1; end
- 3:begin fre_reg<=fre_reg+show_freq[15:12]*1000;cnt=cnt+1'b1; end
- 4:begin fre_reg<=fre_reg+show_freq[11:8]*100;cnt=cnt+1'b1; end
- 5:begin fre_reg<=fre_reg+show_freq[7:4]*10;cnt=cnt+1'b1; end
- 6:begin fre_reg<=fre_reg+show_freq[3:0];cnt=cnt+1'b1; end
- 7:begin freq_data<=fre_reg*86;//(2^(32))/50000000=85.89==86,,;2^n/50M
- cnt=cnt+1'b1;
- state<=3'b010;//完成頻率輸入跳回
- end
- endcase
- end
- 3'b010:begin//狀態三 控制狀態的轉換狀態轉換控制狀態
- if (keynum==4'b1111 ) keyup_flag =1'b1;//按鍵松開
- else begin
- if(keyup_flag==1'b1) begin
- if(keynum==4'b1010 )begin //a freq 確認按鍵按下,進入輸入頻率狀態
- state<=3'b101;
- keyup_flag =1'b0;
- show_freq=23'h000000;
- end
- else if(keynum==4'b1100 )begin //c vol C按下,進入輸入幅度狀態
- state<=3'b011;//調節幅度
- keyup_flag =1'b0;
- show_vol_ctrl<=8'h00;//清0顯示
- end
- else if(keynum==4'b1011)//* select wave out B按下,波形選擇輸出
- begin
-
- WAVE_MODE=WAVE_MODE+1'b1;
- if(WAVE_MODE==3'b100) WAVE_MODE=3'b000;
- keyup_flag =1'b0;
- end
- end
- end
- end
- 3'b011:begin//幅度調節
- //show_vol_ctrl<=vol_ctrl_reg;//顯示
- if (keynum==4'b1111 ) keyup_flag =1'b1;
- else begin
- if(keyup_flag==1'b1) begin
- if(keynum<4'b1010 )begin // 小于10的數按下
- show_vol_ctrl=show_vol_ctrl<<4; //左移
- show_vol_ctrl[3:0]=keynum;//按鍵值輸入
- keyup_flag =1'b0;
- end
- else if(keynum==4'b1100 )begin //c vol C按下,確認更改
- //state<=3'b010;
- keyup_flag =1'b0;
- //vol_ctrl<=vol_ctrl_reg; //送出更改的數據
- cnt=0;
- state<=3'b100;//跑去下一個狀態
-
- end
- else if(keynum==4'b1011)//* select wave out B按下,改變波形
- begin
-
- WAVE_MODE=WAVE_MODE+1'b1;
- if(WAVE_MODE==3'b110) WAVE_MODE=3'b000;
- keyup_flag =1'b0;
- end
- end
- end
-
- end
- 3'b100:begin //
- case(cnt)
- 0:begin vol_ctrl_reg<=show_vol_ctrl[7:4]*10;cnt=cnt+1'b1; end
- 1:begin vol_ctrl_reg<=vol_ctrl_reg+show_vol_ctrl[3:0];cnt=cnt+1'b1; end
- 2:begin cnt=cnt+1'b1;
- state<=3'b010;//完成幅度輸入跳回控制狀態
- vol_ctrl<=vol_ctrl_reg; //送出更改的數據
- end
- endcase
- end
- default: state<=3'b000;
- endcase
- end
-
- end
- endmodule
-
復制代碼
0.png (54.76 KB, 下載次數: 96)
下載附件
2017-5-16 02:07 上傳
所有資料51hei提供下載:
V9.zip
(12.14 MB, 下載次數: 338)
2017-5-15 22:41 上傳
點擊文件名下載附件
基于單片機的信號發生器設計 下載積分: 黑幣 -5
|