基于FPGA用VerilogHDL设计实现DDS直接频率合成的详细步骤(QuartusII调用ModelSim进行仿真详细步骤)

目录

一、使用MATLAB、Excel生成波形数据

二、使用Quartus II制作mif软件

三、设计DDS系统

1、module DDS

2、module DDS_tb

3、生成ROM

四、激励文件的配置

将编写的激励文件DDS_tb添加到test bench中

五、仿真查看波形

进行RTL Simulation


一、使用MATLAB、Excel生成波形数据

首先,打开MATLAB软件。新建一个Script文件,操作为File >New>Script。在该文件中输入以下内容:
F1=1; %信号的频率
Fs=2048;%采样频率
P1=0;%信号初始相位
N=2047;%采样点数为 N+1
t=[0:1/Fs:N/Fs];%采样时刻
ADC=511;%直流分量
A=511;%信号幅度
s=A*sin(2*pi*F1*t + pi*P1/180) + ADC;%生成信号
plot(s);%绘制图形
即可生成我们所需要的数据,其中最后一行为绘制图形,是为了验证我们所生成的数据是否满足要求,不是一定需要。输入完成以后,点击“save and run”按钮,如下图所示。
 
这个时候,我们在MATLAB主界面中,右侧的workspace栏中,选中names的一项,双击,便可打开该数组的值,如下所示:
将该表格中的所有数据选中(可选中第一个数据,然后将进度条拉到最后一个数据的位置,按下键盘上的shift键,鼠标点击最后一个数据,便可全选了),单击右键,复制即可。然后打开execl软件,选中A1单元格,ctrl+V(粘贴),即可。
 
在表格中,我们会发现,这些数据是带有2位小数位的,而我们的mif文件不支持小数,因此需要将这些数据进行四舍五入。四舍五入的方法非常简单我们只需要选中行1(在数字1处点击鼠标左键即可选中),单击鼠标右键,选择设置单元格格式,如下图所示:
 
设置完成之后我们再看,发现表格中的数据已经全部被四舍五入了,此时的数据,就是我们可以使用的数据了。
此时,我们已经完成了 mif 文件所需数据的生成工作,我们可以将这个表格文件保存,也可以直接开着,不用关闭就行,因为这个文件只是一个中转。下一步,就是将这些数据生成我们所需要用到的mif 文件了。
 

二、使用Quartus II制作mif软件

打开quartus II软件,选择file>New,在打开的选项卡中,选择Memory Initialization File,点击OK。在弹出的mif文件大小设置选项卡中,设置Number of Words2048Word Size为10,点击OK 即可,详细如下所示

此时,就会建立好一个空白的mif文件,其中所有内容均为0,如下图所示:

我们将excel表格中的数据选中(可选中第一个数据,然后将进度条拉到最后一个数据的位置,按下键盘上的shift键,鼠标点击最后一个数据,便可全选了),单击右键,复制即可。然后回到quartusIImif编辑界面,在mif文件的任意一个数据位置点击鼠标左键,然后按下键盘上的组合键ctrl + A(也就是全选),然后单击鼠标右键,选择paste即可。此时,我们发现,所有数据便依次存入了相应的地址中,如下图所示:

我们点击quartus II软件界面上的file>save,选择你需要存储的路径,这里暂时存储在某一文件夹上,将文件名命名为sin10_2048,即完成了我们所有的工作。因为这里没有创建工程,所以保存完成后quartus II软件会弹出以下界面,问你是否需新建工程,这里只是做演示用,不需要新建工程,因此这里选择NO

 

三、设计DDS系统

1、module DDS

