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 / 1ps

module 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 begin
    reset_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;
end

key_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源码(来自野火):

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:4
    for i = 1:N
        if j == 1       %打印正弦信号数据
            s0(i) = round(s1(i));    %对小数四舍五入以取整
        end

        if j == 2       %打印方波信号数据
            s0(i) = round(s2(i));    %对小数四舍五入以取整
        end

        if j == 3       %打印三角波信号数据
            s0(i) = round(s3(i));    %对小数四舍五入以取整
        end

        if j == 4       %打印锯齿波信号数据
            s0(i) = round(s4(i));    %对小数四舍五入以取整
        end

        if s0(i) <0             %负1强制置零
            s0(i) = 0
        end
        
        if j == 4 && i == N
            fprintf(fild, '%d',s0(i));      %数据写入
            fprintf(fild, '%s',';');        %最后一个数使用分号结束
        else
            fprintf(fild, '%d',s0(i));      %数据写入
            fprintf(fild, '%s\n',',');      %逗号,换行
        end
    end
end
fclose(fild);
相关推荐
FPGA小迷弟1 小时前
基于FPGA实现HDMI接口,选型/核心技术
学习·fpga开发·verilog·fpga·modelsim
szxinmai主板定制专家13 小时前
基于 PC 的控制技术+ethercat+linux实时系统,助力追踪标签规模化生产,支持国产化
arm开发·人工智能·嵌入式硬件·yolo·fpga开发
博览鸿蒙1 天前
如何为春招的金三银四做好准备
fpga开发
FPGA小迷弟1 天前
FPGA处理图像需要用到的主流接口详解
学习·fpga开发·verilog·fpga·modelsim
LeoZY_1 天前
CH347 USB转JTAG功能使用笔记:CH347根据SVF文件实现任意FPGA下载
笔记·stm32·嵌入式硬件·fpga开发·硬件架构·硬件工程
博览鸿蒙1 天前
FPGA在高性能计算中的应用:数据流加速与优化
fpga开发
maverick_1111 天前
【数字图像处理与FPGA实现】00 绪,建立“算法思维“与“硬件思维“的桥梁
图像处理·fpga开发
乌恩大侠2 天前
【OAI】 USRP 在conf文件中的配置,RU选项
fpga开发
qq_小单车3 天前
xilinx-DNA
fpga开发·xilinx
Flamingˢ3 天前
FPGA中的嵌入式块存储器RAM:从原理到实现的完整指南
fpga开发