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-1parameter 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)beginif(!RST_N) //判断复位time_cnt <=27'h0; //初始化 time_cnt 的值else time_cnt <=time_cnt_n; //用来给 time_cnt 赋值end//组合电路,实现 PWM 波的定时计数器/***********************/always @(*)beginif((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)beginif(!RST_N) //判断复位led_reg<= 1'b0; //初始化 led_reg 值else led_reg<=led_reg_n; //用来给 led_reg 赋值end//组合电路,判断时间,控制 LED 的亮或灭 /********************/always @ (*) beginif(((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 endmoduleendmodule
2.创建一个占空比和频率可调的pwm脉冲仿真 .vt文件
/********************************************************************************名称 :verilog_frist.vt功能:创建一个占空比和频率可调的pwm脉冲仿真作者:王世阳创建日期:2021.03.25修改日期1:修改内容1:*********************************************************************************/`timescale 1 ps/ 1 psmodule verilog_frist_vlg_tst();// constants// general purpose registersreg eachvec;// test vector input registersreg CLK_50M;reg RST_N;// wireswire 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));initialbegin// 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,停止仿真// --> endendalways #10000beginCLK_50M=~CLK_50M;endendmodule
