Advertisement
Guest User

main moj

a guest
Dec 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module main(
  2.     input wire clk,
  3.     input wire reset,
  4.     input wire start,
  5.     input wire  sw3,
  6.     input wire  sw2,
  7.     input wire  sw1,
  8.     input wire  [2:0] but,
  9.     output wire [6:0] hex0,
  10.     output wire [6:0] hex1,
  11.     output wire [6:0] hex2,
  12.     output wire [6:0] hex3,
  13.     output wire [3:0] led
  14. );
  15.  
  16. function automatic [6:0] BCDDecoder(input [3:0] digit);
  17.     begin
  18.         case(digit)
  19.             4'd0: BCDDecoder = 7'b1000000;
  20.             4'd1: BCDDecoder = 7'b1111001;
  21.             4'd2: BCDDecoder = 7'b0100100;
  22.             4'd3: BCDDecoder = 7'b0110000;
  23.             4'd4: BCDDecoder = 7'b0011001;
  24.             4'd5: BCDDecoder = 7'b0010010;
  25.             4'd6: BCDDecoder = 7'b0000010;
  26.             4'd7: BCDDecoder = 7'b1111000;
  27.             4'd8: BCDDecoder = 7'b0000000;
  28.             4'd9: BCDDecoder = 7'b0010000;
  29.             default: BCDDecoder = 7'b1111111;
  30.         endcase
  31.     end
  32. endfunction
  33.  
  34. wire b0, b1, b2;
  35. reg [15:0] seconds, seconds_next;
  36. reg [2:0] state_reg, state_next;
  37. parameter INICIJALIZACIJA = 3'b000;
  38. parameter ODBROJAVANJE = 3'b001;
  39. parameter ZAMRZNUTO = 3'b010;
  40. parameter TREPERENJE = 3'b011;
  41. reg [15:0] sifra_reg, sifra_next;
  42. reg [15:0] unos_reg, unos_next;
  43. //reg[6:0] disp0, disp0_next, disp1, disp1_next, disp2, disp2_next, disp3, disp3_next;
  44. reg[3:0] maska, maska_next;
  45. reg [3:0] duzina_sifre, duzina_sifre_next;
  46. reg[3:0] duzina_unosa, duzina_unosa_next;
  47. integer counter, counter_next;
  48. integer pokusaj, pokusaj_next;
  49. reg[3:0] ledg, ledg_next;
  50.  
  51. assign hex0 = BCDDecoder(seconds[3:0]);
  52. assign hex1 = BCDDecoder(seconds[7:4]);
  53. assign hex2 = BCDDecoder(seconds[11:8]);
  54. assign hex3 = BCDDecoder(seconds[15:12]);
  55. assign led = ledg;
  56. /*redge r0(
  57.     .clk(clk),
  58.     .reset(reset),
  59.     .data_in(but[0]),
  60.     .data_out(b0));
  61. redge r1(
  62.     .clk(clk),
  63.     .reset(reset),
  64.     .data_in(but[1]),
  65.     .data_out(b1));
  66. redge r2(
  67.     .clk(clk),
  68.     .reset(reset),
  69.     .data_in(but[2]),
  70.     .data_out(b2));*/
  71.    
  72. always @(posedge clk, posedge reset) begin
  73.     if(reset == 1) begin
  74.         state_reg <= INICIJALIZACIJA;
  75.         seconds <= 16'h0000;
  76.         sifra_reg <= 16'h0000;
  77.         unos_reg <= 16'h0000;
  78.         duzina_sifre <= 0;
  79.         duzina_unosa <= 0;
  80.         counter <= 0;
  81.         maska <= 4'b0000;
  82.         pokusaj <= 0;
  83.         ledg <= 0;
  84.     end
  85.     else begin
  86.         state_reg <= state_next;
  87.         seconds <= seconds_next;
  88.         sifra_reg <= sifra_next;
  89.         unos_reg <= unos_next;
  90.         duzina_sifre <= duzina_sifre_next;
  91.         duzina_unosa <= duzina_unosa_next;
  92.         counter <= counter_next;
  93.         maska <= maska_next;
  94.         pokusaj <= pokusaj_next;
  95.         ledg <= ledg_next;
  96.     end
  97. end
  98. integer i;
  99. always @(*) begin
  100.     state_next = state_reg;
  101.     seconds_next = seconds;
  102.     sifra_next = sifra_reg;
  103.     unos_next = unos_reg;
  104.     duzina_sifre_next = duzina_sifre;
  105.     duzina_unosa_next = duzina_unosa;
  106.     counter_next = counter;
  107.     maska_next = maska;
  108.     pokusaj_next = pokusaj;
  109.     ledg_next = ledg;
  110.     case(state_reg)
  111.         INICIJALIZACIJA: begin
  112.                 if(sw3 == 1) begin
  113.                     seconds_next = 16'h9999;
  114.                     maska_next = 4'b1111;
  115.                 end
  116.                 else if(sw2 == 1) begin
  117.                     seconds_next = 16'h0999;
  118.                     maska_next = 4'b0111;
  119.                 end
  120.                 else if (sw1 == 1) begin
  121.                     seconds_next = 16'h0099;
  122.                     maska_next = 4'b0011;
  123.                 end
  124.                 else begin
  125.                     seconds_next = 16'h0009;
  126.                     maska_next = 4'b0001;
  127.                 end
  128.             //endcase
  129.             if(but[0] == 1) begin
  130.                 sifra_next[15:0] = {sifra_reg[13:0], 2'b01};
  131.                 duzina_sifre_next = (duzina_sifre == 8) ? 8 : duzina_sifre + 1;
  132.             end
  133.             if(but[1] == 1) begin
  134.                 sifra_next[15:0] = {sifra_reg[13:0], 2'b10};
  135.                 duzina_sifre_next = (duzina_sifre == 8) ? 8 : duzina_sifre + 1;
  136.             end
  137.             if(but[2] == 1) begin
  138.                 sifra_next[15:0] = {sifra_reg[13:0], 2'b11};
  139.                 duzina_sifre_next = (duzina_sifre == 8) ? 8 : duzina_sifre + 1;
  140.             end
  141.             if(start == 1) begin
  142.                 state_next = ODBROJAVANJE;
  143.                 counter_next = 0;
  144.             end
  145.         end
  146.         ODBROJAVANJE: begin
  147.             if(counter == 49_999_999) begin
  148.                 counter_next = 0;
  149.                 begin: loop;
  150.                     for(i=0; i<4; i = i+1) begin
  151.                         if (seconds[4*i+3-:4] == 0) begin
  152.                             if(maska > 2**i) begin
  153.                                 seconds_next[4*i+3-:4] <= 9;
  154.                                 maska_next[i] = 1;
  155.                             end
  156.                             else seconds_next[4*i+3-:4] <= 0;
  157.                         end
  158.                         else begin
  159.                             seconds_next[4*i+3-:4] <= seconds[4*i+3-:4] - 1;
  160.                             if(seconds[4*i+3-:4] - 1 == 0) maska_next[i] = 0;
  161.                             disable loop;
  162.                         end;
  163.                     end
  164.                 end
  165.             end
  166.             else counter_next = counter + 1;
  167.            
  168.             if(duzina_sifre == duzina_unosa && duzina_sifre != 0) begin
  169.                 if(sifra_reg == unos_reg) state_next = ZAMRZNUTO;
  170.                 else if(pokusaj + 1 == 4) begin
  171.                         state_next = TREPERENJE;
  172.                         ledg_next = 4'b1111;
  173.                     end
  174.                     else begin
  175.                         pokusaj_next = pokusaj + 1;
  176.                         ledg_next = {ledg[2:0], 1'b1};
  177.                         unos_next = 16'h0000;
  178.                         duzina_unosa_next = 0;
  179.                     end
  180.             end else begin
  181.             if(but[0] == 1) begin
  182.                 unos_next[15:0] = {unos_reg[13:0], 2'b01};
  183.                 duzina_unosa_next = duzina_unosa + 1;
  184.             end
  185.             if(but[1] == 1) begin
  186.                 unos_next[15:0] = {unos_reg[13:0], 2'b10};
  187.                 duzina_unosa_next = duzina_unosa + 1;
  188.             end
  189.             if(but[2] == 1) begin
  190.                 unos_next[15:0] = {unos_reg[13:0], 2'b11};
  191.                 duzina_unosa_next = duzina_unosa + 1;
  192.             end
  193.             end
  194.         end
  195.         ZAMRZNUTO: begin
  196.             seconds_next = seconds;
  197.         end
  198.         TREPERENJE: begin
  199.             if(counter < 24_999_999) seconds_next = 16'h0000;
  200.             else seconds_next = 16'h8888;
  201.             if(counter == 49_999_999) counter_next = 0;
  202.             else counter_next = counter + 1;
  203.         end
  204.     endcase
  205. end
  206. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement