重温FPGA开发29

DDS的FPGA实现

补充一下相位控制字,下面的相位就是-90°,改变相位就是给ROM的地址取一个偏移量即可。
在这里插入图片描述

首先创建工程:
DDS_Module.v

module DDS_Module(
	Clk,
	Reset,
	Fword,
	Pword,
	Data
	);

	input Clk;
	input Reset;
	input [31:0]Fword;   // 32位 最少需要4G的存储空间
	input [11:0]Pword;   // 为什么是12位 4096个点
	input [13:0]Data;    // 使用的14位的DA

	// 频率控制字同步寄存器
	reg [31:0] Fword_r;
	always(posedge Clk)
		Fword_r <= Fword;

	// 相位控制字同步寄存器
	reg [31:0] Pword_r;
	always(posedge Clk)
		Pword_r <= Pword;

	// 相位累加器
	 reg [31:0] Freq_ACC;
	 always@(posedge Clk or negedge Reset)
	 if(!Reset)
	 	Freq_ACC <= 0;
	 else
	 	Freq_ACC <= Fword_r + Freq_ACC;
	 	
	 // 按照图来看,其实可以看成组合逻辑
	 // wire [31:0]Freq_ACC_out;
	 // assign Freq_ACC_out = Freq_ACC + Pword_r;
	 
	 // 相位累加器与相位控制字的结果输出
	 reg [31:0] Freq_ACC_out;
	 always@(posedge Clk or negedge Reset)
	 if(!Reset)	
	 	Freq_ACC_out <= 0else
	 	Freq_ACC_out <= Freq_ACC + Pword_r;
	 
	 // 波形数据表地址 ROM
	 reg [11:0] Rom_addr;
	 // assign = Freq_ACC_out;
	 // Fword = 2'20
	 // Freq_ACC_out[31:20]  
	 assign Rom_Addr = Freq_ACC_out[31:20];
	 
	// 例化ROM
	blk.mem_gen_0 rom(
	.clka(Clk),
	.addra(Rom_Addr),
	.douta(Data)
	);

endmoudle	

写一个testbench 测试

module DDS_Module_tb;

	reg Clk;
	reg Reset;
	reg [31:0]Fword;
	reg [11:0]Pword;
	wire [13:0]Data;

	DDS_Module DDS_Module(
	Clk,
	Reset,
	Fword,
	Pword,
	Data
	);

	initial Clk = 1;
	always #10 Clk = ~Clk;

	initial begin
		Reset = 0;
		Fword = 65536;
		Pword = 0;
		#201;
		Reset = 1;
		#20000000;
		Fword = 65536 * 1024;
		#20000000;
		Fword = 65536 * 32;
		#20000000;
		$stop
		
	
	end
endmodule

在这里插入图片描述
在这里插入图片描述
掉进了 vivado 软件的坑!

修改 testbench
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值