写了这么一个幼儿级别的程序,描述一个三角波的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的范围包含你的波形的范围。
当然,高级的也有,参考别人的博文:任意波形产生,我没看。