搞个笑?用Verilog产生一个三角波吧!

写了这么一个幼儿级别的程序,描述一个三角波的Verilog产生办法,至于三角波的周期没有进行可调性设计,仅仅是为了测试而用,如果需要某个频率的三角波,可以自己调节代码。

本不想放上面的,但是也不舍得扔,就搞个笑吧。

`timescale 1ns / 1ps


module Triangle_Wave_Gen(
	
	input clk,
	input rst_n,
	
	output reg signed [15:0] wave_out,
	output signed [15:0]  triangle_wave_out
    );
	
	reg [3:0] count;
	
	
	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			count <= 0;
		end
		else if(count == 11) begin
			count <= 0;
		end
		else count <= count + 1;
	
	end
	
	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) wave_out <= 0;
		else if( count <= 5) wave_out <= wave_out + 100;
		else wave_out <= wave_out - 100;
	
	end
	
	assign triangle_wave_out = wave_out - 300;
	
	
	
	
	
	
endmodule

对这个波形产生函数进行仿真:

`timescale 1ns / 1ps



module Triangle_Wave_Gen_tb(

    );
	
	reg clk;
	reg rst_n;
	
	wire [15:0] wave_out;
	wire [15:0] triangle_wave_out;
	
	initial begin
		clk = 0;
		forever 
		#20 clk = ~clk;
	
	end
	
	
	initial begin
		rst_n = 0;
		
		#100 
		rst_n = 1;
	end
	
	Triangle_Wave_Gen u_Triangle_Wave_Gen(
	.clk(clk),
	.rst_n(rst_n),
	.wave_out(wave_out),
	.triangle_wave_out(triangle_wave_out)
	
	);
	
	
	
	
	
endmodule

想必你一定知道,设计程序中的triangle_wave_out变量为什么在wave_out的基础上减去300,仅仅是为了让三角波的最大值以及最小值对称。

虽然说很简单,但至少很清晰。

如果要测试你做的一个FFT或者什么变换设计,对不对,不妨设计一个简单的三角波作为输入数据进行测试,而这个三角波,何苦费心呢?就这样随便写一个吧。

最后说说,如何模拟的方式显示这个三角波:

右击波形名字,选择波形样式即可,但是还需要设置下模拟波形:

让Y的范围包含你的波形的范围。

当然,高级的也有,参考别人的博文:任意波形产生,我没看。

 

 

 

以下是一个简单的三角波发生器的Verilog代码: ```verilog module TriangleWaveGenerator( input clk, input rst, input [31:0] freq, input [31:0] amplitude, output reg [31:0] out ); reg [31:0] counter; reg [31:0] ramp; reg [1:0] direction; always @(posedge clk) begin if (rst) begin counter <= 0; ramp <= 0; direction <= 2'b10; end else begin if (counter == freq) begin if (direction == 2'b10) begin ramp <= ramp + 1; if (ramp == amplitude) direction <= 2'b01; end else if (direction == 2'b01) begin ramp <= ramp - 1; if (ramp == 0) direction <= 2'b10; end counter <= 0; end else counter <= counter + 1; end end assign out = ramp; endmodule ``` 该模块接受时钟信号`clk`和复位信号`rst`,以及频率和幅度作为输入。输出是一个可调节幅度和频率的三角波形。 在模块内部,我们使用了三个寄存器:`counter`计数器,`ramp`斜率和`direction`方向。计数器用于计算时钟周期数,以便达到所需频率。斜率是当前输出波形的值,方向用于指示波形是向上还是向下移动。 在时钟上升沿时,我们检查复位信号。如果复位为1,则将所有值重置为0,并将方向设置为向上。否则,我们检查计数器是否等于频率值。如果是,则更新波形值,根据方向向上或向下移动。最后,我们将计数器重置为0。 我们还使用了assign语句,将`ramp`赋值给输出端口`out`。这使得我们可以在外部引用波形值。 请注意,这只是一个简单的三角波发生器实现,并且可能需要进行一些优化,以便在更高的时钟速率下工作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李锐博恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值