2016-01-31 1 views
-2

Créez un module Verilog appelé huitbit palu qui a deux entrées 8 bits, a et b, et une entrée 2 bits, sel. Les sorties de ce module sont un signal de 8 bits f, et un signal de 1 bit ovf. La valeur de ces sorties doit changer en fonction de la valeur du signal sel qui détermine l'opération.ALU 8 bits avec débordement dans Verilog

**s[1:0] f[7:0]   ovf   Description** 

0 0  a + b (add) overflow   a plus b 

0 1  b (inv)   0    Bitwise inversion of b 

1 0  a · b (and)  0    Bitwise AND of a and b 

1 1  a | b (or)  0    Bitwise OR of a and b 

J'ai la mission ci-dessus et voici ce que j'ai jusqu'à présent dans Verilog:

module eightbit_palu(input [7:0]a, 
        input [7:0]b, 
        input [1:0]sel, 
        output [7:0]f, 
        output ovf); 
    reg (f, ovf); 
    always @ (a, b, sel); 
    case(sel) 
     2’b00: f = a + b; 
     2’b01: f = ~b; 
     2’b10: f = a & b; 
     2’b11: f = a | b; 
    endcase 
endmodule 

Je suis nouveau Verilog donc je ne suis pas sûr si cela est juste ou ce que je devrais faire à propos de la valeur de débordement. Des conseils/suggestions?

+0

OU est '|', pas '/'. Et je suppose que vous voulez ovf être 1 ssi l'opération est addition et l'addition a "signé débordement", est-ce exact? – harold

+0

oui c'est correct – smd

+0

L'addition vous donne réellement un bit supplémentaire. Si les deux bits supérieurs ne sont pas identiques, la troncature changera la valeur si elle est interprétée comme un entier complémentaire à 2 (c'est-à-dire qu'elle déborde). Vous avez besoin du supplément supplémentaire pour cela évidemment. – harold

Répondre

0

Si vous augmentez la longueur de la sortie de l'additionneur d'un bit supplémentaire, ce bit est activé si un report est effectué. L'extrait suivant est synthétisé (au moins par XST) sous la forme d'un additionneur de report sur 8 bits:

2'b00: {ovf, f} = a + b; 

Ceci est une concaténation de trop-plein et le résultat dans le LHS et leur affectation à ce que la concaténation.

Ne pas oublier de définir une valeur par défaut OVF, pour empêcher la synthèse d'un verrou (qui est presque jamais le cas):

always @ (a, b, sel) begin 
    ovf = 0; // default 
    case(sel) 
     2'b00: {ovf, f} = a + b; 
     2'b01: f = ~b; 
     2'b10: f = a & b; 
     2'b11: f = a | b; 
    endcase 
end 
+0

@toolic Merci, ne s'est pas rendu compte au début. – hexafraction

+0

alors le reste de tout devrait ressembler à ce qui est demandé? – smd

+0

@smd: Vous devriez le simuler pour voir par vous-même. – toolic