找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5185|回复: 1
打印 上一主题 下一主题
收起左侧

基于FPGA的信号发生器程序

[复制链接]
跳转到指定楼层
楼主
ID:440209 发表于 2018-12-5 23:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于FPGA的信号发生器
  1. 三角波
  2. //clk:时钟信号
  3. //reset:复位信号
  4. //triangle_out:三角波输出
  5. module triangle(clk,reset,triangle_out);
  6.   input clk,reset;
  7.   output[7:0] triangle_out;
  8.   reg[7:0] triangle_out;
  9.   reg[7:0] num;   //计数器
  10.   reg reg_1;      //加减控制器
  11.   always@(posedge clk or posedge rest)
  12. begin
  13.   if(reset)
  14.     num<=0;   //当复位信号为1时输出为0
  15.   else if(reg_1==0)
  16.    begin
  17.      if(num==8’b11111000)
  18.       begin
  19.         num<=255;
  20.         reg_1<=1;     //加至最大值,开始进行减法
  21.       end
  22.      else
  23.       num<=num+8;   //进行加8运算,取出32个点
  24.     end
  25.   else if(num==8’b00000111)
  26.     begin
  27.       num<=0;
  28.       reg_1<=0;       //准备进行加法
  29.     end
  30.   else
  31.     begin
  32.       num<=num-8;    //进行减8运算,需要取出32个点
  33.     end
  34. end
  35. always@(num)
  36.    begin
  37.      triangle_out<=num;//将取出的点输出,即可实现三角波
  38.    end
  39. endmodule
  40.  
  41. 正弦波
  42. //clk:时钟信号
  43. //reset:复位信号
  44. //sin_out:正弦波输出
  45. Module sin(clk,reset,sin_out);
  46.         Input clk,reset;
  47.         output[7:0]sin_out;
  48.         reg[7:0]sin_out;
  49.         reg[6:0]num;
  50.         always@(posedge clk or posedge reset)
  51.                 begin
  52.                         if(reset)
  53.                                 sin_out<=0;
  54.                         else if(num==63)     //共需要64个点
  55.                                 num<=0;
  56.                         else
  57.                                 num<=num+1;
  58.                         case(num)         //每个点一一对应的数据
  59.                                 0:sin_out<=255;
  60.                 1:sin_out<=254;
  61.                 2:sin_out<=252;
  62.                 3:sin_out <=249;
  63.                 4:sin_out <=245;
  64.       5:sin_out<= 239;
  65.                 6:sin_out <= 23;
  66.                 7:sin_out<= 225;
  67.                 8:sin_out<=217;
  68.                 9:sin_ out <=207;
  69.                 10:sin out<=197;
  70.                 11:sin out<= 186;
  71.                 12:sin out <=174;
  72.                 13:sin_out<=162;
  73.                 14:sin_out<=150;
  74.                 15:sin_out<=137;
  75.                 16:sin_out<=124;
  76.                 17:sin_out<=112;
  77.                 18:sin_out<=99;
  78.                 19:sin_out<=87;
  79.                 20:sin_out<=75;
  80.                 21:sin_out<=64;
  81.                 22:sin_out<=53;
  82.                 23:sin_out<=43;
  83.                 24:sin_out<=34;
  84.                 25:sin_out<=26
  85.                26:sin_out<=19;
  86. 27:sin_out<=13;
  87. 28:sin_out<=8;
  88.                29:sin_out<=4;
  89.                30:sin_out<=1;
  90.                31:sin_out<=0;
  91.                32:sin_out<=0;
  92.                33:sin_out<=1;
  93.                34:sin_out<=4;
  94.                35:sin_out<=8;
  95.                36:sin_out<=13;
  96.                37:sin_out<=19;
  97.                38:sin_out<=26;
  98.                39:sin_out<=34;
  99.                40:sin_out<=43;
  100.                41:sin_out<=53;
  101.                42:sin_out<=64;
  102.                43:sin_out<=75;
  103.                44:sin_out<=87;
  104.                45:sin_out<=99;
  105.                46:sin_out<=112;
  106.                47:sin_out<=124;
  107.                48:sin_out<=137;
  108.                49:sin_out<=150;
  109.                50:sin_out<=l62;
  110.                51:sin_out<=174;
  111.                52:sin_out<=186;
  112.                53:sin_out<=197;
  113.                54:sin_out<=207;
  114.                55:sin_out<=217;
  115.                56:sin_out<=225;
  116.                57:sin_out<=233;
  117.                58:sin_out<=239;
  118.                59:sin_out<=245;
  119.                60:sin_out<= 249;
  120.                61:sin_out <= 252;
  121.                62:sin_out <= 254;
  122.                63:sin_out <= 255;
  123.                default:sin_ out<=8 'bx;
  124.             endcase
  125.          end
  126. endmodule

  127.  
  128. //clk:时钟信号
  129. //reset:复位信号
  130. //square:方波输出
  131. module square( clk,reset,square_out) ;
  132.    input clk,reset;
  133.    output[7:0] square_ out;
  134.    reg[7:0] square_out;
  135.    reg[5:0] num;
  136.    reg reg_2;
  137. always @( posedge clk or posedge reset)
  138.    begin
  139.       if( reset)
  140.        reg_2<=0;  //当复位信号为1时,输出为0
  141.       else if(num<31)//分频
  142. else
  143.          begin
  144. num<=0;
  145. reg 2<=~reg_ 2;
  146. end
  147. case(reg_2)
  148. 1:squae _out<=255;
  149. 0:square_out <=0;
  150. endcase
  151. end
  152. endmodule
  153.  
  154. 控制模式
  155. //triangle_ctrl:三角波控制信号
  156. //sin_ctrl:正弦波控制信号
  157. //square_ctrl:方波控制信号
  158. // triangle:三角波
  159. //sin:正弦波
  160. //square:方波
  161. //wave_out:输出波形
  162. module control( triangle _ctrl ,sin_ ctrl, square_ctrl,triangle,sin, square,wave_out);
  163. input triangle_ ctrl ,sin _ctrl ,square ctrl;
  164. input[ 7:0] triangle,sin,square;
  165. output[ 7:0] wave_out;
  166. reg[ 7:0] wave_ out;
  167. reg[2:0]sel;
  168. reg[9:0] a,b,c,d,e;
  169. always@( triangle_ctrl or sin_ctrl or square_ctrl or triangle or sin or square)
  170.    begin
  171.      sel={triangle_ctrl,sin_ctrl,sqpuare_ctrl };  //控制信号
  172. case(sel)
  173. 3'b100:wave_out=triangle;
  174. 3'b010:wave_out=sin;
  175. 3'b001:wave_out=square;
  176. 3'b011:     //方波和正弦波的线性组合
  177.        begin
  178.          a= triangle + sin;
  179.          wave_out=a[8:1];
  180. end
  181. 3'b101:    //三角波和方波的线性组合
  182.        begin
  183.          a = triangle + square;
  184.          wave_ out=a[8:1];
  185.        end
  186. 3 'b110:    //三角波和正弦波的线性组合
  187.       begin
  188.         a= square + sin;
  189.         wave_ out=a[8:1];
  190.       end
  191. 3'b111:      //三角波、正弦波和方波的线性组合
  192.       begin
  193.         a= triangle + square;
  194.         b=a + sin;
  195.         c=b[9:2];
  196.         d=a[9:4];
  197.         e=a[9:6];
  198. a=c +d;
  199. b=a +e;
  200. wave_out=b[7:0];
  201.       end
  202. defalt:wave_ out=8 'bx;
  203.    endcase
  204. end
  205. endmodule



  206. //clk:系统时钟信号
  207. //reset:复位信号
  208. //p:频率调节信号,p=系统时钟频率/产生频率/2
  209. module div_ctrl(clk,p,clk_out,reset)
  210.   input clk,reset;
  211.   input[ 10:0] p ;
  212.   output clk_out;
  213.   reg clk_ out;
  214.   reg temp;
  215.   reg [10:0]  count ;
  216. always@(posedge clk or posedage reset)
  217.     begin
  218.       if( reset)clk_out<=0;//复位信号为1时,输出为0
  219.       else if(temp==0)
  220. begin
  221.            count<=p-1;
  222.            temp<=1;
  223. end
  224. else if(count==1)
  225. begin
  226. temp<=0;
  227. clk_out<=~clk_out;
  228.         end
  229. else
  230.        begin
  231. count <= count-1;
  232.        end
  233.   end
  234. endmodule
  235.  
  236. module signal_gennerator(clk,reset,k,triangle,sin,square,wave);
  237.   input clk,reset;
  238.   input[10:0] k;
  239.   input triangle,sin,square;
  240.   output[7:0] wave;
  241.   wire[7:0] triangle_1,sin_1,square_1;
  242.   wire clk_1;
  243.   div_ctrl U1(.clk(clk),.reset(reset),.p(k),.clk_(clk_1));
  244.   control U2(.triangle_ctrl(triangle),.sin_ctrl(sin),.square_ctrl(square),.triangle(triangle_1),
  245. .sin(sin_1),.square(square_1),.wave_out(wave));
  246.   triangle U3(.clk(clk_1),.reset(reset),.triangle_out(triangle_1));
  247.   sin U4(.clk(clk_1),.reset(reset),.sin_out(sin_1));
  248.   square U5(.clk(clk_1),.reset(reset),.square_out(square_1));
  249. endmodule
复制代码


基于FPGA的信号发生器.docx

15.97 KB, 下载次数: 41, 下载积分: 黑币 -5

信号发生器

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶顶 踩踩
回复

使用道具 举报

沙发
ID:275826 发表于 2019-9-7 22:42 | 只看该作者
还是DDS有效
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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