大家好,感谢关注。最近在实验中用到了方波,于是写了一个在verilog中产生方波的代码,并亲测了一下。下面对方波的代码进行解释:
一,方波的信号参数中一共有一下几个参数:
1)周期/频率
2)高幅值
3)低幅值
4)“占空比”
本次的代码直接使用“占空比”是50%的常用方波,则可调参数分别是周期、高幅值和低幅值。
二,方波产生的思路:
先写一个计数器实现分频得到clk_div,再根据clk_div的大小进行方波的赋值。详细的代码如下:
其中:
1)通过更改square_wave_period对方波的周期进行调整
2)通过更改square_wave_amp_H对方波的高幅值进行调整
3)通过更改square_wave_amp_L对方波的低幅值进行调整
module square_wave_gen(
input clk,
input reset_n,
input [31:0] square_wave_amp_H, // 方波的幅度H
input [31:0] square_wave_amp_L, // 方波的幅度L
input [31:0] square_wave_period,//matlab 赋值的方波的周期
output reg [31:0] square_wave_out
);
reg [31:0] cnt ;
reg clk_div;
always@(posedge clk or negedge reset_n)
begin
if(reset_n==0)
begin
cnt <= 32'b0;
clk_div <= 1'b0;
end
else
if(cnt ==square_wave_period)//实现40Mhz到1hz分频
begin
cnt <= 32'b0;
clk_div <= ~clk_div;
end
else
begin
cnt <= cnt + 1'b1;
end
end
//----------------------------------
always@(posedge clk or negedge reset_n)
begin
if(reset_n==0)
begin
square_wave_out <= 32'b0;
end
else
if(clk_div ==1'b1)//实现40Mhz到1hz分频
begin
square_wave_out <= square_wave_amp_H;
end
else
begin
square_wave_out <= square_wave_amp_L;
end
end
//----------------------------------
endmodule