這次設計一個DDS信號發生器。該設計的特點有: 雙通道的DA輸出,可以調節頻率、相位、和波形(正弦波、方波、三角波)。 擁有相位重置的功能,能夠同時重置兩個輸出波形的相位。 本次採用的是小梅哥的ACM2108模塊。該模塊有兩個通道的ADC和兩個通道的DAC。 本次設計的前置是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即可設置為正常顯示的波形。
以下是上板後的結果:
程式上板後,可以輸出頻率和相位可調的正弦波、方波、三角波。