诗人的眼YI

1、FPGA学习之蜂鸣器

0
阅读(2714)

将自己学习的一些东西记录下来。

module lianxi2
(
	clk,
	rst_n,

	fm
);

	input clk;                 //板子时钟,50MHz
	input rst_n;               //复位,低电平有效
	
	output reg fm;             //fm在赋值左边,需要定义为reg型
	
	reg [20:0]cnt;             //21位计数器,最大计数2的21次方
	
	always@(posedge clk or negedge rst_n)
		if(!rst_n)
			cnt <= 21'd0;
		else if(cnt < 21'd1_999_999)//从0开始,共计数2_000_000次,即40ms
			cnt <= cnt + 1'b1;
		else 
			cnt <= 21'd0;
			
	always@(posedge clk or negedge rst_n)
		if(!rst_n)
			fm <= 1'b0;
		else if(cnt < 21'd1_000_000)//从0开始,共计数1_000_000次,即前一半时间fm高电平,后一半时间fm低电平,即占空比为50%的PWM信号
			fm <= 1'b1;
		else	
			fm <= 1'b0;
			
			
endmodule


blob.png

上图为PWM模型

可以修改T(cnt < 21'd1_999_999)或者t(cnt < 21'd1_000_000)来获得不同的模型


下面为测试文件testbench

`timescale 1ns/1ns
`define clk_period 20  //定义时钟周期为20ns

module lianxi2_tb;

	reg clk;            //将.v文件中的端口复制过来,input修改为reg,output修改为wire
	reg rst_n;
	
	wire fm;

	lianxi2 lianxi2    //将.v文件中的端口复制过来,加个例化名字,加个.,加个例化的端口
	(
		.clk(clk),
		.rst_n(rst_n),

		.fm(fm)
	);

	initial clk = 1;    //初始化时钟clk
	always #(`clk_period/2) clk = ~clk;
	
	initial begin
		rst_n = 1'b0;
		#(`clk_period*20)        //初始rst_n为低电平,延时400ns后复位
		rst_n = 1'b1;
		#(`clk_period*4000000)   //程序继续进行4_000_000*20ns = 80ms
		$stop;
	end

endmodule

得到的波形如下

blob.png

可以看到得到的fm波形,周期是40ms,占空比为50%。