Facebook
From Sole Crocodile, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 77
  1. `include "defines.vh"
  2. module alu #(
  3.         parameter DATA_WIDTH = 8
  4.     )(
  5.         input  wire [`OPSEL_COUNT-1:0] opsel,
  6.         input  wire                    enable,
  7.         input  wire   [DATA_WIDTH-1:0] rd,
  8.         input  wire   [DATA_WIDTH-1:0] rr,
  9.         output reg    [DATA_WIDTH-1:0] out,
  10.         input  wire   [DATA_WIDTH-1:0] flags_in,
  11.         output reg    [DATA_WIDTH-1:0] flags_out
  12.     );
  13.  
  14.     /* flags_out a fost transformat in reg, pentru a putea
  15.      * fi atribuit in interiorul unui bloc always, insa va fi
  16.      * sintetizat tot combinational (UAL-ul nici macar nu are clk
  17.      * drept input) */
  18.  
  19.     /* TODO: De codificat cateva operatii
  20.      * in defines.vh si de implementat aici
  21.      */
  22.     always @* begin
  23.         case (opsel)
  24.        
  25.             `OPSEL_ADD,
  26.                                 `OPSEL_ADC:
  27.             begin
  28.                {flags_out[`FLAGS_C], out} = rd + rr + ((opsel == `OPSEL_ADC) && flags_in[`FLAGS_C]);
  29.                flags_out[`FLAGS_V] = (rd[7] == 1 && rr[7] == 1 && out[7] == 0) ||
  30.                                       (rd[7] == 0 && rr[7] == 0 && out[7] == 1);
  31.                 flags_out[`FLAGS_Z] = (out == 0);
  32.                 flags_out[`FLAGS_N] = out[7];
  33.                 flags_out[`FLAGS_S] = flags_out[`FLAGS_N] ^ flags_out[`FLAGS_V];
  34.                 flags_out[`FLAGS_H] = (rd[3] == 1 && rr[3] == 1 && out[3] == 0) ||
  35.                                       (rd[3] == 0 && rr[3] == 0 && out[3] == 1);
  36.                 flags_out[`FLAGS_T] = flags_in[`FLAGS_T];
  37.                 flags_out[`FLAGS_I] = flags_in[`FLAGS_I];
  38.             end
  39.  
  40.             `OPSEL_SUB:
  41.             begin
  42.                {flags_out[`FLAGS_C], out} = rd - rr - flags_in[`FLAGS_C];
  43.                 flags_out[`FLAGS_V] = (rd[7] == 1 && rr[7] == 1 && out[7] == 0) ||
  44.                                       (rd[7] == 0 && rr[7] == 0 && out[7] == 1);
  45.                 flags_out[`FLAGS_Z] = (out == 0);
  46.                 flags_out[`FLAGS_N] = out[7];
  47.                 flags_out[`FLAGS_S] = flags_out[`FLAGS_N] ^ flags_out[`FLAGS_V];
  48.                 flags_out[`FLAGS_H] = (rd[3] == 1 && rr[3] == 1 && out[3] == 0) ||
  49.                                       (rd[3] == 0 && rr[3] == 0 && out[3] == 1);
  50.                 flags_out[`FLAGS_T] = flags_in[`FLAGS_T];
  51.                 flags_out[`FLAGS_I] = flags_in[`FLAGS_I];
  52.             end
  53.  
  54.             `OPSEL_AND:
  55.             begin
  56.                 out = rd & rr;
  57.                 flags_out[`FLAGS_V] = 0;
  58.                 flags_out[`FLAGS_Z] = (out == 0);
  59.                 flags_out[`FLAGS_N] = out[7];
  60.                 flags_out[`FLAGS_S] = flags_out[`FLAGS_N] ^ flags_out[`FLAGS_V];
  61.                 flags_out[`FLAGS_H] = flags_in[`FLAGS_H];
  62.                 flags_out[`FLAGS_C] = flags_in[`FLAGS_C];
  63.                 flags_out[`FLAGS_T] = flags_in[`FLAGS_T];
  64.                 flags_out[`FLAGS_I] = flags_in[`FLAGS_I];
  65.             end
  66.  
  67.             `OPSEL_EOR:
  68.             begin
  69.                 out = rd ^ rr;
  70.                 flags_out[`FLAGS_V] = 0;
  71.                 flags_out[`FLAGS_Z] = (out == 0);
  72.                 flags_out[`FLAGS_N] = out[7];
  73.                 flags_out[`FLAGS_S] = flags_out[`FLAGS_N] ^ flags_out[`FLAGS_V];
  74.                 flags_out[`FLAGS_H] = flags_in[`FLAGS_H];
  75.                 flags_out[`FLAGS_C] = flags_in[`FLAGS_C];
  76.                 flags_out[`FLAGS_T] = flags_in[`FLAGS_T];
  77.                 flags_out[`FLAGS_I] = flags_in[`FLAGS_I];
  78.             end
  79.  
  80.             `OPSEL_OR:
  81.             begin
  82.                 out = rd | rr;
  83.                 flags_out[`FLAGS_V] = 0;
  84.                 flags_out[`FLAGS_Z] = (out == 0);
  85.                 flags_out[`FLAGS_N] = out[7];
  86.                 flags_out[`FLAGS_S] = flags_out[`FLAGS_N] ^ flags_out[`FLAGS_V];
  87.                 flags_out[`FLAGS_H] = flags_in[`FLAGS_H];
  88.                 flags_out[`FLAGS_C] = flags_in[`FLAGS_C];
  89.                 flags_out[`FLAGS_T] = flags_in[`FLAGS_T];
  90.                 flags_out[`FLAGS_I] = flags_in[`FLAGS_I];
  91.             end
  92.  
  93.             `OPSEL_NEG:
  94.             begin
  95.                 out = 0 -rd;
  96.                 flags_out[`FLAGS_V] = 0;
  97.                 flags_out[`FLAGS_Z] = (out == 0);
  98.                 flags_out[`FLAGS_N] = out[7];
  99.                 flags_out[`FLAGS_S] = flags_out[`FLAGS_N] ^ flags_out[`FLAGS_V];
  100.                 flags_out[`FLAGS_H] = flags_in[`FLAGS_H];
  101.                 flags_out[`FLAGS_C] = flags_in[`FLAGS_C];
  102.                 flags_out[`FLAGS_T] = flags_in[`FLAGS_T];
  103.                 flags_out[`FLAGS_I] = flags_in[`FLAGS_I];
  104.             end
  105.  
  106.                         /*TODO: add your ops here*/
  107.         default: begin
  108.             out = 8'bx;
  109.                                 flags_out = flags_in;
  110.                   end
  111.         endcase
  112.     end
  113.  
  114.  
  115. endmodule
  116.