Advertisement
malixds_

Untitled

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