FPGA-使用ROM+DAC902输出任意波形

本系列为学习FPGA开发板的随笔~
使用FPGA:xlink artix-7 xc7A35T
开发环境:vivado2020.1

FPGA+DAC输出任意波形的步骤如下:
1.生成波形.coe文件
2.把波形文件存入FPGA的rom中
3.读取rom中的波形输出

1.生成波形.coe文件

在这里插入图片描述
利用波形数据生成器生成波形文件
FPGA-使用ROM+DAC902输出任意波形_第1张图片
因为DAC902是12位的数模转换器,这里数据位宽选择12位。数据长度选择128,也可选择其他,点保存可以生成.coe文件,这里命名为"sin128.coe"
FPGA-使用ROM+DAC902输出任意波形_第2张图片

2.把波形文件存入FPGA的rom中

在vivado中新建一个工程,然后添加IP Catalog中的Block Memory Generator模块,命名为da_rom1
FPGA-使用ROM+DAC902输出任意波形_第3张图片
在Part A Options中配置数据的宽度和长度为12与128,与生成的波形保持一致FPGA-使用ROM+DAC902输出任意波形_第4张图片
然后在Other Options中添加.coe文件,这里有提前把.coe文件保存到project_1/project_1.srcs/sources_1/sin128.coe目录下
FPGA-使用ROM+DAC902输出任意波形_第5张图片
点“ok”之后,配置好了rom

3.读取rom中的波形输出

首先配置pll
选择添加IP Catalog中的Clocking Wizard选择pll,命名为“da_pll”
FPGA-使用ROM+DAC902输出任意波形_第6张图片
clk_in1设置为50Mhz,也就是20ns
FPGA-使用ROM+DAC902输出任意波形_第7张图片
clk_out选择125Mhz,可生成2Mhz左右的波形信号
FPGA-使用ROM+DAC902输出任意波形_第8张图片
保存之后,我们添加design sources来编写顶层文件
FPGA-使用ROM+DAC902输出任意波形_第9张图片
这里把顶层文件命名为“DAC”
DAC代码如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/13 11:13:47
// Design Name: 
// Module Name: DAC
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module DAC(
//system clocks
	input                       sys_clk,
	input                       rst_n,
    output[11:0]                dac902_data,
    output                      dac902_clk
);

 wire dac_clk;
 wire[11:0] dac_data;
 reg[8:0] rom_addr;
 assign dac902_clk=dac_clk;
 assign dac902_data=dac_data;
 
 da_pll da_pll_m0
 (
	.clk_in1                    (sys_clk                  ),
	.clk_out1                   (dac_clk                  ),
	.reset                      (1'b0                     ),
	.locked                     (                         )
 );
 
always@(posedge dac_clk)
begin
	rom_addr <= rom_addr + 9'd1;
end
 da_rom1 da_rom1_m0 (
	.clka                       (dac_clk                 ),   
	.ena                        (1'b1                    ),     
	.addra                      (rom_addr                ), 
	.douta                      (dac_data                )  
);
endmodule


保存之后可以看见DAC.v自动置顶了
FPGA-使用ROM+DAC902输出任意波形_第10张图片
然后配置引脚和布线,添加constraints文件,命名为dac902.xdc
FPGA-使用ROM+DAC902输出任意波形_第11张图片
代码如下,这里的引脚布线可以自行设定,或者参考代码来连接

############## NET - IOSTANDARD ##################
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.CONFIG.UNUSEDPIN PULLUP [current_design]
#############SPI Configurate Setting##################
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] 
set_property CONFIG_MODE SPIx4 [current_design] 
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] 
############## clock and reset define##################
create_clock -period 20 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports {sys_clk}]
set_property PACKAGE_PIN Y18 [get_ports {sys_clk}]

set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]
set_property PACKAGE_PIN F20 [get_ports {rst_n}]
########DAC902 ON AX7035 J9##################
set_property PACKAGE_PIN F14 [get_ports {dac902_clk}]
set_property PACKAGE_PIN F13  [get_ports {dac902_data[11]}]
set_property PACKAGE_PIN E13 [get_ports {dac902_data[10]}]
set_property PACKAGE_PIN D15 [get_ports {dac902_data[0]}]
set_property PACKAGE_PIN D14  [get_ports {dac902_data[9]}]
set_property PACKAGE_PIN B13 [get_ports {dac902_data[1]}]
set_property PACKAGE_PIN C13 [get_ports {dac902_data[8]}]
set_property PACKAGE_PIN A14  [get_ports {dac902_data[2]}]
set_property PACKAGE_PIN A13  [get_ports {dac902_data[7]}]
set_property PACKAGE_PIN C15 [get_ports {dac902_data[3]}]
set_property PACKAGE_PIN C14  [get_ports {dac902_data[6]}]
set_property PACKAGE_PIN A16 [get_ports {dac902_data[4]}]
set_property PACKAGE_PIN A15 [get_ports {dac902_data[5]}]


set_property IOSTANDARD LVCMOS33 [get_ports {dac902_clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dac902_data[5]}]

然后编译下载到fpga上
FPGA-使用ROM+DAC902输出任意波形_第12张图片
示波器波形如下:
FPGA-使用ROM+DAC902输出任意波形_第13张图片

ps:DAC902具部分常数如下,相关原理图和资料在网上很好找。
FPGA-使用ROM+DAC902输出任意波形_第14张图片
相关工程和波形生成器下载链接如下
https://download.csdn.net/download/hongliyu_lvliyu/12619333

你可能感兴趣的:(FPGA)