ALU

Spécifications de l'ALU

L'un des blocs majeurs de ce processeur est l'Unité Arithmétique et Logique (ALU en anglais), qui se charge d'effectuer les opérations arithmétiques et logiques (d'où le nom) sur deux nombres.
  • Pour nous, l'ALU est un bloc combinatoire.
  • Ses entrées-sorties : 
    • une entrée qui spécifie le calcul à effectuer : I[3:0]
    • les données sur lesquelles on va effectuer les calculs : A[7:0], B[7:0] et Cin (retenue entrante).
      Remarque : en fonction du calcul à effectuer, toutes les 3 entrées ne seront pas forcément utilisées...
    • une sortie S[7:0], une retenue sortante Cout, et un signal Z indiquant si le résultat de l'ALU est nul (Z=1 si S==0).
Voici les opérations que doit pouvoir réaliser l'ALU :

 I[3:0] MnémoniqueInstruction
Sortie de l'ALU
1 XORXOR bit à bit de A et B
S <= A xor B
2 AND AND bit à bit de A et BS <= A and B
3 OR OR bit à bit de A et B S <= A or B
4 ADD Addition sans retenue entrante
 S <= A + B
C_out <= retenue sortante
5 ADC Addition avec retenue entrante
 S <= A + B + C_in
C_out <= retenue sortante
6 SUB   Soustraction sans retenue entrante S <= A - B
C_out <= retenue sortante
7 SBC Soustraction avec retenue entrante
 S <= A - B - C_in
C_out <= retenue sortante
8 ROLRotation à gauche
 {C_out, S[7:0]} <= {A[7:0], C_in}
9 ROR Rotation à droite
 {C_out, S[7:0]} <= {A[0], C_in, A[7:1]}
 autres ... ... C_out <= 0 et S <= B

Dans ce tableau :
  • A représente le premier opérande qui sort de l'accumulateur : accu[7:0]
  • B représente l'éventuel deuxième opérande, qui vient de la RAM : ram_data_read[7:0]

Le prototype du module Verilog de l'ALU sera :

module ALU (
            input logic [3:0]  I,         // Code de l'opération à réaliser

            input logic [7:0]  accu,      // Première opérande

            input logic [7:0]  ram_data,  // Éventuelle deuxième opérande
            input logic        C_in,      // Éventuelle retenue entrante

            output logic [7:0] ALU_out,   // Résultat principal du calcul
            output logic       C_out,     // Éventuelle retenue sortante
            output logic       Z_out      // Flag à 1 si ALU_out==0
           );

Travail demandé

À vous d'en écrire le code (attention de bien respecter la casse des signaux et du nom du module).



Comments