În cadrul acestui laborator se continuă implementarea în Verilog a procesorului didactic prezentat la curs și în laboratorul 6.
Unitatea aritmetică-logică este responsabilă de efectuarea operațiilor aritmetice și logice în timpul execuției instrucțiunilor. Operațiile primesc unul sau doi operanzi, iar UAL-ul în afară de producerea rezultatului setează și o serie de indicatori de condiții (eng. flags) rezultați în urma operațiilor. Operațiile disponibile în UAL derivă din instrucțiunile prezente în setul de instrucțiuni al procesorului didactic, însă nu au neapărat o corespondență 1-la-1 cu acestea. Unele operații sunt folosite în mai multe instrucțiuni, iar unele instrucțiuni folosesc mai multe operații. UAL-ul trebuie însă proiectat în așa fel astfel încât să cuprindă toate operațiile necesare în execuția instrucțiunilor disponibile în procesorul didactic.
Unitatea aritmetică-logică
Operanzii pe 16 biți sunt op1 și op2, iar cei 4 biți S selectează operația ce va fi efectuată. Rezultatul este pus pe magistrală prin activarea semnalului Enable. Acesta este dezactivat de instrucțiunile care nu au nevoie de fapt de rezultatul operației, ci doar de indicatori (ex: cmp, test). Operațiile de adunare și scădere folosesc și un bit de carry/borrow reprezentat prin semnalul Carry. Acesta este activat selectiv de instrucțiunile ADD/ADC (add with carry) și SUB/SBB (substract with borrow), precum și alte instrucțiuni, pentru a obține rezultatul dictat de semantica instrucțiunii.
Registrul de indicatori constituie o grupare a unor bistabili cu funcţii individuale, pozitionaţi la execuţia instrucţiunilor, în funcţie de rezultatul din unitatea aritmetică logică. Registrul IND
permite alegerea unei secvenţe de execuţie următoare unei instrucțiuni aritmetice/logice, în funcţie de rezultatul operației.
T/C
(transport, eng: carry): Este setat (poziţionat în “1” ) dacă în urma unei adunări rezultă un transport dinspre rangul cel mai semnificativ, altfel T
este şters (trecut în “0”).ADC
şi SBB
pentru a efectua operaţii aritmetice în precizie multiplă. Poate fi testat cu instrucțiuni de salt condiţionat.S
(semn): S
=0 indică rezultat pozitiv iar S
=1 indică rezultat negativ. S
poate fi ignorat deoarece în acest caz specifică cel mai semnificativ bit al rezultatului.Z
(zero): Z
este şters. P
(paritate): P
este setat dacă în urma execuţiei unei operaţii aritmetice sau logice rezultatul conţine un număr par de biţi egali cu 1, altfel P
este şters. D/O
(depaşire, eng: overflow): D
(eng. overflow) este setat dacă în urma execuţiei unei operaţii aritmetice rezultatul este un număr pozitiv prea mare sau un număr negativ prea mic pentru a putea fi reprezentat în operandul destinaţie (exclusiv bitul de semn); altfel D
este şters. Observații referitoare la indicatorii de condiții:
T/C
), pentru cele cu semn contează indicatorul de depășire/overflow (D/O
).P
) este 1 în caz ca avem un număr par de biți, altfel este 0 (deci paritate impară, altfel se numea paritate pară - 0 pentru număr par de biți, 1 pentru număr impar). Metoda de determinare a acestuia constă în aplicarea unui xor negat între biții cuvântului (dacă era paritate pară aplicam xor
simplu).ADD
), altele însă afectează doar o parte dintre aceștia.ADC
:ADC
este un Full Adder, în care intrările sunt cei doi operanzi și carry-ul. SBB1
: SBB1
scade operandul op2 și bitul Carry din operandul op1.SBB2
: SBB2
scade operandul op1 și bitul Carry din operandul op2.NOT
:NOT
inversează individual fiecare bit al operandului.AND
: AND
efectuează “ŞI” logic între biţii celor doi operanzi.OR
: OR
efectuează “SAU” logic între biţii celor doi operanzi.XOR
: XOR
efectuează “SAU-exclusiv” între biţii celor doi operanzi. SHL/SAL
: SHL/SAL
realizează deplasarea la stânga cu o poziţie a operandului. 1
doar dacă în urma operației bitul cel mai semnificativ - de semn - și-a schimbat valoarea, altfel e 0)SHR
: SHR
deplasează la dreapta biţii operandului, introducând zero în bitul cel mai semnificativ.1
doar dacă în urma operației bitul cel mai semnificativ - de semn - și-a schimbat valoarea, altfel e 0)SAR
: SAR
deplasează aritmetic la dreapta biţii operandului. 1
doar dacă în urma operației bitul cel mai semnificativ - de semn - și-a schimbat valoarea, altfel e 0)Sintaxa Verilog pentru operatorii artimetici și logici este prezentată în laboratorul 2.
Operațiile de shiftare se împart în: shiftare logică, shiftare aritmetică, shiftare circulară fără carry, shiftare circulară cu carry. În acest laborator vom trata primele două tipuri de operații.
O shiftare logică nu ține cont de semnul operandului. În cazul shiftării logice se ține cont doar de ordinea biților, iar pozițiile care rămân libere sunt umplute cu zerouri.
În imaginile de mai jos se poate observa modul de execuție a shiftărilor logice.
Shiftare logică la stânga
Shiftare logică la dreapta
Iar în figurile de mai jos găsiți un exemplu practic de efectuare a shiftărilor logice spre stânga (SHL
) și spre dreapta (SHR
).
Exemplu de shiftare logică la stânga
Exemplu de shiftare logică la dreapta
În Verilog, operatorii de shiftare logică sunt ''<<'' și ''>>''.
Spre deosebire de shiftarea logică spre dreapta (SHR
), shiftarea aritmetică spre dreapta (SAR
) nu umple spațiile rămase libere cu zerouri. În cazul SAR
, spațiile rămase libere se umplu cu valoarea bitului cel mai semnificativ, care se replică de câte ori este nevoie (vezi imaginea de mai jos).
Exemplu de shiftare aritmetică la dreapta
Exemplu de shiftare aritmetică la dreapta
În Verilog, operatorii de shiftare aritmetică sunt ''<<<'' și ''>>>''.
Aceștia au efectul scontat doar dacă variabila a fost declarată signed
(ex: reg signed [15:0] a;
).
SHL
) și shiftarea aritmetică spre stânga (SAL
) se efectuează în același mod. Se păstrează, însă, ambele mnemonici (SHL
/ SAL
) pentru a se putea păstra contextul folosirii acestora, logic sau aritmetic.
n
biți la stânga este echivalent cu înmulțirea cu 2n. Shiftarea la dreapta cu n
biți este echivalentă cu împărțirea la 2n
Descărcați scheletul de cod și completați conținutul modulului alu.v, folosind intrările și ieșirile prezentate mai jos.
module alu( input oe, input [3:0] opcode, input [width-1 : 0] in1, input [width-1 : 0] in2, input carry, output [width-1 : 0] out, output [flags_width-1 : 0] flags );
Codurile de identificare ale operațiilor (cei 4 biți S) sunt definite în modulul alu.v
din scheletul de laborator și in codul de mai jos.
`define ADC 0 `define SBB1 1 `define SBB2 2 `define NOT 3 `define AND 4 `define OR 5 `define XOR 6 `define SHL 7 `define SHR 8 `define SAR 9
Exercițiile din acest laborator constau în implementarea operațiilor și indicatorilor de condiții în modulul alu.v și apoi folosirea acestuia pentru a executa faza de trecere la instrucțiunea următoare.
alu
asemănător tutorialului.