aboutsummaryrefslogtreecommitdiff
path: root/rom_wb.v
blob: 8062f86f1924ff80f6ee3b1bc552fe8b81aab67c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
`timescale 1ns / 1ps
module rom_wb (
  input wb_clk_i,
  input wb_rst_i,
  input [31:0] wb_dat_i,
  input [4:0] wb_adr_i,
  input wb_we_i,
  input [3:0] wb_sel_i,
  input wb_cyc_i,
  input wb_stb_i,

  output [31:0] wb_dat_o,
  output wb_ack_o
);

reg  ack_d1 = 1'b0;
wire ack_w;

wire[4:0] rom_addr_i;
wire[31:0] rom_dat_i, rom_dat_o;
wire rom_clk_i, rom_read_i, rom_write_i;

assign rom_read_i  = wb_cyc_i & wb_stb_i & !wb_we_i;
assign rom_write_i = wb_cyc_i & wb_stb_i & wb_we_i;
assign rom_dat_i   = wb_dat_i;
assign rom_addr_i  = wb_adr_i;
assign rom_clk_i   = wb_clk_i;

rom_ctrl rom_ctrl(
  .clk_i(rom_clk_i), 
  .rst_i(0),
  
  .adr_i(rom_addr_i),
  
  .rd_i(rom_read_i),
  .dat_o(rom_dat_o),
  
  .wr_i(rom_write_i),
  .dat_i(rom_dat_i),
  
  .ack_o(ack_w)
);

always @(posedge wb_clk_i, posedge wb_rst_i )
  if( wb_rst_i )
    ack_d1 <= 0;
  else
    ack_d1 <= ack_w;

// если контроллер был занят, а стал свободен, значит контроллер завершил операцию и
// нужно дёрнуть один раз ACK_O и положить на следующем такте, чтобы wishbone
// master оповестился о конце операции slave'а
assign wb_ack_o = ( ack_d1 ) && ( !ack_w );
assign wb_dat_o = rom_dat_o;

endmodule