欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 43.简易DDS信号发生器的设计与验证(2)

43.简易DDS信号发生器的设计与验证(2)

2024/10/24 9:21:09 来源:https://blog.csdn.net/2301_80417284/article/details/140549626  浏览:    关键词:43.简易DDS信号发生器的设计与验证(2)

PS:Visio-更多形状-工程-电气工程-模拟和数字逻辑-信号波形  里面有正弦波、方波等信号波形。

(1)key_ctrl部分Verilog代码:

module key_ctrl
(input                   clk         ,input                   reset_n     ,input           [3:0]   key         ,output  reg     [3:0]   wave_selcet 
);wire key_p_sin;wire key_p_squ;wire key_p_tri;wire key_p_saw;key_filter  key_filter_inst0(.clk                 (clk       ),.reset_n             (reset_n   ),.key_in              (key[0]    ),.key_p_flag          (key_p_saw ),.key_r_flag          (),.key_state           ()
);key_filter  key_filter_inst1(.clk                 (clk       ),.reset_n             (reset_n   ),.key_in              (key[1]    ),.key_p_flag          (key_p_tri ),.key_r_flag          (),.key_state           ()
);key_filter  key_filter_inst2(.clk                 (clk       ),.reset_n             (reset_n   ),.key_in              (key[2]    ),.key_p_flag          (key_p_squ ),.key_r_flag          (),.key_state           ()
);key_filter  key_filter_inst3(.clk                 (clk       ),.reset_n             (reset_n   ),.key_in              (key[3]    ),.key_p_flag          (key_p_sin ),.key_r_flag          (),.key_state           ()
);always@(posedge clk or negedge reset_n)if(!reset_n)wave_selcet <= 4'b1000;else if(key_p_sin)wave_selcet <= 4'b1000;else if(key_p_squ)wave_selcet <= 4'b0100;else if(key_p_tri)wave_selcet <= 4'b0010;else if(key_p_saw)wave_selcet <= 4'b0001;else wave_selcet <= wave_selcet;endmodule

(2)仿真代码:

`timescale 1ns / 1psmodule key_ctrl_tb;reg clk         ;    
reg reset_n     ;    
reg [3:0]key         ;    wire [3:0]wave_selcet   ;initial clk = 1'd1;
always#10 clk = ~clk;initial beginreset_n <= 1'd0;key <= 4'd1111;#15;reset_n <= 1'd1;#50000;key <= 4'b1110;#50000;key <= 4'b1111;#50000;key <= 4'b1101;#50000;key <= 4'b1111;#50000;key <= 4'b1011;#50000;key <= 4'b1111;#50000;key <= 4'b0111;#50000;key <= 4'b1111;#50000;$stop;
endkey_ctrl key_ctrl_inst
(.clk         (clk        ),.reset_n     (reset_n    ),.key         (key        ),.wave_selcet (wave_selcet)
);defparam key_ctrl_inst.key_filter_inst0.MCNT = 99;defparam key_ctrl_inst.key_filter_inst1.MCNT = 99;defparam key_ctrl_inst.key_filter_inst2.MCNT = 99;defparam key_ctrl_inst.key_filter_inst3.MCNT = 99;endmodule

(3)仿真波形:

(4)ROM配置过程:

例化模板:

附上生成coe文件的matlab源码(来自野火):

clc;                    %清除命令行命令
clear all;              %清除工作区变量,释放内存空间
F1=1;                   %信号频率
Fs=2^12;                %采样频率
P1=0;                   %信号初始相位
N=2^12;                 %采样点数
t=[0:1/Fs:(N-1)/Fs];    %采样时刻
ADC=2^7 - 1;            %直流分量
A=2^7;                  %信号幅度
s1=A*sin(2*pi*F1*t + pi*P1/180) + ADC;          %正弦波信号
s2=A*square(2*pi*F1*t + pi*P1/180) + ADC;       %方波信号
s3=A*sawtooth(2*pi*F1*t + pi*P1/180,0.5) + ADC; %三角波信号
s4=A*sawtooth(2*pi*F1*t + pi*P1/180) + ADC;     %锯齿波信号
%创建coe文件
fild = fopen('wave_16384x8.coe','wt');
%写入coe文件头
fprintf(fild, '%s\n','MEMORY_INITIALIZATION_RADIX=10;'); %10进制数
fprintf(fild, '%s\n','MEMORY_INITIALIZATION_VECTOR=');
for j = 1:4for i = 1:Nif j == 1       %打印正弦信号数据s0(i) = round(s1(i));    %对小数四舍五入以取整endif j == 2       %打印方波信号数据s0(i) = round(s2(i));    %对小数四舍五入以取整endif j == 3       %打印三角波信号数据s0(i) = round(s3(i));    %对小数四舍五入以取整endif j == 4       %打印锯齿波信号数据s0(i) = round(s4(i));    %对小数四舍五入以取整endif s0(i) <0             %负1强制置零s0(i) = 0endif j == 4 && i == Nfprintf(fild, '%d',s0(i));      %数据写入fprintf(fild, '%s',';');        %最后一个数使用分号结束elsefprintf(fild, '%d',s0(i));      %数据写入fprintf(fild, '%s\n',',');      %逗号,换行endend
end
fclose(fild);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com