pwm_control_demo.v 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. `timescale 1ns/1ps
  2. module pwm_control_demo (
  3. input wire clk,
  4. input wire reset_n,
  5. // Control command: -128 .. +127
  6. input wire signed [7:0] cmd,
  7. // Safety/control signals
  8. input wire enable,
  9. input wire fault,
  10. // Observable internal results
  11. output reg signed [7:0] limited_cmd,
  12. output reg direction,
  13. output reg [6:0] duty,
  14. // Actual PWM waveform
  15. output wire pwm_out
  16. );
  17. // 0..99 PWM carrier counter
  18. reg [6:0] pwm_counter;
  19. // ---------------------------------------------------------
  20. // 1. Saturation limiter: command limited to -90 .. +90
  21. // 2. Sign -> direction
  22. // 3. Absolute value -> PWM duty
  23. // ---------------------------------------------------------
  24. always @(*) begin
  25. if (cmd > 8'sd90)
  26. limited_cmd = 8'sd90;
  27. else if (cmd < -8'sd90)
  28. limited_cmd = -8'sd90;
  29. else
  30. limited_cmd = cmd;
  31. if (limited_cmd < 0) begin
  32. direction = 1'b1; // reverse
  33. duty = -limited_cmd;
  34. end else begin
  35. direction = 1'b0; // forward
  36. duty = limited_cmd;
  37. end
  38. end
  39. // ---------------------------------------------------------
  40. // PWM carrier: 0,1,2 ... 99,0,1...
  41. // ---------------------------------------------------------
  42. always @(posedge clk or negedge reset_n) begin
  43. if (!reset_n)
  44. pwm_counter <= 7'd0;
  45. else if (pwm_counter == 7'd99)
  46. pwm_counter <= 7'd0;
  47. else
  48. pwm_counter <= pwm_counter + 1'b1;
  49. end
  50. // ---------------------------------------------------------
  51. // PWM output
  52. //
  53. // duty=25 -> 25 high clocks / 100 clocks = 25%
  54. //
  55. // enable=0 or fault=1 -> PWM forced OFF
  56. // ---------------------------------------------------------
  57. assign pwm_out =
  58. reset_n &&
  59. enable &&
  60. !fault &&
  61. (pwm_counter < duty);
  62. endmodule
  63. //CI rollout test
  64. //automatic trigger test
  65. // poll scm trigger test
  66. // argo events test
  67. // full automatic ci test
  68. // webhook delivery test