Artentus

Byte addressing logic

Nov 30th, 2021
710
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module RamModeDecoder
  2. (
  3.     input      [ 1:0] addr,
  4.     input      [31:0] data_in,
  5.     input      [ 1:0] mem_mode,
  6.     output reg [31:0] data_out
  7. );
  8.  
  9.     localparam
  10.         MEM_MODE_32 = 2'b00,
  11.         MEM_MODE_8  = 2'b01,
  12.         MEM_MODE_16 = 2'b10;
  13.  
  14.     always @(*) begin
  15.         case (mem_mode)
  16.             MEM_MODE_8: begin
  17.                 data_out[31:8] = 24'h0;
  18.  
  19.                 case (addr)
  20.                     2'b00: data_out[7:0] = data_in[ 7: 0];
  21.                     2'b01: data_out[7:0] = data_in[15: 8];
  22.                     2'b10: data_out[7:0] = data_in[23:16];
  23.                     2'b11: data_out[7:0] = data_in[31:24];
  24.                 endcase
  25.             end
  26.  
  27.             MEM_MODE_16: begin
  28.                 data_out[31:16] = 16'h0;
  29.  
  30.                 if (addr[1]) begin
  31.                     data_out[15:0] = data_in[31:16];
  32.                 end else begin
  33.                     data_out[15:0] = data_in[15:0];
  34.                 end
  35.             end
  36.  
  37.             MEM_MODE_32: data_out = data_in;
  38.             default:     data_out = 32'h0;
  39.         endcase
  40.     end
  41.  
  42. endmodule
  43.  
  44. module RamModeEncoder
  45. (
  46.     input      [ 1:0] addr,
  47.     input      [31:0] data_in,
  48.     input      [ 1:0] mem_mode,
  49.     output reg [31:0] data_out,
  50.  
  51.     output reg b0, b1, b2, b3
  52. );
  53.  
  54.     localparam
  55.         MEM_MODE_32 = 2'b00,
  56.         MEM_MODE_8  = 2'b01,
  57.         MEM_MODE_16 = 2'b10;
  58.  
  59.     always @(*) begin
  60.         case (mem_mode)
  61.             MEM_MODE_8: begin
  62.                 case (addr)
  63.                     2'b00: begin
  64.                         data_out[ 7: 0] = data_in[7:0];
  65.                         data_out[31: 8] = 24'h0;
  66.  
  67.                         b0 = 1'b1;
  68.                         b1 = 1'b0;
  69.                         b2 = 1'b0;
  70.                         b3 = 1'b0;
  71.                     end
  72.                     2'b01: begin
  73.                         data_out[15: 8] = data_in[7:0];
  74.                         data_out[ 7: 0] = 8'h0;
  75.                         data_out[31:16] = 16'h0;
  76.  
  77.                         b0 = 1'b0;
  78.                         b1 = 1'b1;
  79.                         b2 = 1'b0;
  80.                         b3 = 1'b0;
  81.                     end
  82.                     2'b10: begin
  83.                         data_out[23:16] = data_in[7:0];
  84.                         data_out[15: 0] = 16'h0;
  85.                         data_out[31:24] = 8'h0;
  86.  
  87.                         b0 = 1'b0;
  88.                         b1 = 1'b0;
  89.                         b2 = 1'b1;
  90.                         b3 = 1'b0;
  91.                     end
  92.                     2'b11: begin
  93.                         data_out[31:24] = data_in[7:0];
  94.                         data_out[23: 0] = 24'h0;
  95.  
  96.                         b0 = 1'b0;
  97.                         b1 = 1'b0;
  98.                         b2 = 1'b0;
  99.                         b3 = 1'b1;
  100.                     end
  101.                 endcase
  102.             end
  103.  
  104.             MEM_MODE_16: begin
  105.                 if (addr[1]) begin
  106.                     data_out[31:16] = data_in[15:0];
  107.                     data_out[15: 0] = 16'h0;
  108.  
  109.                     b0 = 1'b0;
  110.                     b1 = 1'b0;
  111.                     b2 = 1'b1;
  112.                     b3 = 1'b1;
  113.                 end else begin
  114.                     data_out[15: 0] = data_in[15:0];
  115.                     data_out[31:16] = 16'h0;
  116.  
  117.                     b0 = 1'b1;
  118.                     b1 = 1'b1;
  119.                     b2 = 1'b0;
  120.                     b3 = 1'b0;
  121.                 end
  122.             end
  123.  
  124.             MEM_MODE_32: begin
  125.                 data_out = data_in;
  126.  
  127.                 b0 = 1'b1;
  128.                 b1 = 1'b1;
  129.                 b2 = 1'b1;
  130.                 b3 = 1'b1;
  131.             end
  132.  
  133.             default: begin
  134.                 data_out = 32'h0;
  135.  
  136.                 b0 = 1'b0;
  137.                 b1 = 1'b0;
  138.                 b2 = 1'b0;
  139.                 b3 = 1'b0;
  140.             end
  141.         endcase
  142.     end
  143.  
  144. endmodule
  145.  
RAW Paste Data