Advertisement
Guest User

Eat shit SE204

a guest
Mar 11th, 2018
127
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[2 ** mem_adr_width - 1:0];
  14.  
  15.     // Synchrone burst indicator
  16.     logic in_burst;
  17.     // Combinatorial burst indicator
  18.     wire in_real_time_burst;
  19.     assign in_real_time_burst = wb_s.cti == 3'b010;
  20.  
  21.     wire [mem_adr_width - 1:0] relevant_addr;
  22.     logic [mem_adr_width - 1:0] burst_next_addr;
  23.     assign relevant_addr = in_burst ? burst_next_addr : wb_s.adr[mem_adr_width + 1:2];
  24.  
  25.     assign wb_s.rty = 1'b0;
  26.     assign wb_s.err = 1'b0;
  27.  
  28.     logic opDone;
  29.     assign wb_s.ack = wb_s.we ? wb_s.stb : opDone;
  30.  
  31.     always_ff @(posedge wb_s.clk or posedge wb_s.rst)
  32.         if(wb_s.rst)
  33.             opDone <= 1'b0;
  34.         else
  35.         begin
  36.             burst_next_addr <= relevant_addr + (in_real_time_burst && wb_s.stb);
  37.             in_burst <= in_real_time_burst;
  38.             opDone <= in_real_time_burst || (!wb_s.we && wb_s.stb && !opDone);
  39.         end
  40.  
  41.     always_ff @(posedge wb_s.clk)
  42.         if(wb_s.stb)
  43.         // Handle wishbone
  44.         begin
  45.             if(wb_s.we)
  46.             // Write mode
  47.             begin
  48.                 if(wb_s.sel[0])
  49.                     RAM[relevant_addr][0] <= wb_s.dat_ms[7:0];
  50.                 if(wb_s.sel[1])
  51.                     RAM[relevant_addr][1] <= wb_s.dat_ms[15:8];
  52.                 if(wb_s.sel[2])
  53.                     RAM[relevant_addr][2] <= wb_s.dat_ms[23:16];
  54.                 if(wb_s.sel[3])
  55.                     RAM[relevant_addr][3] <= wb_s.dat_ms[31:24];
  56.             end
  57.             wb_s.dat_sm <= RAM[relevant_addr];
  58.         end
  59.  
  60. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement