advancedfunctionalmaterials投稿(FPGA基于ACM2108的DDS设计)
这次设计一个DDS信号发生器 。该设计的特点有:
双通道的DA输出 ,可以调节频率 、相位 、和波形(正弦波 、方波 、三角波) 。 拥有相位重置的功能 ,能够同时重置两个输出波形的相位 。
本次采用的是小梅哥的ACM2108模块 。该模块有两个通道的ADC和两个通道的DAC 。
本次设计的前置是DDS基本模块 ,具体可点击链接查看 。DDS基本模块在加入了装有正弦波数据的ROM的基础上 ,再添加三角波和方波的数据的ROM ,从而能够切换输出的波形 。
通过调用VIO这个IP核 ,设置输出信号的频率 、相位和波形 。
然后通过LIA这个IP核 ,去观察数据波形 。
一 、模块代码
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: GDUT // Engineer: Lclone // // Create Date: 2023/02/02 22:34:21 // Design Name: DDS_ACM2108 // Module Name: DDS_ACM2108 // Project Name: DDS_ACM2108 // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module DDS_ACM2108( input Clk, input Rst_n, output DA_Clk_ch1, output [7:0] DA_data_ch1, output DA_Clk_ch2, output [7:0] DA_data_ch2, output AD_Clk_ch1, input [7:0] AD_data_ch1, output AD_Clk_ch2, input [7:0] AD_data_ch2 ); wire Clk_125M; wire [31:0] Fword_ch1; wire [11:0] Pword_ch1; wire [ 1:0] mode_sel_ch1; wire [31:0] Fword_ch2; wire [11:0] Pword_ch2; wire [ 1:0] mode_sel_ch2; reg [7:0] AD_data_ch1_reg; reg [7:0] AD_data_ch2_reg; wire Wave_rst_p; always@(posedge Clk)begin AD_data_ch1_reg <= AD_data_ch1; AD_data_ch2_reg <= AD_data_ch2; end ila_0 ila_0_DA ( .clk(Clk_125M), // input wire clk .probe0(DA_data_ch1), // input wire [7:0] probe0 .probe1(DA_data_ch2) // input wire [7:0] probe1 ); ila_1 ila_1_AD_ch1 ( .clk(Clk), // input wire clk .probe0(AD_data_ch1) // input wire [7:0] probe0 ); ila_1 ila_1_AD_ch2 ( .clk(Clk), // input wire clk .probe0(AD_data_ch2) // input wire [7:0] probe0 ); clk_wiz_0 clk_wiz_0_inst ( // Clock out ports .clk_out1(Clk_125M), // output clk_out1 // Clock in ports .clk_in1(Clk)); // input clk_in1 DDS_Cmd_VIO DDS_Cmd_VIO_inst ( .clk(Clk_125M), // input wire clk .probe_out0(Fword_ch1), // output wire [31 : 0] probe_out0 .probe_out1(Pword_ch1), // output wire [11 : 0] probe_out1 .probe_out2(mode_sel_ch1), // output wire [1 : 0] probe_out2 .probe_out3(Fword_ch2), // output wire [31 : 0] probe_out3 .probe_out4(Pword_ch2), // output wire [11 : 0] probe_out4 .probe_out5(mode_sel_ch2), // output wire [1 : 0] probe_out5 .probe_out6(Wave_rst_p) // output wire [1 : 0] probe_out5 ); DDS_Base DDS_Base_ch1( .Clk (Clk_125M), .Rst_n (Rst_n & ~Wave_rst_p), .Fword (Fword_ch1), .Pword (Pword_ch1), .mode_sel (mode_sel_ch1), .DA_Clk (DA_Clk_ch1), .Signal_data (DA_data_ch1) ); DDS_Base DDS_Base_ch2( .Clk (Clk_125M), .Rst_n (Rst_n & ~Wave_rst_p), .Fword (Fword_ch2), .Pword (Pword_ch2), .mode_sel (mode_sel_ch2), .DA_Clk (DA_Clk_ch2), .Signal_data (DA_data_ch2) ); assign AD_Clk_ch1 = Clk; assign AD_Clk_ch2 = Clk; endmodule二 、上板结果
我将ACM2108的ad接口与da接口进行连接 ,然后通过ila观察AD和DA的波形来观察设计是否成功 。
在观察方波信号的时候 ,vivado可能会帮我们的波形做处理 ,导致我们观察的方波变成三角波 ,这里我们在Analog Settings里将Interpolation style改为Hold即可设置为正常显示的波形 。
以下是上板后的结果:
程序上板后 ,可以输出频率和相位可调的正弦波 、方波 、三角波 。创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!