Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // DESCRIPTION: Verilator: Systemverilog example module
- // with interface to switch buttons, LEDs, LCD and register display
- parameter NINSTR_BITS = 32;
- parameter NBITS_TOP = 8, NREGS_TOP = 32;
- module top(input logic clk_2,
- input logic [NBITS_TOP-1:0] SWI,
- output logic [NBITS_TOP-1:0] LED,
- output logic [NBITS_TOP-1:0] SEG,
- output logic [NINSTR_BITS-1:0] lcd_instruction,
- output logic [NBITS_TOP-1:0] lcd_registrador [0:NREGS_TOP-1],
- output logic [NBITS_TOP-1:0] lcd_pc, lcd_SrcA, lcd_SrcB,
- lcd_ALUResult, lcd_Result, lcd_WriteData, lcd_ReadData,
- output logic lcd_MemWrite, lcd_Branch, lcd_MemtoReg, lcd_RegWrite);
- logic [1:0] clock;
- always_ff @(posedge clk_2) begin clock += 1; end
- logic reset;
- logic cartao;
- logic [2:0] value;
- always_comb begin reset <= SWI[0]; value <= SWI[6:4]; SEG[7] <= clock[1]; cartao <= SWI[1]; end
- int estado_atual;
- int tentativas;
- /*
- * q0 - estado base cartao nao inserido
- * q1 - o cartao foi inserido esperando um 1
- * q2 - o cartao foi inserido esperando um 3
- * q3 - o cartao foi inserido esperando um 7
- * qs - o cartao gerou sucesso
- * qf - numero de tentativas passou de 3 gera erro
- */
- parameter q0 = 0, q1 = 1, q2 = 2, q3 = 3, qs = 4, qf = 5;
- logic destruir, sacar;
- always_ff @(posedge clock[1] or posedge reset) begin
- if(reset) begin
- tentativas = 0;
- estado_atual <= q0;
- sacar <= 0;
- destruir <= 0;
- end
- else begin
- unique case(estado_atual)
- q0: begin
- if(cartao) begin
- estado_atual <= q1;
- tentativas = 1; // se inserir-se o cartão, já estará acontecendo a primeira tentativa
- end
- end
- q1: begin
- if(tentativas > 3) begin
- estado_atual <= qf; // gera o estado de erro
- end
- else if(value == 1) begin
- estado_atual <= q2; // passa para o proximo estado
- end
- else if(value != 0) begin // se algo que não seja 0(valor "padrao" do estado dos SWI) ou 1
- tentativas += 1; // incrementa-se o contador
- estado_atual <= q1; // mantem-se no mesmo estado
- end
- end
- q2: begin
- if(tentativas > 3) begin
- estado_atual <= qf;
- end
- else if(value == 3) begin
- estado_atual <= q3;
- end
- else if(value != 0 && value != 1) begin
- tentativas += 1;
- estado_atual <= q1;
- end
- end
- q3: begin
- if(tentativas > 3) begin
- estado_atual <= qf;
- end
- else if(value == 7) begin
- estado_atual <= qs;
- end
- else if(value != 0 && value != 1 && value != 3) begin
- tentativas += 1;
- estado_atual <= q1;
- end
- end
- qs: begin
- sacar <= 1;
- end
- qf: begin
- destruir <= 1;
- end
- endcase
- end
- end
- always_comb begin
- LED[0] <= sacar;
- LED[1] <= destruir;
- unique case(tentativas) // Codigo adicional para vericar o numero de tentativas
- 0 : begin SEG[6:0] <= 'b0111111; end
- 1 : begin SEG[6:0] <= 'b0000110; end
- 2 : begin SEG[6:0] <= 'b1011011; end
- 3 : begin SEG[6:0] <= 'b1001111; end
- 4 : begin SEG[6:0] <= 'b1100110; end
- 5 : begin SEG[6:0] <= 'b1101101; end
- 6 : begin SEG[6:0] <= 'b1111101; end
- 7 : begin SEG[6:0] <= 'b0000111; end
- 8 : begin SEG[6:0] <= 'b1111111; end
- 9 : begin SEG[6:0] <= 'b1100111; end
- endcase
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement