本文主要是介绍基于FPGA的DDS在安路TD和EG4A20BG256上的实现(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 文章目录
- 前言
- 一、初始配置
- 二、运行和烧录上板实现
前言
TangDynasty(TD)软件是安路科技自主开发的FPGA集成开发环境,支持工业界标准的设计输入,包含完整的电路优化流程以及丰富的分析与调试工具,并提供良好的第三方设计验证工具接口,为所有基于安路科技FPGA产品的应用设计提供有力支持。
本文介绍在安路TD软件上实现基于FPGA的DDS信号发生器。
本设计使用大科电子工作室的FA301开发板,核心芯片为安路科技EG4A20BG256
一、初始配置
(软件下载安装见主页)
1、打开TD软件,建立新工程
2、选择使用器件,设置工程的存放位置和名字
这里我们使用的是安路开发的EG4系列芯片EG4A20BG256。
3、新建工程完成
4、新建IP核
选择Primitive IP——Memory——ROM
给IP器件配置参数,导入.mif文件,.mif文件的生成方法见下文(见第五步)
这里选择.v文件,点击Yes,IP核就建立好了
根据上述步骤添加分别正弦波、方波、三角波、锯齿波的IP核,添加完成后如下图
5、生成.mif文件
这里推荐使用mif生成器Mif_Maker2010
下载地址与使用说明
下载完成后打开Mif_Maker2010
设置全局参数
设置无符号10进制数据,数据位宽12位,长度4096
以生成正弦波的.mif文件为例
保存.mif文件(这里不要选用另存为,会无法保存数据)
选择保存显示的就是另存为,放在刚才建立的工程文件下al_ip文件里
按照以上步骤分别生成正弦波、方波、三角波、锯齿波.mif文件,生成完成后如下图
6、新建.v文件,编写程序
设置程序文件为顶层文件
程序DDS.v代码如下
module DDS(input clk,input rst_n,input [1:0] Mode_Sel,input [1:0] fword_sel, output DA_clk,output reg [11:0] Data);reg [31:0] r_fword;reg [11:0] r_pword;reg [31:0] cnt;wire [11:0] rom_addr;wire[11:0] rom_addr1;wire[11:0] rom_addr2;wire[11:0] rom_addr3;wire[11:0] rom_addr4;always@(posedge clk or negedge rst_n)beginif(!rst_n) beginr_pword <= 0;endelse beginr_pword <= 2048; //这里时相位控制,单通道设计可以忽略endendalways@(posedge clk or negedge rst_n)if(!rst_n)cnt <= 32'd0;elsecnt <= cnt +r_fword;assign rom_addr = cnt[31:20] + r_pword;assign rom_addr1 = cnt[31:20] + r_pword;assign rom_addr2 = cnt[31:20] + r_pword;assign rom_addr3 = cnt[31:20] + r_pword;assign rom_addr4 = cnt[31:20] + r_pword; assign DA_clk=clk;//例化不同的波形IP核
wire [11:0]Data_sin,Data_sin1,Data_square,Data_triangular,Data_sawtooth_wave;sine_wave sine_DDS(.clka(clk), // input wire clka.addra(rom_addr), // input wire [11 : 0] addra.doa(Data_sin) // output wire [11 : 0] douta
);//正弦triangular_wave triangular_DDS(.clka(clk), // input wire clka.addra(rom_addr1), // input wire [11 : 0] addra.doa(Data_triangular) // output wire [11 : 0] douta
);//三角
square_wave square_DDS(.clka(clk), // input wire clka.addra(rom_addr2), // input wire [11 : 0] addra.doa(Data_square) // output wire [11 : 0] douta
);//方波sawtooth_wave sawtooth_wave_DDS(.clka(clk), // input wire clka.addra(rom_addr3), // input wire [11 : 0] addra.doa(Data_sawtooth_wave) // output wire [11 : 0] douta
);//锯齿//频率的切换 always@(*)case(fword_sel)0:r_fword=8590;//100HZ 001:r_fword=85899;//1000HZ 012:r_fword=858993;//10KHZ 10 3:r_fword=8589935;//100KHZ 11endcase
//波形的切换always@(*)case(Mode_Sel)0:Data=Data_sin;//正弦波001:Data=Data_square;//方波012:Data=Data_triangular;//三角波103:Data=Data_sawtooth_wave;//锯齿波11endcaseendmodule
代码中频率变换参考这篇博文 DDS频率变换 ,本设计时钟位为50MHz。
程序中例化IP核名字与之前新建IP核设置的要保持一致。
7、管脚配置
管脚配置有两种方法,一种是编写添加.adc约束文件,另一种是通过图形界面进行配置,这里用第一种方法。
管脚配置约束文件wave_produce.adc内程序如下
set_pin_assignment { Mode_Sel[0] } { LOCATION = M15; }
set_pin_assignment { Mode_Sel[1] } { LOCATION = N13; }
set_pin_assignment { clk } { LOCATION = E1; }
set_pin_assignment { fword_sel[0] } { LOCATION = E16; }
set_pin_assignment { fword_sel[1] } { LOCATION = M16; }
set_pin_assignment { rst_n } { LOCATION = virtualIO; }set_pin_assignment { DA_clk } { LOCATION = M9; }
set_pin_assignment { Data[0] } { LOCATION = B7; }
set_pin_assignment { Data[10] } { LOCATION = L9; }
set_pin_assignment { Data[11] } { LOCATION = L10; }
set_pin_assignment { Data[1] } { LOCATION = A6; }
set_pin_assignment { Data[2] } { LOCATION = B6; }
set_pin_assignment { Data[3] } { LOCATION = A5; }
set_pin_assignment { Data[4] } { LOCATION = N2; }
set_pin_assignment { Data[5] } { LOCATION = P6; }
set_pin_assignment { Data[6] } { LOCATION = M8; }
set_pin_assignment { Data[7] } { LOCATION = N8; }
set_pin_assignment { Data[8] } { LOCATION = P8; }
set_pin_assignment { Data[9] } { LOCATION = K9; }
第二种方法 通过图形界面进行配置方法如下:
只需要需要改界面中的Location即可
二、运行和烧录上板实现
(与modelsim的联合仿真见主页)
1、运行程序
运行完成
2、连接硬件
开发板FA301
DAC和转接线
开发板扩展口原理图如下,可对照管脚配置进行连线
因为使用DAC是8位,我们程序数据设置为12位,所以舍弃低四位,即D0—D3不必连线。
连接图如下
3、烧录程序
下载程序模式可以选择JTAG和Program Flash,JTAG模式断电不保存程序,Program Flash模式断电后仍保存程序
添加bit流程序
烧录成功
4、示波器看结果
设计实现通过按键切换锯齿波、方波、三角波、正弦波四种100kHz的波形,按键控制波形频率的变换,下面展示部分波形图
频率变换
1KHz
10KHz
100Hz
至此,本设计全部结束。如有问题,欢迎提出。
这篇关于基于FPGA的DDS在安路TD和EG4A20BG256上的实现(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!