1.创建一个占空比和频率可调的pwm脉冲 .v文件

    1. /********************************************************************************
    2. 名称 :verilog_frist.v
    3. 功能:创建一个占空比和频率可调的pwm脉冲
    4. 作者:王世阳
    5. 创建日期:2021.03.25
    6. 修改日期1:
    7. 修改内容1:
    8. *********************************************************************************/
    9. module verilog_frist
    10. (
    11. //输入端口
    12. input CLK_50M,
    13. input RST_N,
    14. //输出端口
    15. output LED1
    16. );
    17. //--内部端口声明
    18. reg [26:0] time_cnt; //控制 LED 闪烁的频率的定时计数器
    19. reg [26:0] time_cnt_n; //time_cnt 的下一个状态
    20. reg led_reg; //用来控制 LED 亮灭的显示寄存器
    21. reg led_reg_n; ///leg_reg 的下一个状态
    22. //设置定时器的时间为 t ,计算方法为翻转次数=(t*10^6)us/(1/50)us-1
    23. parameter SET_High_TIME=27'd9;/*******/
    24. //假设一个周期内高电平的持续时间为 0.2μS 此处一个周期内高电平经历了 9 个 CLK 脉冲
    25. parameter SET_Low_TIME=27'd39; /******/
    26. //假设一个周期内低电平的持续时间为 0.8μS 此处一个周期内高电平经历了 39 个 CLK 脉冲
    27. //--逻辑功能实现
    28. //时序电路,用来给 time_cnt 寄存器赋值
    29. always @ (posedge CLK_50M or negedge RST_N)
    30. begin
    31. if(!RST_N) //判断复位
    32. time_cnt <=27'h0; //初始化 time_cnt 的值
    33. else time_cnt <=time_cnt_n; //用来给 time_cnt 赋值
    34. end
    35. //组合电路,实现 PWM 波的定时计数器/***********************/
    36. always @(*)
    37. begin
    38. if((time_cnt==SET_High_TIME &&led_reg==1'b1)||(time_cnt==SET_Low_TIME
    39. && led_reg==1'b0) ) //判断高低电平的时间
    40. time_cnt_n=27'h0 ; //如果到达预定时间,定时计数器便会清零
    41. else time_cnt_n<=time_cnt+27'h1; //用来给 time_cnt 赋值
    42. end
    43. //时序电路,用来给 leg_reg 寄存器赋值
    44. always @ (posedge CLK_50M or negedge RST_N)
    45. begin
    46. if(!RST_N) //判断复位
    47. led_reg<= 1'b0; //初始化 led_reg 值
    48. else led_reg<=led_reg_n; //用来给 led_reg 赋值
    49. end
    50. //组合电路,判断时间,控制 LED 的亮或灭 /********************/
    51. always @ (*) begin
    52. if(((time_cnt==SET_High_TIME)&&(led_reg==1'b1)) ||((time_cnt==SET_Low_TIME) && (led_reg==1'b0))) //判断高低电平的时间
    53. led_reg_n=~led_reg; //如果到达预定时间,显示寄存器将改变 LED 的状态
    54. else led_reg_n=led_reg ; //如果未到达时间,显示寄存器将保持 LED 的原状态
    55. end assign LED1=led_reg; //最后将显示寄存器的值赋值给端口 LED1 endmodule
    56. endmodule

    2.创建一个占空比和频率可调的pwm脉冲仿真 .vt文件

    1. /********************************************************************************
    2. 名称 :verilog_frist.vt
    3. 功能:创建一个占空比和频率可调的pwm脉冲仿真
    4. 作者:王世阳
    5. 创建日期:2021.03.25
    6. 修改日期1:
    7. 修改内容1:
    8. *********************************************************************************/
    9. `timescale 1 ps/ 1 ps
    10. module verilog_frist_vlg_tst();
    11. // constants
    12. // general purpose registers
    13. reg eachvec;
    14. // test vector input registers
    15. reg CLK_50M;
    16. reg RST_N;
    17. // wires
    18. wire LED1;// assign statements (if any)
    19. verilog_frist i1 (
    20. // port map - connection between master ports and signals/registers
    21. .CLK_50M(CLK_50M),
    22. .LED1(LED1),
    23. .RST_N(RST_N)
    24. );
    25. initial
    26. begin
    27. // code that executes only once
    28. // insert code here --> begin
    29. #0 CLK_50M =1'b0; //时钟初始化为 1
    30. #10000 RST_N =1'b0; //延时 10ns,低电平复位
    31. #10000 RST_N =1'b1; //延时 10ns,RST_N 为高电平
    32. #100000000 $stop; //延时 0.1ms,停止仿真
    33. // --> end
    34. end
    35. always #10000
    36. begin
    37. CLK_50M=~CLK_50M;
    38. end
    39. endmodule