FPGA信号发生器的顶层实体图如下:
上图为FPGA信号发生器顶层实体电路图,其中包括,矩阵键盘模块、频率主控制模块、相位累加器模块、LCD1602显示器模块、波形数据存储模块ROM、信号选择器模块、幅度调制模块、频率调制模块。以上每个模块都是由程序模块生成。下面对各个模块的功能和程序进行介绍.vhdl和veriligHDL程序都有.可产生正弦波 三角波 方波
Altium Designer画的FPGA信号发生器原理图和PCB图如下:(51hei附件中可下载工程文件)
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
-
复制代码
所有资料51hei提供下载:
V9.zip
(12.14 MB, 下载次数: 338)
|