Advertisement
Guest User

Bruh

a guest
Mar 11th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //-----------------------------------------------------------------
  2. // Wishbone BlockRAM
  3. //-----------------------------------------------------------------
  4. //
  5. // Le paramètre mem_adr_width doit permettre de déterminer le nombre
  6. // de mots de la mémoire : (2048 pour mem_adr_width=11)
  7.  
  8. module wb_bram #(parameter mem_adr_width = 11) (
  9.     // Wishbone interface
  10.     wshb_if.slave wb_s
  11.     );
  12.     // a vous de jouer a partir d'ici
  13.     logic [3:0][7:0] RAM[0:2 ** mem_adr_width - 1];
  14.  
  15.     wire [mem_adr_width - 1:0] relevant_addr;
  16.     assign relevant_addr = wb_s.adr[mem_adr_width + 1:2];
  17.  
  18.     assign wb_s.rty = 1'b0;
  19.     assign wb_s.err = 1'b0;
  20.  
  21.     logic opDone;
  22.     assign wb_s.ack = wb_s.we ? wb_s.cyc && wb_s.stb : opDone;
  23.  
  24.     always @(posedge wb_s.clk or posedge wb_s.rst)
  25.     begin
  26.         if(wb_s.rst)
  27.         // Handle restart
  28.         begin
  29.             wb_s.dat_sm = 32'd0;
  30.             opDone = 1'b0;
  31.             for(logic [mem_adr_width:0] i = 0; i < 2 ** mem_adr_width - 1; i++)
  32.                 RAM[i] = 32'd0;
  33.         end
  34.         else if(opDone)
  35.         // Reset ACK
  36.             opDone = 1'b0;
  37.         else if(wb_s.cyc && wb_s.stb)
  38.         // Handle wishbone
  39.         begin
  40.             if(wb_s.we)
  41.             // Write mode
  42.             begin
  43.                 case(wb_s.sel)
  44.                     4'b0001: RAM[relevant_addr][0] = wb_s.dat_ms[7:0];
  45.                     4'b0010: RAM[relevant_addr][1] = wb_s.dat_ms[15:8];
  46.                     4'b0100: RAM[relevant_addr][2] = wb_s.dat_ms[23:16];
  47.                     4'b1000: RAM[relevant_addr][3] = wb_s.dat_ms[31:24];
  48.                     4'b0011: RAM[relevant_addr][1:0] = wb_s.dat_ms[15:0];
  49.                     4'b1100: RAM[relevant_addr][3:2] = wb_s.dat_ms[31:16];
  50.                     4'b1111: RAM[relevant_addr] = wb_s.dat_ms;
  51.                     default: RAM[relevant_addr] = RAM[relevant_addr];
  52.                 endcase
  53.             end
  54.             else
  55.             // Read mode
  56.             begin
  57.                 case(wb_s.sel)
  58.                     4'b0001: wb_s.dat_sm = RAM[relevant_addr][0];
  59.                     4'b0010: wb_s.dat_sm = RAM[relevant_addr][1] << 8;
  60.                     4'b0100: wb_s.dat_sm = RAM[relevant_addr][2] << 16;
  61.                     4'b1000: wb_s.dat_sm = RAM[relevant_addr][3] << 24;
  62.                     4'b0011: wb_s.dat_sm = RAM[relevant_addr][1:0];
  63.                     4'b1100: wb_s.dat_sm = RAM[relevant_addr][3:2] << 16;
  64.                     4'b1111: wb_s.dat_sm = RAM[relevant_addr];
  65.                     default: wb_s.dat_sm = 32'd0;
  66.                 endcase
  67.                 opDone = 1'b1;
  68.             end
  69.         end
  70.     end
  71.  
  72. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement