Advertisement
Guest User

LOAC-CARTAO

a guest
Nov 18th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // DESCRIPTION: Verilator: Systemverilog example module
  2. // with interface to switch buttons, LEDs, LCD and register display
  3.  
  4. parameter NINSTR_BITS = 32;
  5. parameter NBITS_TOP = 8, NREGS_TOP = 32;
  6. module top(input  logic clk_2,
  7.            input  logic [NBITS_TOP-1:0] SWI,
  8.            output logic [NBITS_TOP-1:0] LED,
  9.            output logic [NBITS_TOP-1:0] SEG,
  10.            output logic [NINSTR_BITS-1:0] lcd_instruction,
  11.            output logic [NBITS_TOP-1:0] lcd_registrador [0:NREGS_TOP-1],
  12.            output logic [NBITS_TOP-1:0] lcd_pc, lcd_SrcA, lcd_SrcB,
  13.              lcd_ALUResult, lcd_Result, lcd_WriteData, lcd_ReadData,
  14.            output logic lcd_MemWrite, lcd_Branch, lcd_MemtoReg, lcd_RegWrite);
  15.  
  16.  
  17. logic [1:0] clock;
  18. always_ff @(posedge  clk_2) begin clock += 1; end
  19.  
  20. logic reset;
  21. logic cartao;
  22. logic [2:0] value;
  23.  
  24. always_comb begin reset <= SWI[0]; value <= SWI[6:4]; SEG[7] <= clock[1]; cartao <= SWI[1]; end
  25.  
  26. int estado_atual;
  27. int tentativas;
  28.  
  29. /*
  30. * q0 - estado base cartao nao inserido
  31. * q1 - o cartao foi inserido esperando um 1
  32. * q2 - o cartao foi inserido esperando um 3
  33. * q3 - o cartao foi inserido esperando um 7
  34. * qs - o cartao gerou sucesso
  35. * qf - numero de tentativas passou de 3 gera erro
  36. */
  37. parameter q0 = 0, q1 = 1, q2 = 2, q3 = 3, qs = 4, qf = 5;
  38.  
  39.  
  40. logic destruir, sacar;
  41.  
  42. always_ff @(posedge clock[1] or posedge reset) begin
  43.    
  44.     if(reset) begin
  45.         tentativas = 0;
  46.         estado_atual <= q0;
  47.         sacar <= 0;
  48.         destruir <= 0;
  49.     end
  50.  
  51.     else begin
  52.        
  53.         unique case(estado_atual)
  54.            
  55.             q0: begin
  56.                 if(cartao) begin
  57.                     estado_atual <= q1;
  58.                     tentativas = 1; // se inserir-se o cartão, já estará acontecendo a primeira tentativa
  59.                 end
  60.             end
  61.             q1: begin
  62.                 if(tentativas > 3) begin
  63.                     estado_atual <= qf; // gera o estado de erro
  64.                 end
  65.                 else if(value == 1) begin
  66.                     estado_atual <= q2;  // passa para o proximo estado
  67.                 end
  68.                 else if(value != 0) begin // se algo que não seja 0(valor "padrao" do estado dos SWI) ou 1
  69.                     tentativas += 1;  // incrementa-se o contador
  70.                     estado_atual <= q1; // mantem-se no mesmo estado
  71.                 end
  72.             end
  73.             q2: begin
  74.                 if(tentativas > 3) begin
  75.                     estado_atual <= qf;
  76.                 end
  77.                 else if(value == 3) begin
  78.                     estado_atual <= q3;
  79.                 end
  80.                 else if(value != 0 && value != 1) begin
  81.                     tentativas += 1;
  82.                     estado_atual <= q1;
  83.                 end
  84.             end
  85.             q3: begin
  86.                 if(tentativas > 3) begin
  87.                     estado_atual <= qf;
  88.                 end
  89.                 else if(value == 7) begin
  90.                     estado_atual <= qs;
  91.                 end
  92.                 else if(value != 0 && value != 1 && value != 3) begin
  93.                     tentativas += 1;
  94.                     estado_atual <= q1;
  95.                 end
  96.             end
  97.             qs: begin
  98.                 sacar <= 1;
  99.             end
  100.             qf: begin
  101.                 destruir <= 1;
  102.             end
  103.         endcase
  104.     end
  105. end
  106.  
  107.  
  108.  
  109. always_comb begin
  110.     LED[0] <= sacar;
  111.     LED[1] <= destruir;
  112.     unique case(tentativas) // Codigo adicional para vericar o numero de tentativas
  113.             0 : begin SEG[6:0] <= 'b0111111; end
  114.             1 : begin SEG[6:0] <= 'b0000110; end
  115.             2 : begin SEG[6:0] <= 'b1011011; end
  116.             3 : begin SEG[6:0] <= 'b1001111; end
  117.             4 : begin SEG[6:0] <= 'b1100110; end
  118.             5 : begin SEG[6:0] <= 'b1101101; end
  119.             6 : begin SEG[6:0] <= 'b1111101; end
  120.             7 : begin SEG[6:0] <= 'b0000111; end
  121.             8 : begin SEG[6:0] <= 'b1111111; end
  122.             9 : begin SEG[6:0] <= 'b1100111; end
  123. endcase
  124. end
  125. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement