找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10665|回复: 6
收起左侧

FPGA信号发生器设计 含程序原理图PCB 可产生正弦波 三角波 方波 幅度频率控制

  [复制链接]
ID:201155 发表于 2017-5-15 22:45 | 显示全部楼层 |阅读模式
FPGA信号发生器的顶层实体图如下:
0.png
上图为FPGA信号发生器顶层实体电路图,其中包括,矩阵键盘模块、频率主控制模块、相位累加器模块、LCD1602显示器模块、波形数据存储模块ROM、信号选择器模块、幅度调制模块、频率调制模块。以上每个模块都是由程序模块生成。下面对各个模块的功能和程序进行介绍.vhdl和veriligHDL程序都有.可产生正弦波 三角波 方波

keynum[0]按下切换4个波形输出.JPG 方波仿真输出.jpg 幅度控制.jpg 锯齿波.png 三角波仿真输出.jpg 三种波形的仿真输出.jpg 正弦波仿真输出.jpg 正弦波频率可调,KEYNUM3加,KEYNUM2减,.jpg 正弦波频率可调.jpg

Altium Designer画的FPGA信号发生器原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

verilog源程序如下:
  1. module control(CLK,reset,//时钟和复位
  2.                                 keynum,//按键值输入
  3.                                 freq_data,//频率控制字输出
  4.                                 vol_ctrl,//电压输出
  5.                                 show_vol_ctrl,//显示电压输出
  6.                                 WAVE_MODE,//波形选择输出
  7.                                 show_freq//频率显示
  8.                                 );
  9. input CLK,reset; //

  10. input [3:0]keynum;
  11. output[7:0]show_vol_ctrl,vol_ctrl;
  12. output [31:0]freq_data;
  13. output [2:0]WAVE_MODE;
  14. output [27:0]show_freq;
  15. reg [31:0]freq_data;
  16. reg [27:0]show_freq;
  17. reg [31:0]fre_reg;  //INIT
  18. reg [2:0]WAVE_MODE=3'b000;
  19. reg[7:0]show_vol_ctrl,vol_ctrl;
  20. reg[2:0]cnt;
  21. reg keyup_flag;
  22. reg [2:0]state=3'b000;//状态控制
  23. reg[7:0]vol_ctrl_reg;
  24. always @(posedge CLK or negedge reset )//控制进程
  25. begin
  26.    if(!reset) begin
  27.       fre_reg<=32'h00000000;
  28.       vol_ctrl<=3'b000;//幅度控制
  29.       show_freq=27'h0002000;//复位后显示2000HZ
  30.       keyup_flag =1'b0; //按键按下标志
  31.       state<=3'b000;//默认进入状态转换控制状态
  32.       WAVE_MODE=3'b000;
  33.       freq_data<= 32'h00029f18;//默认输出2000HZ--1718->20hz,20 000->1718*1000=1718000=x"001a36f0"  --29f18=2000
  34.       vol_ctrl<=68;//幅度控制
  35.       vol_ctrl_reg<=8'h68;
  36.       show_vol_ctrl<=8'h68;
  37.     end
  38.    else  begin
  39.      case (state)
  40.         3'b000: begin//状态 0
  41.                   fre_reg<=32'h00000000;
  42.                   vol_ctrl<=3'b000;//幅度控制
  43.                   show_freq=27'h0002000;//复位后显示2000HZ
  44.                   keyup_flag =1'b0; //按键按下标志
  45.                   state<=3'b010;//默认进入状态转换控制状态
  46.                   WAVE_MODE=3'b000;
  47.                   freq_data<= 32'h00029f18;//默认输出2000HZ--1718->20hz,20 000->1718*1000=1718000=x"001a36f0"  --29f18=2000
  48.                   vol_ctrl<=68;//幅度控制
  49.                   vol_ctrl_reg<=8'h68;
  50.                   show_vol_ctrl<=8'h68;
  51.         end
  52.         3'b101: begin//状态1 实现频率的输入 按A键确认输入
  53.                          if (keynum==4'b1111 )  keyup_flag =1'b1; //判断按键是否松开
  54.                          else begin
  55.                                   if(keyup_flag==1'b1) begin
  56.                                                 if(keynum<4'b1010 )begin //按下的按键小于10
  57.                                                    show_freq=show_freq<<4; //显示器移位
  58.                                                    show_freq[3:0]=keynum;
  59.                                                         keyup_flag =1'b0;
  60.                                                    end
  61.                                                  else if(keynum==4'b1010)//A  ok确认输入频率
  62.                                                     begin
  63.                                                     keyup_flag =1'b0;
  64.                                                     cnt=0;
  65.                                                     state<=3'b001;//跑去下一个状态
  66.                                                     fre_reg<=32'h00000000;
  67.                                                     end
  68.                                                   else if(keynum==4'b1011)//* select wave out  b选择波形输出
  69.                                                     begin
  70.                                                    
  71.                                                     WAVE_MODE=WAVE_MODE+1'b1;
  72.                                                     if(WAVE_MODE==3'b100) WAVE_MODE=3'b000;
  73.                                                     keyup_flag =1'b0;
  74.                                                     end
  75.                                      end
  76.                   end
  77.           end
  78.          3'b001: begin//状态2 计算频率控制字
  79.              case(cnt)
  80.                   0:begin fre_reg<=show_freq[27:24]*1000000;cnt=cnt+1'b1; end
  81.                   1:begin fre_reg<=fre_reg+show_freq[23:20]*100000;cnt=cnt+1'b1; end
  82.                   2:begin fre_reg<=fre_reg+show_freq[19:16]*10000;cnt=cnt+1'b1; end
  83.                   3:begin fre_reg<=fre_reg+show_freq[15:12]*1000;cnt=cnt+1'b1; end
  84.                   4:begin fre_reg<=fre_reg+show_freq[11:8]*100;cnt=cnt+1'b1; end
  85.                   5:begin fre_reg<=fre_reg+show_freq[7:4]*10;cnt=cnt+1'b1; end
  86.                   6:begin fre_reg<=fre_reg+show_freq[3:0];cnt=cnt+1'b1; end
  87.                   7:begin   freq_data<=fre_reg*86;//(2^(32))/50000000=85.89==86,,;2^n/50M
  88.                     cnt=cnt+1'b1;
  89.                     state<=3'b010;//完成频率输入跳回
  90.                     end
  91.                   endcase        
  92.           end
  93.           3'b010:begin//状态三 控制状态的转换状态转换控制状态
  94.                      if (keynum==4'b1111 )  keyup_flag =1'b1;//按键松开
  95.                      else begin
  96.                      if(keyup_flag==1'b1) begin
  97.                                                         if(keynum==4'b1010 )begin //a  freq 确认按键按下,进入输入频率状态
  98.                                                                          state<=3'b101;
  99.                                                                          keyup_flag =1'b0;
  100.                                                                         show_freq=23'h000000;
  101.                                                                    end
  102.                                                           else if(keynum==4'b1100 )begin //c  vol C按下,进入输入幅度状态
  103.                                                                          state<=3'b011;//调节幅度
  104.                                                                          keyup_flag =1'b0;
  105.                                                                          show_vol_ctrl<=8'h00;//清0显示
  106.                                                                    end
  107.                                                          else if(keynum==4'b1011)//* select wave out B按下,波形选择输出
  108.                                                                         begin
  109.                                                                   
  110.                                                                         WAVE_MODE=WAVE_MODE+1'b1;
  111.                                                                         if(WAVE_MODE==3'b100) WAVE_MODE=3'b000;
  112.                                                                         keyup_flag =1'b0;
  113.                                                                         end
  114.                           end
  115.                   end
  116.           end
  117.           3'b011:begin//幅度调节
  118.                    //show_vol_ctrl<=vol_ctrl_reg;//显示
  119.                    if (keynum==4'b1111 )  keyup_flag =1'b1;
  120.                    else begin
  121.                      if(keyup_flag==1'b1) begin
  122.                                                                 if(keynum<4'b1010 )begin // 小于10的数按下
  123.                                                                            show_vol_ctrl=show_vol_ctrl<<4; //左移
  124.                                                                            show_vol_ctrl[3:0]=keynum;//按键值输入
  125.                                                                                 keyup_flag =1'b0;
  126.                                                                            end
  127.                                                            else if(keynum==4'b1100 )begin //c  vol C按下,确认更改
  128.                                                                                  //state<=3'b010;
  129.                                                                                  keyup_flag =1'b0;
  130.                                                                                  //vol_ctrl<=vol_ctrl_reg; //送出更改的数据
  131.                                                                                  cnt=0;
  132.                                                                                  state<=3'b100;//跑去下一个状态
  133.                                                    
  134.                                                                            end
  135.                                                                 else if(keynum==4'b1011)//* select wave out B按下,改变波形
  136.                                                                                 begin
  137.                                                                            
  138.                                                                                 WAVE_MODE=WAVE_MODE+1'b1;
  139.                                                                                 if(WAVE_MODE==3'b110) WAVE_MODE=3'b000;
  140.                                                                                 keyup_flag =1'b0;
  141.                                                                  end
  142.                       end
  143.                    end
  144.          
  145.           end
  146.           3'b100:begin //
  147.                           case(cnt)
  148.                                           0:begin vol_ctrl_reg<=show_vol_ctrl[7:4]*10;cnt=cnt+1'b1; end
  149.                                           1:begin vol_ctrl_reg<=vol_ctrl_reg+show_vol_ctrl[3:0];cnt=cnt+1'b1; end
  150.                                           2:begin  cnt=cnt+1'b1;
  151.                                                  state<=3'b010;//完成幅度输入跳回控制状态
  152.                                                  vol_ctrl<=vol_ctrl_reg; //送出更改的数据
  153.                                             end
  154.                           endcase        
  155.           end
  156.          default:  state<=3'b000;
  157.      endcase
  158.   end

  159. end
  160. endmodule
复制代码

0.png
所有资料51hei提供下载:
V9.zip (12.14 MB, 下载次数: 311)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2017-5-16 02:18 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:400046 发表于 2018-12-23 20:58 | 显示全部楼层
#在这里快速回复#verilog文件没法看
回复

使用道具 举报

ID:468708 发表于 2019-2-1 16:33 | 显示全部楼层
无法编译,编译错误。
回复

使用道具 举报

ID:502774 发表于 2019-5-23 21:47 来自手机 | 显示全部楼层
可以可以。fpga真的不错。速度很快
回复

使用道具 举报

ID:502774 发表于 2019-5-24 11:29 | 显示全部楼层
好资料
回复

使用道具 举报

ID:502774 发表于 2020-4-11 23:50 来自手机 | 显示全部楼层
我又来了明天下载试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表