module DDS(
	clk,//时钟
	reset_n,//复位
	Fword,//频率控制字
	Pword,//相位控制字
	DA_Data//数据输出
);

	input clk;
	input reset_n;
	input [31:0] Fword;
	input [10:0] Pword;//Rom地址11位:横坐标最大为:2048
	output [9:0] DA_Data;
	
	reg [31:0] r_Fword;//频率 寄存器
	reg [10:0] r_Pword;//相位 寄存器
	
	reg [31:0] Fcnt;//累加器
	
	wire [10:0] rom_addr;
	
	always @(posedge clk)
		begin
			r_Fword <= Fword;
			r_Pword <= Pword;
		end
	
	
	always @(posedge clk or negedge reset_n)
		if(!reset_n)
			Fcnt <= 32'd0;
		else
			Fcnt <= Fcnt + r_Fword;//Fcnt:相位累加器
	
	assign rom_addr = Fcnt[31:21] + r_Pword;	
	 
	rom rom(
	.address(rom_addr),
	.clock(clk),
	.q(DA_Data)
	);
	
	

endmodule

2、module DDS_tb

`timescale 1ns/100ps

module DDS_tb;
	reg clk;
	reg reset_n;
	reg [31:0] Fword;
	reg [10:0] Pword;//Rom地址11位
	wire [9:0] DA_Data;
	
	DDS DDS(
	.clk(clk),//时钟
	.reset_n(reset_n),//复位
	.Fword(Fword),//频率控制字
	.Pword(Pword),//相位控制字
	.DA_Data(DA_Data)//数据输出

	);
	
	initial clk = 1;
	always #10 clk = ~clk;
	
	initial 
		begin
			reset_n = 0;
			Fword = 1000000;
			Pword = 0;
			#1;
			reset_n = 1;
		end
		

endmodule

3、生成ROM

点击:Tools→MegaWizard Plug-In Manager

 
→Next:
 
搜索框中输入:rom;→选择“ROM:1-PORT”
 
给文件命名为rom:
 
选择位宽和字节:
 
→Next:
 
→Next:
 
→选择mif文件:找到之前生成的mif文件,并添加进来
 
 
→Next:
→Next:
 
最后finish
 

四、激励文件的配置

将编写的激励文件DDS_tb添加到test bench中

我们已经得到2个“.v”文件,“DDS.v”作为顶层设计,包含整个模块的设计信息;“DDS_tb”是激励文件,是模仿外加激励信号将其加入到模块中。

①Assignments→Settings
②Simulation,如下图进行配置,
③选择Compile test bench→Test Benches→New
④Test bench name:写入激励文件名:DSS_tb
⑤选择File name旁的...,选择DDS_tb.v
open后返回上一界面,单击Add
如下图:
OK:
再OK:
 
再按OK退出。
 

五、仿真查看波形

进行RTL Simulation

软件自动打开Model Sim:
设置数据显示为模拟值:
字符类型为unsigned:
点击Zoom Full
 
耐心等待几十秒,信号波形输出:
  • 17
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
设计一个VerilogHDL频率计,首先需要明确需求和设计规范。一般来说,频率计需要接收一个时钟信号,并且能够计算出该时钟信号的频率。下面是一个简单的VerilogHDL频率计的示例代码: ```verilog module freq_counter( input clk, // 时钟信号 output reg [31:0] freq // 频率计数器 ); reg [31:0] count = 0; // 计数器 always @(posedge clk) begin count <= count + 1; // 每个时钟周期计数器加1 end always @(posedge clk) begin if (count == 0) begin freq <= $time; // 如果计数器清零,将当前时间赋值给频率计数器 end end endmodule ``` 在这个VerilogHDL模块中,我们使用了两个always块。第一个always块根据时钟信号clk每个时钟周期将计数器count加1。第二个always块在每个时钟上升沿时,如果计数器count清零,就将当前时间赋值给频率计数器freq。 接下来,我们可以使用Quartus软件对这个VerilogHDL模块进行仿真。在Quartus中,我们可以使用ModelSim仿真进行仿真。以下是一个简单的仿真脚本: ```tcl vlib work vlog freq_counter.v vsim work.freq_counter add wave * run 100 ns ``` 在这个仿真脚本中,我们首先创建了一个工作库work,然后编译了freq_counter.v文件并创建了一个仿真实例work.freq_counter。然后,我们将所有信号添加到波形窗口中,并且运行仿真100ns。 当我们运行这个仿真脚本时,我们可以看到freq_counter模块的波形图,并且可以观察到频率计数器的计数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheeky_man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值