PIC Opg 2 Løsning
Denne side gennemgår løsningen for PIC Opgave 2 - Gates
Løsningsforslag for Gates.
Generelt er alle løsningerne lavet med den sædvanlig opstartskode til en PIC16F684, og selve funktionen realiseret i et forever loop.
Opstartskoden kan ses generelt gennemgået i
Generelt så sættes der indgange og udgange op til de forskellige gates som vist her:
pin_A3_direction = input pin_A4_direction = input alias InA is pin_A3 alias InB is pin_A4 alias AND_out is pin_A0
De to indgange InA og InB genbruges til alle gates, mens der laves specielle udgange for hver gate.
Koden som jal-filer
Alle eksemplerne kan hentes i denne ZIP-fil.
Forskellige løsninger på AND-gate
Opgaven kan løses på mange måder, så i første omgang skitseres en løsning af en AND gate på 3 forskellige måder i koden
AND gate som kombination if-sætninger
Hele koden inde i forever-loopet ser ud som følgende:
35 -- Denne løsning bygger på kombination if-sætninger 36 if InA then 37 if InB then 38 AND_out = high 39 else 40 AND_out = low 41 end if 42 else 43 AND_out = low 44 end if
Linje 36 tester den ene indgang og linje 37 tester den anden indgang. Hvis begge indgange er sat, så skal AND gaten gå høj, som linje 38 sørger for.
Hvis InB ikke er høj, så vil linje 39-41 sørge for at udgangen sættes til lav (det skal gøres aktivt, ellers vil udgangen forblive høj, så længe den ikke sættes lav).
Hvis InA ikke er høj, så vil linje 42-44 sørge for at udgangen sættes til lav.
Koden ligger som opg2-and1.jal i denne ZIP-fil.
AND gate som logisk kombination inde i if-udtrykket
Man kan opstille mere komplekse udtryk i IF-betingelsen, så man faktisk AND'er de to indgange sammen, og laver IF-betingelsen på det.
Hele koden inde i forever-loopet ser ud som følgende:
35 -- Denne løsning bygger på logisk kombination inde i if-udtrykket 36 if InA & InB then 37 AND_out = high 38 else 39 AND_out = low 40 end if
Linje 36 er denne AND-kombination af InA og InB, og linje 37 sætter udgangen høj, hvis det er sandt, og linje 38-40 sørger for at sætte lavt, hvis det ikke er sandt.
Koden ligger som opg2-and2.jal i denne ZIP-fil.
AND gate som logiske bits
I JAL kan man regne med bits som et udtryk, og sætte et bit-resultat direkte på udgangen. Det gør at hele gaten kan realiseres med en linje kode.
Hele koden inde i forever-loopet ser ud som følgende:
35 -- Denne løsning bygger på at man kan arbejde logisk med bits 36 AND_out = InA & InB
Linje 36 er den linje hvor InA og InB bliver AND'et sammen, og resultatet lægges ud på AND_out
Koden ligger som opg2-and3.jal i denne ZIP-fil.
Forskellige løsninger på OR-gate
Opgaven kan løses på mange måder, men lige som ved AND gaten er OR gaten her løst på 3 forskellige måder i koden.
OR gate som kombination if-sætninger
Hele koden inde i forever-loopet ser ud som følgende:
36 -- Denne løsning bygger på kombination if-sætninger 37 if InA then 38 OR_out = high 39 else 40 if InB then 41 OR_out = high 42 else 43 OR_out = low 44 end if 45 end if
Koden ligger som opg2-or1.jal i denne ZIP-fil.
OR gate som logisk kombination inde i if-udtrykket
Man kan opstille mere komplekse udtryk i IF-betingelsen, så man faktisk OR'er de to indgange sammen, og laver IF-betingelsen på det.
Hele koden inde i forever-loopet ser ud som følgende:
36 -- Denne løsning bygger på logisk kombination inde i if-udtrykket 37 if InA | InB then 38 OR_out = high 39 else 40 OR_out = low 41 end if
Koden ligger som opg2-or2.jal i denne ZIP-fil.
OR gate som logiske bits
I JAL kan man regne med bits som et udtryk, og sætte et bit-resultat direkte på udgangen. Det gør at hele gaten kan realiseres med en linje kode.
Hele koden inde i forever-loopet ser ud som følgende:
36 -- Denne løsning bygger på at man kan arbejde logisk med bits 37 OR_out = InA | InB
Koden ligger som opg2-or3.jal i denne ZIP-fil.
Alle gates løst i samme program
Ved at udvide den første løsning med AND-gates så kan man med 3 if-else sætninger få løst alle gates, ved at man placerer udgangene de korrekte steder, som det kan ses i følgende kode for forever-loopet:
if InA then
INV_out = low -- inverter
OR_out = high -- OR
NOR_out = low -- NOR
if InB then
AND_out = high -- AND
NAND_out = low -- NAND
XOR_out = low -- XOR
XNOR_out = high -- XNOR
else
AND_out = low -- AND
NAND_out = high -- NAND
XOR_out = high -- XOR
XNOR_out = low -- XNOR
end if
else
INV_out = high -- inverter
AND_out = low -- AND
NAND_out = high -- NAND
if InB then
OR_out = high -- OR
NOR_out = low -- NOR
XOR_out = high -- XOR
XNOR_out = low -- XNOR
else
OR_out = low -- OR
NOR_out = high -- NOR
XOR_out = low -- XOR
XNOR_out = high -- XNOR
end if
end if
Koden ligger som PIC-gate.jal i denne ZIP-fil.
Den næste løsning gennemgået med AND gates giver ikke den samme besparelse på IF-sætningerne - der skal stadig en sætning til AND og NAND som det kan ses i følgende kode for forever-loopet:
if InA then
INV_out = low -- inverter
else
INV_out = high -- inverter
end if
if InA & InB then
AND_out = high -- AND
NAND_out = low -- NAND
else
AND_out = low -- AND
NAND_out = high -- NAND
end if
if InA | InB then
OR_out = high -- OR
NOR_out = low -- NOR
else
OR_out = low -- OR
NOR_out = high -- NOR
end if
if InA ^ InB then
XOR_out = high -- XOR
XNOR_out = low -- XNOR
else
XOR_out = low -- XOR
XNOR_out = high -- XNOR
end if
Koden ligger som PIC-gate3.jal i denne ZIP-fil.
Den sidste løsning med bit-beregning kan ses i følgende kode for forever-loopet:
INV_out = ! InA -- inverter AND_out = InA & InB -- AND OR_out = InA | InB -- OR NAND_out = ! AND_out -- NAND NOR_out = ! OR_out -- NOR XOR_out = InA ^ InB -- XOR XNOR_out = ! XOR_out -- XNOR
Koden ligger som PIC-gate2.jal i denne ZIP-fil.
Udvidelse af opgaven til 3 indgange
Ved at udvide den første løsning med AND-gates så kan man få 3 indgange på, som det kan ses i følgende kode for forever-loopet:
if InA then
if InB then
if InC then
AND_out = high
else
AND_out = low
end if
else
AND_out = low
end if
else
AND_out = low
end if
Koden ligger som opg2-3and1.jal i denne ZIP-fil.
Den næste løsning gennemgået med AND gates giver en noget enklere løsning, da der blot skal AND'es en ekstra indgang på i IF-betingelsen som det kan ses i følgende kode for forever-loopet:
if InA & InB & InC then
AND_out = high
else
AND_out = low
end if
Koden ligger som opg2-3and2.jal i denne ZIP-fil.
Den sidste løsning med bit-beregning giver blot en minimal udvidelse som det kan ses i følgende kode for forever-loopet:
AND_out = InA & InB &InC
Koden ligger som opg2-3and3.jal i denne ZIP-fil.