/* Pontificia Universidade Catolica do Rio Grande do Sul Projeto PISH Sub-projeto Prototipacao Responsavel: Prof. Ney Calazans Implementacao de uma Unidade Logica e Aritmetica (ULA) de 16 operacoes Autores: Eduardo Augusto Bezerra Luciano Minuzzi Data da ultima alteracao: 27/03/97 Alterado por: Eduardo Augusto Bezerra */ /* * Target board definition */ const spec alu74181 = { fpga_type = "Xilinx4000", fpga_chip = "4003APC84-6", /*clock_pad = "P13", */ /* Estamos utilizando gerador interno de clock */ not_error_pad = "", finish_pad = "", carry_weight = "50", /* routing parameter */ critical_weight = "100", /* routing parameter */ osc4_divider = "F8M", /* 500 kHz clock */ }; /* output to row of leds */ const spec leds = { data = { "P61", "P62", "P65", "P66", "P57", "P58", "P59", "P60" } }; /* output to left-hand seven segment display DISPB */ const spec seg7a = { data = { "P39", "P38", "P36", "P35", "P29", "P40", "P44", "P37" } }; /* input RESET */ const spec sw_reset = { data = { "P56" } }; /* input SHOW */ const spec sw_show = { data = { "P18" } }; /* input M */ const spec sw_m = { data = { "P25" } }; /* input CN */ const spec sw_cn = { data = { "P26" } }; /* input OPCODE */ const spec sw_opcode = { data = { "P19", "P20", "P23", "P24" } }; /* input OPERA */ const spec sw_opera = { data = { "P3", "P4", "P5", "P6" } }; /* input OPERB */ const spec sw_operb = { data = { "P7", "P8", "P9", "P10" } }; const dw = 4; const aw = 1; void main(target = alu74181, port (out) led_array = leds, port (out) seven_one = seg7a, port (in) reset = sw_reset, port (in) show = sw_show, port (in) m = sw_m, port (in) cn = sw_cn, port (in) opcode = sw_opcode, port (in) opera = sw_opera, port (in) operb = sw_operb) { int a, b, c, f, aux7 : dw; int mode, aux, equal, x, y, c4, cin : aw; int display : 8; int auxdisp : 6; while(true) { opera ? a; operb ? b; opcode ? c; m ? mode; cn ? cin; if (mode == 1) /* logica */ case(c) { 0 : f = ~a; 1 : f = ~(a & b); 2 : f = ~a | b; 3 : f = 1; 4 : f = ~(a | b); 5 : f = ~b; 6 : f = ~(((~a) & b) | (a & (~b))); 7 : f = a | ~b; 8 : f = ~(a) & b; 9 : f = ((~a) & b) | (a & (~b)); 10 : f = b; 11 : f = a | b; 12 : f = 0; 13 : f = a & (~b); 14 : f = a & b; 15 : f = a; } else /* aritmetica */ case(c) { 0 : f = a - 1 + cin; 1 : f = (a & b) - 1 + cin; 2 : f = (a & (~b)) - 1 + cin; 3 : f = - 1 + cin; /* complemento 2 ??*/ 4 : f = a + (a | (~b)) + cin; 5 : f = (a & b) + (a | (~b)) + cin; 6 : f = a - b - 1 + cin; 7 : f = (a | (~b)) + cin; 8 : f = a + (a | b) + cin; 9 : f = a + b + cin; 10 : f = (a & (~b)) + (a | b) + cin; 11 : f = (a | b) + cin; 12 : f = a + a + a + cin; 13 : f = (a & b) + a + cin; 14 : f = (a & (~b)) + a + cin; 15 : f = a + cin; } equal = (f == 15); /* Alterar as linhas abaixo na versao final */ c4 = 0; x = 0; y = 0; /* coloca em auxdisp: /M /CN equal y c4 x */ auxdisp = ((((~mode @ ~cin) @ equal) @ y) @ c4) @ x; void prep_disp() { case (aux7) { 0 : display = 0b00000011; 1 : display = 0b10011111; 2 : display = 0b00100101; 3 : display = 0b00001101; 4 : display = 0b10011001; 5 : display = 0b01001001; 6 : display = 0b01000001; 7 : display = 0b00011111; 8 : display = 0b00000001; 9 : display = 0b00011001; 10 : display = 0b00010001; 11 : display = 0b11000001; 12 : display = 0b01100011; 13 : display = 0b10000101; 14 : display = 0b01100001; 15 : display = 0b01110001; } } /********** opcode **********/ show ? aux; aux7 = c; prep_disp(); seven_one ! display; /* manda p/ led: 0 0 /M /CN equal y c4 x */ display = 0b00 @ auxdisp; led_array ! display; /********** operando A **********/ show ? aux; aux7 = opera; prep_disp(); seven_one ! display; /* manda p/ led: 0 1 /M /CN equal y c4 x */ display = 0b01 @ auxdisp; led_array ! display; /********** operando B **********/ show ? aux; aux7 = operb; prep_disp(); seven_one ! display; /* manda p/ led: 1 0 /M /CN equal y c4 x */ display = 0b10 @ auxdisp; led_array ! display; /********** resultado da operacao **********/ show ? aux; aux7 = f; prep_disp(); seven_one ! display; /* manda p/ led: 1 1 /M /CN equal y c4 x */ display = 0b11 @ auxdisp; led_array ! display; } }