MBJ

ALU

MBJ
Apr 22nd, 2019
1,217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3. // part of the EXECUTE phase of the pipeline
  4.  
  5. module ALU  (
  6.             input [31:0] A, B,
  7.             input [4:0] SH, FS,
  8.             output reg Z, C, N, V,  // Z needs to end up in top phase comb. ckt.
  9.             output reg [31:0] F
  10.             );
  11.  
  12. localparam ADD = 5'b00010; //1-
  13. localparam SUB = 5'b00101; //2--
  14. localparam SLT = 5'b00101; //2--
  15. localparam AND = 5'b01000; //3---
  16. localparam OR = 5'b01010;  //4----
  17. localparam XOR = 5'b01100; //5-----
  18. localparam ADI = 5'b00010; //1-
  19. localparam SBI = 5'b00101; //2--
  20. localparam NOT = 5'b01110;
  21. localparam ANI = 5'b01000; //3---
  22. localparam ORI = 5'b01010; //4----
  23. localparam XRI = 5'b01100; //5-----
  24. localparam AIU = 5'b00010; //1-
  25. localparam SIU = 5'b00101; //2--
  26. localparam MOV = 5'b00000; //6------
  27. localparam LSL = 5'b10000;
  28. localparam LSR = 5'b10001;
  29. localparam BZ = 5'b00000;  //6------
  30. localparam BNZ = 5'b00000; //6------
  31. localparam JML = 5'b00111;
  32. // in total, 10 unique cases
  33.  
  34. initial begin
  35.     {Z,C,N,V} = 0;
  36. end
  37.  
  38. always@(*) begin
  39.     case(FS)
  40.         ADD:    // ADI, ADI, AIU
  41.         begin
  42.             {C,F} = A + B;
  43.             V = (((A[31]) && (B[31])) && (!F[31]))? 1 : // neg + neg --> pos
  44.                 (((!A[31]) && (!B[31])) && (F[31]))? 1 : 0; // pos + pos --> neg
  45.         end
  46.         SUB:    // SLT, SBI, SIU
  47.         begin
  48.             F = A - B;  // A + (~B) + 1;
  49.             V = (((A[31]) && (!B[31])) && (!F[31]))? 1 : // neg - pos --> pos
  50.                 (((!A[31]) && (B[31])) && (F[31]))? 1 : 0; // pos - (neg) --> neg
  51.         end
  52.         AND:    // ANI
  53.             F = A&B;
  54.         OR:     // ORI
  55.             F = A|B;
  56.         XOR:    // XRI
  57.             F = A^B;
  58.         NOT:
  59.             F = ~A;
  60.         MOV:    // BZ, BNZ
  61.             F = A;
  62.         LSL:
  63.             F = A<<SH;
  64.         LSR:
  65.             F = A>>SH;
  66.         JML:
  67.             F = A;  // PC_1 passes thru from MUX A (MA = 1)
  68.         default: F = 0; //?
  69.     endcase
  70.     // c, z, v, n
  71.     // c, v taken care of
  72.     Z = ((FS == MOV) || (FS == JML))? Z :
  73.         (F==0)? 1 : 0;
  74.  
  75.     N = ((FS == MOV) || (FS == JML))? N : // Move operation or any branching results in no status bit effects
  76.         (F[31])? 1 : 0;
  77. end
  78.  
  79. endmodule
Add Comment
Please, Sign In to add comment