【FPGA作业】第三章、第四章 DDS正弦信号产生实验及modelsim仿真

本文详细介绍了使用DDS(直接数字频率合成)生成50MHz时钟速率下10MHz正弦波的实验过程。实验中,通过MATLAB生成10bit ROM代码,使用Verilog实现DDS地址增加模块,并在Modelsim中进行仿真验证。MATLAB分析了DDS的频谱,确认峰值频率为10MHz。此外,还提供了Modelsim的仿真流程和MATLAB分析步骤。
摘要由CSDN通过智能技术生成

三 DDS正弦信号产生实验

3.1 实验目标

  • 设计DDS,50MHz的时钟速率,输出波形频率10MHz
  • DDS的输出数据格式为2补码,相位累加器32比特,ROM波表尺寸10bit和波形量化比特数10bit
  • 首先在signaltap里观察波形的正确性,然后把signaltap的数据导入到matlab,分析频域结果

3.2 实验原理

这里写图片描述
注意
频率控制字K与ROM位数没有关系
1、正弦波波形是可以一段一段曲折拼成的
2、例,频率控制字位数FW_WL=32,ROM地址位数RA_WL=10。加法器输出10位数据,该10位数据这样得出:
acc_R <= #1 fwin_R + acc_R;
addr_R <= acc_R[FW_WL-1:FW_WL-1-(RA_WL-1)];
取的ROM地址是前10位,即一段时间内,ROM表的输出没有变化,最后可以看出是锯齿拼成正弦波

3.3程序matlab与verilog

3.3.1 matlab生成rom代码

(1)生成10bit rom
%假设用到的DA芯片为10,width,对应量化
%正弦波ROM的深度为1024(地址总数),对应采样
%该ROM中数据为一个整周期正弦波1024点采样,每个样点采用10比特量化,数据范围(-1,1),二进制补码格式
%本实验中量化10bit
function []=rom_gen()
depth=1024;
%width=8;
width=10;
%x=ceil(power(2,8)/2*sin(0:pi*2/depth:2*pi))
x=ceil((power(2,width)/2-1)*sin(0:pi*2/depth:2*pi));
fid=fopen('D:\useful\fpga\quaters\basic6\prj6\matlabtest\sine_rom.v','w');

fprintf(fid,'module sine_rom(\n');
fprintf(fid,'    input clk,\n');
fprintf(fid,'    input [9:0] RA,\n');
fprintf(fid,'    output reg[9:0] RD );\n');
fprintf(fid,'always @ (posedge clk)\n');
fprintf(fid,'case(RA)\n');
for k=1:depth
%fprintf(fid,'10''d %d :RD=#1 8''b %d ;\n',k-1,x(k));
fprintf(fid,'10''d %d :RD=#1 10''b %s ;\n',k-1,dec2binPN(x(k),10));
end
fprintf(fid,'default: RD=#1 0;\n');
fprintf(fid,'endcase\n');
fprintf(fid,'endmodule\n');
(2)二进制补码函数 dec2binPN.m
% https://wenku.baidu.com/view/6c477149336c1eb91a375d3a.html
function [numbin]=dec2binPN(numdec, N)
if(numdec>=0)
    numbin1=dec2bin(numdec,N);
else
    numbin1=dec2bin(abs(numdec),N);
    l1=length(numbin1);
    numbin4=0;
    for i=1:l1
        if(numbin1(l1-i+1)==num2str(1))
        %matlab字符串数组s(n):s第n位
        %按位取反,用十进制表示
        numbin4=numbin4+0;
        else
        numbin4=numbin4+power(2,i-1);
        end
    end
    numbin4=numbin4+1;
    numbin1=dec2bin(numbin4,N);
end
numbin=numbin1;

3.3.2 Verilog代码

(1)顶层文件top_sin_wav.v
`timescale 1ns/1ns
module top_sin_wave(
  CLK       ,   // clock, posedge v
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值