1.创建一个占空比和频率可调的pwm脉冲 .v文件
/********************************************************************************
名称 :verilog_frist.v
功能:创建一个占空比和频率可调的pwm脉冲
作者:王世阳
创建日期:2021.03.25
修改日期1:
修改内容1:
*********************************************************************************/
module verilog_frist
(
//输入端口
input CLK_50M,
input RST_N,
//输出端口
output LED1
);
//--内部端口声明
reg [26:0] time_cnt; //控制 LED 闪烁的频率的定时计数器
reg [26:0] time_cnt_n; //time_cnt 的下一个状态
reg led_reg; //用来控制 LED 亮灭的显示寄存器
reg led_reg_n; ///leg_reg 的下一个状态
//设置定时器的时间为 t ,计算方法为翻转次数=(t*10^6)us/(1/50)us-1
parameter SET_High_TIME=27'd9;/*******/
//假设一个周期内高电平的持续时间为 0.2μS 此处一个周期内高电平经历了 9 个 CLK 脉冲
parameter SET_Low_TIME=27'd39; /******/
//假设一个周期内低电平的持续时间为 0.8μS 此处一个周期内高电平经历了 39 个 CLK 脉冲
//--逻辑功能实现
//时序电路,用来给 time_cnt 寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
time_cnt <=27'h0; //初始化 time_cnt 的值
else time_cnt <=time_cnt_n; //用来给 time_cnt 赋值
end
//组合电路,实现 PWM 波的定时计数器/***********************/
always @(*)
begin
if((time_cnt==SET_High_TIME &&led_reg==1'b1)||(time_cnt==SET_Low_TIME
&& led_reg==1'b0) ) //判断高低电平的时间
time_cnt_n=27'h0 ; //如果到达预定时间,定时计数器便会清零
else time_cnt_n<=time_cnt+27'h1; //用来给 time_cnt 赋值
end
//时序电路,用来给 leg_reg 寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
led_reg<= 1'b0; //初始化 led_reg 值
else led_reg<=led_reg_n; //用来给 led_reg 赋值
end
//组合电路,判断时间,控制 LED 的亮或灭 /********************/
always @ (*) begin
if(((time_cnt==SET_High_TIME)&&(led_reg==1'b1)) ||((time_cnt==SET_Low_TIME) && (led_reg==1'b0))) //判断高低电平的时间
led_reg_n=~led_reg; //如果到达预定时间,显示寄存器将改变 LED 的状态
else led_reg_n=led_reg ; //如果未到达时间,显示寄存器将保持 LED 的原状态
end assign LED1=led_reg; //最后将显示寄存器的值赋值给端口 LED1 endmodule
endmodule
2.创建一个占空比和频率可调的pwm脉冲仿真 .vt文件
/********************************************************************************
名称 :verilog_frist.vt
功能:创建一个占空比和频率可调的pwm脉冲仿真
作者:王世阳
创建日期:2021.03.25
修改日期1:
修改内容1:
*********************************************************************************/
`timescale 1 ps/ 1 ps
module verilog_frist_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg CLK_50M;
reg RST_N;
// wires
wire LED1;// assign statements (if any)
verilog_frist i1 (
// port map - connection between master ports and signals/registers
.CLK_50M(CLK_50M),
.LED1(LED1),
.RST_N(RST_N)
);
initial
begin
// code that executes only once
// insert code here --> begin
#0 CLK_50M =1'b0; //时钟初始化为 1
#10000 RST_N =1'b0; //延时 10ns,低电平复位
#10000 RST_N =1'b1; //延时 10ns,RST_N 为高电平
#100000000 $stop; //延时 0.1ms,停止仿真
// --> end
end
always #10000
begin
CLK_50M=~CLK_50M;
end
endmodule