Verilog实现正弦波、三角波、方波、锯齿波的输出

1、理论知识

实现方法:将数字量转换为模拟量,根据输出数字量的大小转换为模拟量以实现信号幅值的变化。

具体思路:提前声明一个ROM IP核,将正弦波、三角板、方波和锯齿波的数字量写入进去,或者也可以自己用Verilog写一个ROM,ROM作为只读的一个存储器,在声明的时候需要提前将数据写入到ROM中,然后给定其一个地址,便会输出该地址所对应的数据以实现信号波形的输出。

根据思路进行举例说明:

若要实现一个正弦波的输出,提前将ROM的深度定义为1024,宽度定义为10位宽。则ROM中有1024个数据,每个数据的位宽为10位二进制,这1024个数据代表了一个正弦波。

由于位宽为10位,则输出幅值的最大值为2^10-1=1023,最小为0,具体如下图

同理可以实现三角波、方波、锯齿波。

2、具体实践 

目标:用Vivado中的ROM IP核,实现正弦波、三角波、方波、锯齿波的输出。

第一步 生成波形数据

可以使用mif精灵,或者matlab生成一个coe文件,文件内容格式具体如下图:

第二步 定义ROM IP核

定义一个但端口的ROM IP核,一个波形深度为1024,则存放四个波形的深度需要4096,对应的地址位为12位。

然后将第一步生成的coe文件写入ROM中。

 第三步 编写源文件代码并调用IP核 

 具体源文件代码如下 

module wave4_rom(
	
	input	wire		sys_clk,
	input	wire		ena,
	input	wire [11:0]	addr,
	input	wire [9:0]	data_out

    );
	
	
	
//调用第二步生成的ROM IP核	
sinwave_rom inst1 (
  .clka(sys_clk),    // input wire clka
  .ena(ena),      // input wire ena
  .addra(addr),  // input wire [11 : 0] addra
  .douta(data_out)  // output wire [9 : 0] douta
);
endmodule

第四步 编写仿真代码 

仿真代码如下:

`timescale 1ns / 1ns

module tb_wave4_rom();

	reg				sys_clk	;
	reg				ena		;
	reg 	[11:0]	addr	;
	wire 	[9:0]	data_out;

initial
	begin
		sys_clk=1'b1;
		ena<=1'b0;
		#200
		ena<=1'b1;
	end

always	#10	sys_clk=~sys_clk;

always@(posedge sys_clk or negedge ena)
	if(ena==1'b0)
		addr<=12'd0;
	else	if(addr==12'd4095)
		addr<=12'd0;
	else
		addr<=addr+1'b1;

//实例化源文件
wave4_rom	inst1(
	
	.sys_clk	(sys_clk)	,
	.ena		(ena)	,
	.addr		(addr)	,
	.data_out   (data_out)

    );
endmodule

Vivado仿真波形 

整体波形如下

 方波的数据只有1023和0

3、拓展训练

可以使用FPGA的按键控制四种波形的输出,需要使用到按键消抖模块。

也可以进行输出波形的频率和相位调制,实现一个简易的DDS信号发生器。具体实现原理图如下

 

图中所展示的四大结构中,相位累加器是整个 DDS 的核心,在这里完成相位累加,生成相位码。相位累加器的输入为频率字输入 K,表示相位增量,设其位宽为 N,满足等式K = 2^N * fOUT / fCLK 。其在输入相位累加器之前,在系统时钟同步下做数据寄存,数据改变时不会干扰相位累加器的正常工作。 

通过改变频率字输入和相位字输入实现输出波形频率和相位的调节。 

  • 3
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值