Advertisement
STANAANDREY

aha tot

Jan 9th, 2025 (edited)
1,367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 10.64 KB | None | 0 0
  1. // SRAM module for storing control code
  2. module control_code_sram (
  3.     input wire clk,
  4.     input wire write_enable,
  5.     input wire [2:0] data_in,    // Control code input
  6.     output reg [2:0] data_out    // Stored control code
  7. );
  8.     reg [2:0] memory;
  9.  
  10.     always @(posedge clk) begin
  11.         if (write_enable) begin
  12.             memory <= data_in;
  13.         end
  14.         data_out <= memory;
  15.     end
  16. endmodule
  17.  
  18. // SRAM module for storing stop time
  19. module stop_time_sram (
  20.     input wire clk,
  21.     input wire write_enable,
  22.     input wire [3:0] hours_tens,
  23.     input wire [3:0] hours_ones,
  24.     input wire [2:0] mins_tens,
  25.     input wire [3:0] mins_ones,
  26.     input wire [3:0] secs_tens,
  27.     input wire [3:0] secs_ones,
  28.     output reg [23:0] stored_time    // Packed time format
  29. );
  30.     reg [23:0] memory;
  31.  
  32.     always @(posedge clk) begin
  33.         if (write_enable) begin
  34.             memory <= {hours_tens, hours_ones, mins_tens, mins_ones, secs_tens, secs_ones};
  35.         end
  36.         stored_time <= memory;
  37.     end
  38. endmodule
  39.  
  40. // Control module for clock operations
  41. module clock_control(
  42.     input wire [2:0] control_code,
  43.     input wire reset_n,
  44.     input wire clk,
  45.     input wire [23:0] stored_stop_time,
  46.     input wire [3:0] current_hours_tens,
  47.     input wire [3:0] current_hours_ones,
  48.     input wire [2:0] current_mins_tens,
  49.     input wire [3:0] current_mins_ones,
  50.     input wire [3:0] current_secs_tens,
  51.     input wire [3:0] current_secs_ones,
  52.     output reg clock_enable,
  53.     output reg clear_time,
  54.     output reg store_stop_time
  55. );
  56.     // Control codes
  57.     parameter NO_CHANGE = 3'b000;
  58.     parameter START     = 3'b001;
  59.     parameter STOP      = 3'b010;
  60.     parameter STOP_CLR  = 3'b011;
  61.  
  62.     // State register
  63.     reg stopped_state;
  64.     wire [23:0] current_time;
  65.    
  66.     assign current_time = {current_hours_tens, current_hours_ones,
  67.                           current_mins_tens, current_mins_ones,
  68.                           current_secs_tens, current_secs_ones};
  69.  
  70.     always @(posedge clk or negedge reset_n) begin
  71.         if (!reset_n) begin
  72.             clock_enable <= 0;
  73.             clear_time <= 0;
  74.             stopped_state <= 0;
  75.             store_stop_time <= 0;
  76.         end else begin
  77.             store_stop_time <= 0; // Default value
  78.            
  79.             case (control_code)
  80.                 START: begin
  81.                     clock_enable <= 1;
  82.                     clear_time <= (stopped_state && control_code == STOP_CLR) ? 1 : 0;
  83.                 end
  84.                 STOP: begin
  85.                     store_stop_time <= 1;
  86.                     clock_enable <= 0;
  87.                     stopped_state <= 0;
  88.                 end
  89.                 STOP_CLR: begin
  90.                     clock_enable <= 0;
  91.                     stopped_state <= 1;
  92.                 end
  93.                 default: begin // NO_CHANGE
  94.                     clear_time <= 0;
  95.                     if (current_time == stored_stop_time && control_code == STOP) begin
  96.                         clock_enable <= 0;
  97.                     end
  98.                 end
  99.             endcase
  100.         end
  101.     end
  102. endmodule
  103.  
  104. // Clock divider module
  105. module clock_divider #(
  106.     parameter CLK_HZ = 50000000
  107. )(
  108.     input  wire clk_in,
  109.     input  wire reset_n,
  110.     input  wire enable,
  111.     output reg  sec_pulse
  112. );
  113.     parameter CYCLES_PER_10ms = 50_000/2;
  114.     parameter TICKS_PER_SEC = 1000;
  115.    
  116.     reg [15:0] cycleCnt = 0;
  117.     reg [9:0] timeCnt = 0;
  118.  
  119.     always @(posedge clk_in or negedge reset_n) begin
  120.         if (!reset_n) begin
  121.             cycleCnt <= 0;
  122.             timeCnt <= 0;
  123.             sec_pulse <= 0;
  124.         end else if (enable) begin
  125.             if (cycleCnt == CYCLES_PER_10ms - 1) begin
  126.                 cycleCnt <= 0;
  127.                 timeCnt <= timeCnt + 1;
  128.                 if (timeCnt == TICKS_PER_SEC - 1) begin
  129.                     timeCnt <= 0;
  130.                     sec_pulse <= ~sec_pulse;
  131.                 end
  132.             end else begin
  133.                 cycleCnt <= cycleCnt + 1;
  134.             end
  135.         end
  136.     end
  137. endmodule
  138.  
  139. // Seconds counter module
  140. module seconds_counter(
  141.     input  wire       clk,
  142.     input  wire       reset_n,
  143.     input  wire       sec_pulse,
  144.     input  wire       clear,
  145.     output reg [3:0]  ones,
  146.     output reg [3:0]  tens,
  147.     output reg        min_pulse
  148. );
  149.     always @(posedge clk or negedge reset_n) begin
  150.         if (!reset_n || clear) begin
  151.             ones <= 0;
  152.             tens <= 0;
  153.             min_pulse <= 0;
  154.         end else if (sec_pulse) begin
  155.             min_pulse <= 0;
  156.             if (ones < 9) begin
  157.                 ones <= ones + 1;
  158.             end else begin
  159.                 ones <= 0;
  160.                 if (tens < 5) begin
  161.                     tens <= tens + 1;
  162.                 end else begin
  163.                     tens <= 0;
  164.                     min_pulse <= 1;
  165.                 end
  166.             end
  167.         end
  168.     end
  169. endmodule
  170.  
  171. // Minutes counter module
  172. module minutes_counter(
  173.     input  wire       clk,
  174.     input  wire       reset_n,
  175.     input  wire       min_pulse,
  176.     input  wire       clear,
  177.     output reg [3:0]  ones,
  178.     output reg [2:0]  tens,
  179.     output reg        hour_pulse
  180. );
  181.     always @(posedge clk or negedge reset_n) begin
  182.         if (!reset_n || clear) begin
  183.             ones <= 0;
  184.             tens <= 0;
  185.             hour_pulse <= 0;
  186.         end else if (min_pulse) begin
  187.             hour_pulse <= 0;
  188.             if (ones < 9) begin
  189.                 ones <= ones + 1;
  190.             end else begin
  191.                 ones <= 0;
  192.                 if (tens < 5) begin
  193.                     tens <= tens + 1;
  194.                 end else begin
  195.                     tens <= 0;
  196.                     hour_pulse <= 1;
  197.                 end
  198.             end
  199.         end
  200.     end
  201. endmodule
  202.  
  203. // Hours counter module (modified for 99 hours)
  204. module hours_counter(
  205.     input  wire       clk,
  206.     input  wire       reset_n,
  207.     input  wire       hour_pulse,
  208.     input  wire       clear,
  209.     output reg [3:0]  ones,
  210.     output reg [3:0]  tens
  211. );
  212.     always @(posedge clk or negedge reset_n) begin
  213.         if (!reset_n || clear) begin
  214.             ones <= 0;
  215.             tens <= 0;
  216.         end else if (hour_pulse) begin
  217.             if (tens == 9 && ones == 9) begin  // Reset at 99:59:59
  218.                 tens <= 0;
  219.                 ones <= 0;
  220.             end else if (ones < 9) begin
  221.                 ones <= ones + 1;
  222.             end else begin
  223.                 ones <= 0;
  224.                 tens <= tens + 1;
  225.             end
  226.         end
  227.     end
  228. endmodule
  229.  
  230. // Seven segment decoder module
  231. module seven_segment_decoder(
  232.     input  wire [3:0] digit,
  233.     output reg  [6:0] segments
  234. );
  235.     always @(*) begin
  236.         case(digit)
  237.             4'h0: segments = 7'b1000000;
  238.             4'h1: segments = 7'b1111001;
  239.             4'h2: segments = 7'b0100100;
  240.             4'h3: segments = 7'b0110000;
  241.             4'h4: segments = 7'b0011001;
  242.             4'h5: segments = 7'b0010010;
  243.             4'h6: segments = 7'b0000010;
  244.             4'h7: segments = 7'b1111000;
  245.             4'h8: segments = 7'b0000000;
  246.             4'h9: segments = 7'b0010000;
  247.             default: segments = 7'b1111111;
  248.         endcase
  249.     end
  250. endmodule
  251.  
  252. // Top module
  253. module clock_with_display #(
  254.     parameter CLK_HZ = 50000000
  255. )(
  256.     input  wire       clk_in,
  257.     input  wire       reset_n,
  258.     input  wire [2:0] control_code,
  259.     input  wire       control_code_write_enable,  // New input for control code SRAM
  260.     output wire [6:0] HEX0,    // Seconds ones
  261.     output wire [6:0] HEX1,    // Seconds tens
  262.     output wire [6:0] HEX2,    // Minutes ones
  263.     output wire [6:0] HEX3,    // Minutes tens
  264.     output wire [6:0] HEX4,    // Hours ones
  265.     output wire [6:0] HEX5     // Hours tens
  266. );
  267.     // Internal signals
  268.     wire sec_pulse, min_pulse, hour_pulse;
  269.     wire [3:0] sec_ones, sec_tens;
  270.     wire [3:0] min_ones;
  271.     wire [2:0] min_tens;
  272.     wire [3:0] hour_ones;
  273.     wire [3:0] hour_tens;
  274.     wire clock_enable, clear_time;
  275.     wire store_stop_time;
  276.     wire [2:0] stored_control_code;
  277.     wire [23:0] stored_stop_time;
  278.  
  279.     // Control code SRAM instance
  280.     control_code_sram control_mem (
  281.         .clk(clk_in),
  282.         .write_enable(control_code_write_enable),
  283.         .data_in(control_code),
  284.         .data_out(stored_control_code)
  285.     );
  286.  
  287.     // Stop time SRAM instance
  288.     stop_time_sram stop_time_mem (
  289.         .clk(clk_in),
  290.         .write_enable(store_stop_time),
  291.         .hours_tens(hour_tens),
  292.         .hours_ones(hour_ones),
  293.         .mins_tens(min_tens),
  294.         .mins_ones(min_ones),
  295.         .secs_tens(sec_tens),
  296.         .secs_ones(sec_ones),
  297.         .stored_time(stored_stop_time)
  298.     );
  299.  
  300.     // Clock control instance
  301.     clock_control ctrl (
  302.         .clk(clk_in),
  303.         .reset_n(reset_n),
  304.         .control_code(stored_control_code),
  305.         .stored_stop_time(stored_stop_time),
  306.         .current_hours_tens(hour_tens),
  307.         .current_hours_ones(hour_ones),
  308.         .current_mins_tens(min_tens),
  309.         .current_mins_ones(min_ones),
  310.         .current_secs_tens(sec_tens),
  311.         .current_secs_ones(sec_ones),
  312.         .clock_enable(clock_enable),
  313.         .clear_time(clear_time),
  314.         .store_stop_time(store_stop_time)
  315.     );
  316.  
  317.     // Clock divider instance
  318.     clock_divider #(
  319.         .CLK_HZ(CLK_HZ)
  320.     ) clk_div (
  321.         .clk_in(clk_in),
  322.         .reset_n(reset_n),
  323.         .enable(clock_enable),
  324.         .sec_pulse(sec_pulse)
  325.     );
  326.  
  327.     // Seconds counter instance
  328.     seconds_counter sec_cnt (
  329.         .clk(clk_in),
  330.         .reset_n(reset_n),
  331.         .sec_pulse(sec_pulse),
  332.         .clear(clear_time),
  333.         .ones(sec_ones),
  334.         .tens(sec_tens),
  335.         .min_pulse(min_pulse)
  336.     );
  337.  
  338.     // Minutes counter instance
  339.     minutes_counter min_cnt (
  340.         .clk(clk_in),
  341.         .reset_n(reset_n),
  342.         .min_pulse(min_pulse),
  343.         .clear(clear_time),
  344.         .ones(min_ones),
  345.         .tens(min_tens),
  346.         .hour_pulse(hour_pulse)
  347.     );
  348.  
  349.     // Hours counter instance
  350.     hours_counter hour_cnt (
  351.         .clk(clk_in),
  352.         .reset_n(reset_n),
  353.         .hour_pulse(hour_pulse),
  354.         .clear(clear_time),
  355.         .ones(hour_ones),
  356.         .tens(hour_tens)
  357.     );
  358.  
  359.     // Seven segment decoder instances
  360.     seven_segment_decoder seg0 (.digit(sec_ones),  .segments(HEX0));
  361.     seven_segment_decoder seg1 (.digit(sec_tens),  .segments(HEX1));
  362.     seven_segment_decoder seg2 (.digit(min_ones),  .segments(HEX2));
  363.     seven_segment_decoder seg3 (.digit({1'b0, min_tens}), .segments(HEX3));
  364.     seven_segment_decoder seg4 (.digit(hour_ones), .segments(HEX4));
  365.     seven_segment_decoder seg5 (.digit(hour_tens), .segments(HEX5));
  366.  
  367. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement