Advertisement
Guest User

Untitled

a guest
Apr 8th, 2014
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module wb_ram
  2.   #(//Wishbone parameters
  3.      parameter dw = 32,
  4.      // Memory parameters
  5.      parameter depth = 256,
  6.      parameter aw = $clog2(depth))
  7. (input     wb_clk_i,
  8.  input     wb_rst_i,
  9.  
  10.  input [aw-1:0]  wb_adr_i,
  11.  input [dw-1:0]  wb_dat_i,
  12.  input [3:0]       wb_sel_i,
  13.  input     wb_we_i,
  14.  input [1:0]       wb_bte_i,
  15.  input [2:0]       wb_cti_i,
  16.  input     wb_cyc_i,
  17.  input     wb_stb_i,
  18.  
  19.  output reg    wb_ack_o,
  20.  output        wb_err_o,
  21.  output        wb_rty_o,
  22.  output [dw-1:0] wb_dat_o);
  23.  
  24. // Register to address internal memory array
  25. reg [aw-1:0] adr;
  26. wire  [aw-1:0] next_adr;
  27.  
  28. // Register to indicate if the cycle is a Wishbone B3-registered feedback
  29. // type access
  30. reg                    wb_b3_trans;
  31.  
  32. wire valid = wb_cyc_i & wb_stb_i;
  33.  
  34. reg valid_r;
  35.  
  36. always @(posedge wb_clk_i)
  37.   valid_r <= valid;
  38.  
  39. // Logic to detect if there's a burst access going on
  40. wire wb_b3_trans_start = ((wb_cti_i == 3'b001)|(wb_cti_i == 3'b010)) &
  41.       valid & !valid_r;
  42.  
  43. wb_next_adr #(.aw(aw)) wb_next_adr0(adr, wb_cti_i, wb_bte_i, next_adr);
  44.  
  45. wire burst_access_wrong_wb_adr = 1'b0;
  46.  
  47. // Address registering logic
  48. always@(posedge wb_clk_i)
  49.   if(wb_rst_i)
  50.      adr <= 0;
  51.   else if (valid & wb_ack_o)
  52.      adr <= next_adr;
  53.   else if(valid & !valid_r)
  54.      adr <= wb_adr_i;
  55.  
  56. assign wb_rty_o = 0;
  57.  
  58. wire ram_we = wb_we_i & valid & wb_ack_o;
  59.  
  60. // Ack Logic
  61. reg wb_ack_o_r;
  62.  
  63. always @(posedge wb_clk_i)
  64.   wb_ack_o <= valid & (!((wb_cti_i == 3'b000) | (wb_cti_i == 3'b111)) | !wb_ack_o);
  65.  
  66. //
  67. // Error signal generation
  68. //
  69.  
  70. // OR in other errors here...
  71. assign wb_err_o =  1'b0; //wb_ack_o_r & wb_stb_i &
  72. //(burst_access_wrong_wb_adr);
  73.  
  74.  
  75. wb_ram_generic
  76.   #(.aw (aw),
  77.      .depth(depth))
  78. ram0
  79.   (.clk (wb_clk_i),
  80.    .we  ({4{ram_we}} & wb_sel_i),
  81.    .din (wb_dat_i),
  82.    .addr (ram_we ? adr : wb_b3_trans_start ? wb_adr_i : next_adr),
  83.    .dout (wb_dat_o));
  84.  
  85. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement