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);
- /*
- -- [FUNCIONA? SIM, FUNCIONA. PORÈM OS TIMES COM QUE AS COISAS ACONTECEM SÂO MUITO SINCRONIZADOS] --
- */
- logic [1:0] clock;
- logic reset;
- logic stop;
- logic passe1;
- logic passe2;
- always_comb begin
- stop <= SWI[7];
- reset <= SWI[6];
- passe1 <= SWI[0];
- passe2 <= SWI[1];
- end
- always_ff @(posedge clk_2) begin
- if(!stop) clock += 1;
- end
- int estado_atual;
- int dinheiro1;
- int dinheiro2;
- int dinheiroMostrado;
- int carrega1;
- int carrega2;
- logic mostrarDinheiro;
- logic catraca;
- int acionouCATRACA;
- parameter q0 = 0, q1 = 1;
- always_ff @(posedge clock[1]) begin
- carrega1 = SWI[3:2];
- carrega2 = SWI[5:4];
- if(reset) begin // resetar sistema
- catraca <= 0;
- dinheiro1 = 0;
- dinheiro1 = 0;
- dinheiroMostrado = 0;
- carrega1 = 0; carrega2 = 0; mostrarDinheiro <= 0; acionouCATRACA = 0;
- end
- else begin
- /*--[PARTE DO CODIGO PARA INCREMENTAR O CONTADOR DE CARGA]--*/
- if(!((carrega1 + dinheiro1) > 5)) begin
- dinheiro1 = dinheiro1 + carrega1; end
- if(!((carrega2 + dinheiro2) > 5)) begin
- dinheiro2 = dinheiro2 + carrega2; end
- /*INDENTIFICADOR DE ESTADO*/
- if(catraca) estado_atual = q1;
- else estado_atual = q0;
- /*CASO RESTRITO*/
- if(passe1 && passe2) begin
- end // [LINDO NADA AQUI PODEIA EU MELHORAR? CLARO]
- else begin
- unique case(estado_atual)
- q0: begin /* [CATRACA LIVRE] */
- dinheiroMostrado = 0;
- if(passe1 && (dinheiro1 > 0) && !catraca) begin //&& CATRACA PARA IMPEDIR QUE DUAS PESSOAS TENTEM PASSAR AO MESMO TEMPO
- catraca <= 1;
- acionouCATRACA = 1;
- estado_atual = q1;
- end
- else if(passe2 && (dinheiro2 > 0) && !catraca) begin
- catraca <= 1;
- acionouCATRACA = 2; /* O cara vai para catraca*/
- estado_atual = q1;
- end
- end
- q1: begin // --[A CATRACA FOI ACIONADA] --
- mostrarDinheiro <= 1;
- if(acionouCATRACA == 1) begin
- dinheiroMostrado = dinheiro1; //MOSTRA O DINHEIRO DO CARA
- if(!passe1) begin // SE O PASSE JA TIVER SIDO REMOVIDO
- dinheiro1 -= 1;
- catraca <= 0;
- estado_atual = q0; // SE O CARA SAIR DA CATRACA, RETORNA PARA O PRIMEIRO ESTADO
- end
- end
- else if(acionouCATRACA == 2) begin
- dinheiroMostrado = dinheiro2;
- if(!passe2) begin
- dinheiro2 -= 1;
- catraca <= 0;
- estado_atual = q0;
- end
- end
- end
- endcase
- end
- end
- end
- always_comb begin
- unique case(dinheiroMostrado)
- 0 : begin SEG[6:0] <= 'b0000000; 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] <= 'b1011011; end
- endcase
- LED[0] <= catraca;
- SEG[7] <= clock[1];
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement