在本系列第一篇文章中,DDS的设计代码在2020版本之后的Vivado中,综合时可能会出现这样的错误:
这是因为2020版本Vivado对时钟信号上升沿下降沿的要求十分严格,之前在2019版本Vivado上,为了适配ZYNQ-7020硬件,就把程序的高低电平触发调整了一下,2019版本没有问题,但在2020版本就会报错
在2020版本会报错代码举例如下:
只需要如下图把rst_n的下降沿有效改成上升沿有效即可
代码一共有三处类似地方,全部改过来即可
下面附上完整的2020版本之后的DDS代码
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 posedge rst_n)
begin
if(rst_n) begin
r_pword <= 0;
end
else begin
r_pword <= 2048; //这里时相位控制,单通道设计可以忽略
end
end
always@(posedge clk or posedge rst_n)
if(rst_n)
cnt <= 32'd0;
else
cnt <= 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
.douta(Data_sin) // output wire [11 : 0] douta
);//正弦
triangular_wave triangular_DDS(
.clka(clk), // input wire clka
.addra(rom_addr1), // input wire [11 : 0] addra
.douta(Data_triangular) // output wire [11 : 0] douta
);//三角
square_wave square_DDS(
.clka(clk), // input wire clka
.addra(rom_addr2), // input wire [11 : 0] addra
.douta(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
.douta(Data_sawtooth_wave) // output wire [11 : 0] douta
);//锯齿
sine1_DDS sine_DDS1(
.clka(clk), // input wire clka
.addra(rom_addr4), // input wire [11 : 0] addra
.douta(Data_sin1) // output wire [11 : 0] douta
);//幅度改变的正弦
//矩阵混合模块
wire signed [11:0] a11, a12, a21, a22;
assign a11 = 12'h300;
assign a12 = 12'h600;
assign a21 = 12'h100;
assign a22 = 12'h800;
reg signed [23:0] a11s1;
reg signed [23:0] a12s2;
reg signed [23:0] a21s1;
reg signed [23:0] a22s2;
always @(posedge clk or posedge rst_n)begin
if(rst_n)begin
a11s1 <= 'b0;
a12s2 <= 'b0;
a21s1 <= 'b0;
a22s2 <= 'b0;
end
else begin//混合矩阵混合
a11s1 <= a11 * Data_sin;
a12s2 <= a12 * Data_square;
a21s1 <= a21 * Data_sin;
a22s2 <= a22 * Data_square;
end
end
reg signed [11:0] wave1;
reg signed [11:0] wave2;
always@(posedge clk or posedge rst_n)begin
if(rst_n)begin
wave1 <= 'b0;
wave2 <= 'b0;
end
else begin
wave1 <= (a11s1 >>> 12) + (a12s2 >>> 12);
wave2 <= (a21s1 >>> 12) - (a22s2 >>> 12);
end
end
//频率的切换
always@(*)
case(fword_sel)
0:r_fword=8590;//250HZ
1:r_fword=85899;//2500HZ
2:r_fword=858993;//25KHZ
3:r_fword=8589935;//250KHZ
endcase
//波形的切换
always@(*)
case(Mode_Sel)
0:Data=Data_sin;//正弦波
1:Data=Data_square;//方波
// 1:Data=Data_sin1;//与第一个正弦波相比幅度改变的正弦波
2:Data=Data_triangular;//三角波
// 3:Data=Data_sawtooth_wave;//锯齿波
3:Data=wave1;//正弦和方波进行一定比例混合的混合波
endcase
endmodule
使用2020版本的读者只需要把这段DDS的设计代码换成这段即可,其余部分不用做改动。