找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3907|回复: 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. //clk:时钟信号
  42. //reset:复位信号
  43. //sin_out:正弦波输出
  44. Module sin(clk,reset,sin_out);
  45.         Input clk,reset;
  46.         output[7:0]sin_out;
  47.         reg[7:0]sin_out;
  48.         reg[6:0]num;
  49.         always@(posedge clk or posedge reset)
  50.                 begin
  51.                         if(reset)
  52.                                 sin_out<=0;
  53.                         else if(num==63)     //共需要64个点
  54.                                 num<=0;
  55.                         else
  56.                                 num<=num+1;
  57.                         case(num)         //每个点一一对应的数据
  58.                                 0:sin_out<=255;
  59.                 1:sin_out<=254;
  60.                 2:sin_out<=252;
  61.                 3:sin_out <=249;
  62.                 4:sin_out <=245;
  63.       5:sin_out<= 239;
  64.                 6:sin_out <= 23;
  65.                 7:sin_out<= 225;
  66.                 8:sin_out<=217;
  67.                 9:sin_ out <=207;
  68.                 10:sin out<=197;
  69.                 11:sin out<= 186;
  70.                 12:sin out <=174;
  71.                 13:sin_out<=162;
  72.                 14:sin_out<=150;
  73.                 15:sin_out<=137;
  74.                 16:sin_out<=124;
  75.                 17:sin_out<=112;
  76.                 18:sin_out<=99;
  77.                 19:sin_out<=87;
  78.                 20:sin_out<=75;
  79.                 21:sin_out<=64;
  80.                 22:sin_out<=53;
  81.                 23:sin_out<=43;
  82.                 24:sin_out<=34;
  83.                 25:sin_out<=26
  84.                26:sin_out<=19;
  85. 27:sin_out<=13;
  86. 28:sin_out<=8;
  87.                29:sin_out<=4;
  88.                30:sin_out<=1;
  89.                31:sin_out<=0;
  90.                32:sin_out<=0;
  91.                33:sin_out<=1;
  92.                34:sin_out<=4;
  93.                35:sin_out<=8;
  94.                36:sin_out<=13;
  95.                37:sin_out<=19;
  96.                38:sin_out<=26;
  97.                39:sin_out<=34;
  98.                40:sin_out<=43;
  99.                41:sin_out<=53;
  100.                42:sin_out<=64;
  101.                43:sin_out<=75;
  102.                44:sin_out<=87;
  103.                45:sin_out<=99;
  104.                46:sin_out<=112;
  105.                47:sin_out<=124;
  106.                48:sin_out<=137;
  107.                49:sin_out<=150;
  108.                50:sin_out<=l62;
  109.                51:sin_out<=174;
  110.                52:sin_out<=186;
  111.                53:sin_out<=197;
  112.                54:sin_out<=207;
  113.                55:sin_out<=217;
  114.                56:sin_out<=225;
  115.                57:sin_out<=233;
  116.                58:sin_out<=239;
  117.                59:sin_out<=245;
  118.                60:sin_out<= 249;
  119.                61:sin_out <= 252;
  120.                62:sin_out <= 254;
  121.                63:sin_out <= 255;
  122.                default:sin_ out<=8 'bx;
  123.             endcase
  124.          end
  125. endmodule


  126. //clk:时钟信号
  127. //reset:复位信号
  128. //square:方波输出
  129. module square( clk,reset,square_out) ;
  130.    input clk,reset;
  131.    output[7:0] square_ out;
  132.    reg[7:0] square_out;
  133.    reg[5:0] num;
  134.    reg reg_2;
  135. always @( posedge clk or posedge reset)
  136.    begin
  137.       if( reset)
  138.        reg_2<=0;  //当复位信号为1时,输出为0
  139.       else if(num<31)//分频
  140. else
  141.          begin
  142. num<=0;
  143. reg 2<=~reg_ 2;
  144. end
  145. case(reg_2)
  146. 1:squae _out<=255;
  147. 0:square_out <=0;
  148. endcase
  149. end
  150. endmodule

  151. 控制模式
  152. //triangle_ctrl:三角波控制信号
  153. //sin_ctrl:正弦波控制信号
  154. //square_ctrl:方波控制信号
  155. // triangle:三角波
  156. //sin:正弦波
  157. //square:方波
  158. //wave_out:输出波形
  159. module control( triangle _ctrl ,sin_ ctrl, square_ctrl,triangle,sin, square,wave_out);
  160. input triangle_ ctrl ,sin _ctrl ,square ctrl;
  161. input[ 7:0] triangle,sin,square;
  162. output[ 7:0] wave_out;
  163. reg[ 7:0] wave_ out;
  164. reg[2:0]sel;
  165. reg[9:0] a,b,c,d,e;
  166. always@( triangle_ctrl or sin_ctrl or square_ctrl or triangle or sin or square)
  167.    begin
  168.      sel={triangle_ctrl,sin_ctrl,sqpuare_ctrl };  //控制信号
  169. case(sel)
  170. 3'b100:wave_out=triangle;
  171. 3'b010:wave_out=sin;
  172. 3'b001:wave_out=square;
  173. 3'b011:     //方波和正弦波的线性组合
  174.        begin
  175.          a= triangle + sin;
  176.          wave_out=a[8:1];
  177. end
  178. 3'b101:    //三角波和方波的线性组合
  179.        begin
  180.          a = triangle + square;
  181.          wave_ out=a[8:1];
  182.        end
  183. 3 'b110:    //三角波和正弦波的线性组合
  184.       begin
  185.         a= square + sin;
  186.         wave_ out=a[8:1];
  187.       end
  188. 3'b111:      //三角波、正弦波和方波的线性组合
  189.       begin
  190.         a= triangle + square;
  191.         b=a + sin;
  192.         c=b[9:2];
  193.         d=a[9:4];
  194.         e=a[9:6];
  195. a=c +d;
  196. b=a +e;
  197. wave_out=b[7:0];
  198.       end
  199. defalt:wave_ out=8 'bx;
  200.    endcase
  201. end
  202. endmodule



  203. //clk:系统时钟信号
  204. //reset:复位信号
  205. //p:频率调节信号,p=系统时钟频率/产生频率/2
  206. module div_ctrl(clk,p,clk_out,reset)
  207.   input clk,reset;
  208.   input[ 10:0] p ;
  209.   output clk_out;
  210.   reg clk_ out;
  211.   reg temp;
  212.   reg [10:0]  count ;
  213. always@(posedge clk or posedage reset)
  214.     begin
  215.       if( reset)clk_out<=0;//复位信号为1时,输出为0
  216.       else if(temp==0)
  217. begin
  218.            count<=p-1;
  219.            temp<=1;
  220. end
  221. else if(count==1)
  222. begin
  223. temp<=0;
  224. clk_out<=~clk_out;
  225.         end
  226. else
  227.        begin
  228. count <= count-1;
  229.        end
  230.   end
  231. endmodule

  232. module signal_gennerator(clk,reset,k,triangle,sin,square,wave);
  233.   input clk,reset;
  234.   input[10:0] k;
  235.   input triangle,sin,square;
  236.   output[7:0] wave;
  237.   wire[7:0] triangle_1,sin_1,square_1;
  238.   wire clk_1;
  239.   div_ctrl U1(.clk(clk),.reset(reset),.p(k),.clk_(clk_1));
  240.   control U2(.triangle_ctrl(triangle),.sin_ctrl(sin),.square_ctrl(square),.triangle(triangle_1),
  241. .sin(sin_1),.square(square_1),.wave_out(wave));
  242.   triangle U3(.clk(clk_1),.reset(reset),.triangle_out(triangle_1));
  243.   sin U4(.clk(clk_1),.reset(reset),.sin_out(sin_1));
  244.   square U5(.clk(clk_1),.reset(reset),.square_out(square_1));
  245. endmodule
复制代码


基于FPGA的信号发生器.docx

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

信号发生器

回复

使用道具 举报

ID:275826 发表于 2019-9-7 22:42 | 显示全部楼层
还是DDS有效
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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