将自己学习的一些东西记录下来。
modulelianxi2(clk,rst_n,fm);inputclk;//板子时钟,50MHzinputrst_n;//复位,低电平有效outputregfm;//fm在赋值左边,需要定义为reg型reg[20:0]cnt;//21位计数器,最大计数2的21次方always@(posedgeclkornegedgerst_n)if(!rst_n)cnt<=21'd0;elseif(cnt<21'd1_999_999)//从0开始,共计数2_000_000次,即40mscnt<=cnt+1'b1;elsecnt<=21'd0;always@(posedgeclkornegedgerst_n)if(!rst_n)fm<=1'b0;elseif(cnt<21'd1_000_000)//从0开始,共计数1_000_000次,即前一半时间fm高电平,后一半时间fm低电平,即占空比为50%的PWM信号fm<=1'b1;elsefm<=1'b0;endmodule
上图为PWM模型
可以修改T(cnt < 21'd1_999_999)或者t(cnt < 21'd1_000_000)来获得不同的模型
下面为测试文件testbench
`timescale1ns/1ns`defineclk_period20//定义时钟周期为20nsmodulelianxi2_tb;regclk;//将.v文件中的端口复制过来,input修改为reg,output修改为wireregrst_n;wirefm;lianxi2lianxi2//将.v文件中的端口复制过来,加个例化名字,加个.,加个例化的端口(.clk(clk),.rst_n(rst_n),.fm(fm));initialclk=1;//初始化时钟clkalways#(`clk_period/2)clk=~clk;initialbeginrst_n=1'b0;#(`clk_period*20)//初始rst_n为低电平,延时400ns后复位rst_n=1'b1;#(`clk_period*4000000)//程序继续进行4_000_000*20ns=80ms$stop;endendmodule
得到的波形如下
可以看到得到的fm波形,周期是40ms,占空比为50%。