malixds_

Untitled

Jun 3rd, 2023
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.66 KB | None | 0 0
  1. module fsm #(parameter UDW = 1_048_576) // Resolution for duty cycle
  2. (
  3. input PS2_CLK,
  4. input PS2_DATA,
  5. input CLK,
  6. output [2:0] RGB
  7. );
  8.  
  9. wire PS2_R_O;
  10. wire [3:0] flags;
  11. wire [7:0] PS2_OUT;
  12.  
  13. reg [$clog2(UDW)-1:0] PWM_IN_R;
  14. reg [$clog2(UDW)-1:0] PWM_IN_G;
  15. reg [$clog2(UDW)-1:0] PWM_IN_B;
  16.  
  17. reg [$clog2(100_000)-1:0] PWM_IN_R_TEMPLATE;
  18. reg [$clog2(100_000)-1:0] PWM_IN_G_TEMPLATE;
  19. reg [$clog2(100_000)-1:0] PWM_IN_B_TEMPLATE;
  20.  
  21. reg [$clog2(COUNTER_BOUND)+20:0] transition_rate;
  22. reg [$clog2(700_000):0] brightness;
  23.  
  24. parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4, S5 = 5, S6 = 6;
  25. parameter COLOR_LOWER_BOUND = 0, COLOR_UPPER_BOUND = 10_000;
  26. parameter COUNTER_BOUND = 10000;
  27.  
  28. reg [2:0] state;
  29. reg [2:0] color;
  30. reg RST;
  31. reg [$clog2(UDW)-1:0] counter;
  32. reg [$clog2(300_000):0] brightness_rate;
  33.  
  34.  
  35. initial begin
  36. PWM_IN_R_TEMPLATE = COLOR_UPPER_BOUND;
  37. PWM_IN_G_TEMPLATE = 0;
  38. PWM_IN_B_TEMPLATE = 0;
  39. PWM_IN_R = 0;
  40. PWM_IN_G = 0;
  41. PWM_IN_B = 0;
  42. state = S0;
  43. RST = 0;
  44. brightness = 0;
  45. transition_rate = 1;
  46. brightness_rate = 1;
  47. counter = 0;
  48. end
  49.  
  50. always@(posedge CLK) begin
  51. if (PS2_R_O) begin
  52. case(PS2_OUT)
  53. // down
  54. 8'hFE:
  55. transition_rate <= transition_rate + COUNTER_BOUND / 1000 ;
  56. // right
  57. 8'hFF:
  58. brightness_rate <= brightness_rate + 25_000;
  59. endcase
  60. end
  61. end
  62.  
  63. // changing color
  64. always@(posedge CLK) begin
  65.  
  66. if (counter > COUNTER_BOUND) begin
  67. counter <= 0;
  68. /*
  69. * 100 to 110
  70. * 110 to 010
  71. * 010 to 011
  72. * 011 to 001
  73. * 001 to 101
  74. * 101 to 100
  75. */
  76. case(state)
  77. // 100 to 110
  78. S0: begin
  79. PWM_IN_R_TEMPLATE <= PWM_IN_R_TEMPLATE;
  80. PWM_IN_G_TEMPLATE <= PWM_IN_G_TEMPLATE + 1;
  81. PWM_IN_B_TEMPLATE <= 0;
  82.  
  83. if (PWM_IN_G_TEMPLATE >= COLOR_UPPER_BOUND)
  84. state <= S1;
  85. end
  86. // 110 to 010
  87. S1: begin
  88. PWM_IN_R_TEMPLATE <= PWM_IN_R_TEMPLATE - 1;
  89. PWM_IN_G_TEMPLATE <= PWM_IN_G_TEMPLATE;
  90. PWM_IN_B_TEMPLATE <= 0;
  91.  
  92. if (PWM_IN_R_TEMPLATE <= COLOR_LOWER_BOUND)
  93. state <= S2;
  94. end
  95. // 010 to 011
  96. S2: begin
  97. PWM_IN_R_TEMPLATE <= 0;
  98. PWM_IN_G_TEMPLATE <= PWM_IN_G_TEMPLATE;
  99. PWM_IN_B_TEMPLATE <= PWM_IN_B_TEMPLATE + 1;
  100.  
  101. if (PWM_IN_B_TEMPLATE >= COLOR_UPPER_BOUND)
  102. state <= S3;
  103. end
  104. // 011 to 001
  105. S3: begin
  106. PWM_IN_R_TEMPLATE <= 0;
  107. PWM_IN_G_TEMPLATE <= PWM_IN_G_TEMPLATE - 1;
  108. PWM_IN_B_TEMPLATE <= PWM_IN_B_TEMPLATE;
  109.  
  110. if (PWM_IN_G_TEMPLATE <= COLOR_LOWER_BOUND)
  111. state <= S4;
  112. end
  113. // 001 to 101
  114. S4: begin
  115. PWM_IN_R_TEMPLATE <= PWM_IN_R_TEMPLATE + 1;
  116. PWM_IN_G_TEMPLATE <= 0;
  117. PWM_IN_B_TEMPLATE <= PWM_IN_B_TEMPLATE;
  118.  
  119. if (PWM_IN_R_TEMPLATE >= COLOR_UPPER_BOUND)
  120. state <= S5;
  121. end
  122. // 101 to 100
  123. S5: begin
  124. PWM_IN_R_TEMPLATE <= PWM_IN_R_TEMPLATE;
  125. PWM_IN_G_TEMPLATE <= 0;
  126. PWM_IN_B_TEMPLATE <= PWM_IN_B_TEMPLATE - 1;
  127.  
  128. if (PWM_IN_B_TEMPLATE <= COLOR_LOWER_BOUND)
  129. state <= S0;
  130. end
  131. endcase
  132. /*
  133. case(state)
  134. // 100 TO 110
  135. S0: begin
  136. PWM_IN_R <= PWM_IN_R_TEMPLATE + 100_000;
  137. PWM_IN_G <= PWM_IN_G_TEMPLATE + 100_000;
  138. PWM_IN_B <= 0;
  139. end
  140. // 110 to 010
  141. S1: begin
  142. PWM_IN_R <= PWM_IN_R_TEMPLATE + 100_000;
  143. PWM_IN_G <= PWM_IN_G_TEMPLATE + 100_000;
  144. PWM_IN_B <= 0;
  145. end
  146. // 010 to 011
  147. S2: begin
  148. PWM_IN_R <= 0;
  149. PWM_IN_G <= PWM_IN_G_TEMPLATE + 100_000;
  150. PWM_IN_B <= PWM_IN_B_TEMPLATE + 100_000;
  151. end
  152. // 011 to 001
  153. S3: begin
  154. PWM_IN_R <= 0;
  155. PWM_IN_G <= PWM_IN_G_TEMPLATE + 100_000;
  156. PWM_IN_B <= PWM_IN_B_TEMPLATE + 100_000;
  157. end
  158. // 001 to 101
  159. S4: begin
  160. PWM_IN_R <= PWM_IN_R_TEMPLATE + 100_000;
  161. PWM_IN_G <= 0;
  162. PWM_IN_B <= PWM_IN_B_TEMPLATE + 100_000;
  163. end
  164. // 101 to 100
  165. S5: begin
  166. PWM_IN_R <= PWM_IN_R_TEMPLATE + 100_000;
  167. PWM_IN_G <= 0;
  168. PWM_IN_B <= PWM_IN_B_TEMPLATE + 100_000;
  169. end
  170. endcase
  171. */
  172. end
  173. else
  174. counter <= counter + 1;
  175. end
  176.  
  177.  
  178. always@(posedge CLK) begin
  179. brightness <= brightness + brightness_rate;
  180. PWM_IN_R <= PWM_IN_R_TEMPLATE;
  181. PWM_IN_G <= PWM_IN_G_TEMPLATE;
  182. PWM_IN_B <= PWM_IN_B_TEMPLATE;
  183. end
  184.  
  185.  
  186. PWM_FSM #($clog2(UDW)) pwm_fsm_RED(
  187. .CLK(CLK),
  188. .RST(RST),
  189. .CE(1'b1),
  190. .PWM_IN(PWM_IN_B),
  191. .PWM_P(RGB[0])
  192. );
  193. PWM_FSM #($clog2(UDW)) pwm_fsm_GREEN(
  194. .CLK(CLK),
  195. .RST(RST),
  196. .CE(1'b1),
  197. .PWM_IN(PWM_IN_G),
  198. .PWM_P(RGB[1])
  199. );
  200. PWM_FSM #($clog2(UDW)) pwm_fsm_BLUE (
  201. .CLK(CLK),
  202. .RST(RST),
  203. .CE(1'b1),
  204. .PWM_IN(PWM_IN_R),
  205. .PWM_P(RGB[2])
  206. );
  207.  
  208.  
  209. PS2_Controller controller (.clk(CLK), .PS2_dat(PS2_DATA), .PS2_clk(PS2_CLK), .R_O(PS2_R_O), .out(PS2_OUT), .flags(flags));
  210. endmodule
  211.  
Add Comment
Please, Sign In to add comment