FPGA设计——正弦信号发生器
概述
FPGA具有高度实时的特性。这里讨论基于FPGA设计一款简单的正弦信号发生器。
DDS原理
Direct Digital frequency Synthesis如下图所示:
3. DAC原理
这里DAC采用TLC5620,下面分别给出DAC的原理图和时序图。
4. ROM文件的生成
ROM波形可以通过MIF或HEX文件保存在FPGA的ram或rom模块中,也可以自己编写HDL文件存储。这里我们采用后者。
利用win-tc或matlab生产所需格式的函数数据,参考C代码如下:
#include"stdio.h"#include"math.h"#definePi3.1416#defineDEPTH256#defineLENTHDEPTH/2intmain(){FILE*fp;intj;unsignedchari=0;unsignedcharx=0;if((fp=fopen("d:\\sin.txt","w"))==NULL){printf("can'topenthisfile..\n");exit(0);}for(j=0;j<DEPTH;j++){x=(int)(LENTH+LENTH*sin(2*Pi*i/DEPTH-0.5*Pi));fprintf(fp,"'d%d:data='h%x;\n",i,x);i++;}fprintf(fp,"\n");fclose(fp);printf("success\n");return0;}
5. DAC控制逻辑设计
moduledac_ctrl(inputclk,inputrst_n,outputregdac_clk,outputregdac_load,outputregdac_ldac,outputregdac_dat,input[7:0]rom_dat,outputreg[7:0]rom_addr,input[7:0]freq_ctrl);//=====================================//ThefrequencyofclkisdividedbyNparameterbitsize=4;parameterN=20;reg[bitsize:0]cnt0;always@(posedgeclkornegedgerst_n)beginif(!rst_n)begincnt0<=0;dac_clk<=0;endelsebeginif(cnt0<(N/2-1))cnt0<=cnt0+1'b1;elsecnt0<=0;if(cnt0==0&&cnt1>=1&&cnt1<=4'hb)dac_clk<=~dac_clk;elsedac_clk<=dac_clk;endendwireclk_1M;assignclk_1M=(cnt0==0)?1'b1:1'b0;//======================================reg[3:0]cnt1;always@(posedgeclkornegedgerst_n)beginif(!rst_n)cnt1<=0;elseif(clk_1M)cnt1<=cnt1+1'b1;elsecnt1<=cnt1;endreg[7:0]cnt2;always@(posedgeclkornegedgerst_n)beginif(!rst_n)cnt2<=0;elseif(cnt1==4'hf)if(cnt2!=freq_ctrl)cnt2<=cnt2+1'b1;elsecnt2<=0;elsecnt2<=cnt2;endalways@(posedgeclkornegedgerst_n)beginif(!rst_n)rom_addr<=0;elseif(clk_1M&&cnt1==4'hf&&cnt2==freq_ctrl)rom_addr<=rom_addr+1'b1;elserom_addr<=rom_addr;endalways@(cnt1)begincase(cnt1)4'h2:begindac_dat<=1'b0;dac_load<=1'b1;dac_ldac<=1'b1;end4'h3:begindac_dat<=1'b0;dac_load<=1'b1;dac_ldac<=1'b1;end4'h4:begindac_dat<=1'b1;dac_load<=1'b1;dac_ldac<=1'b1;end4'h5:begindac_dat<=rom_dat[7];dac_load<=1'b1;dac_ldac<=1'b1;end4'h6:begindac_dat<=rom_dat[6];dac_load<=1'b1;dac_ldac<=1'b1;end4'h7:begindac_dat<=rom_dat[5];dac_load<=1'b1;dac_ldac<=1'b1;end4'h7:begindac_dat<=rom_dat[4];dac_load<=1'b1;dac_ldac<=1'b1;end4'h8:begindac_dat<=rom_dat[3];dac_load<=1'b1;dac_ldac<=1'b1;end4'h9:begindac_dat<=rom_dat[2];dac_load<=1'b1;dac_ldac<=1'b1;end4'ha:begindac_dat<=rom_dat[1];dac_load<=1'b1;dac_ldac<=1'b1;end4'hb:begindac_dat<=rom_dat[0];dac_load<=1'b1;dac_ldac<=1'b1;end4'hc:begindac_dat<=1'b0;dac_load<=1'b0;dac_ldac<=1'b1;end4'hd:begindac_dat<=1'bx;dac_load<=1'b1;dac_ldac<=1'b0;enddefault:begindac_dat<=1'bx;dac_load<=1'b1;dac_ldac<=1'b1;endendcaseendendmodule
6. 测试结果
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。