OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [mc/] [src/] [dsk/] [atabuf.v] - Blame information for rev 290

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 121 hellwig
//
2
// atabuf.v -- parallel ATA data buffer
3
//
4
 
5
 
6 290 hellwig
`timescale 1ns/10ps
7
`default_nettype none
8
 
9
 
10 27 hellwig
module ata_buffer (clk,
11
                   bus_write, bus_addr, bus_din, bus_dout,
12
                   ata_write, ata_addr, ata_din, ata_dout);
13
    input clk;
14
    // bus interface
15
    input bus_write;
16
    input [11:2] bus_addr;
17
    input [31:0] bus_din;
18
    output [31:0] bus_dout;
19
    // ata interface
20
    input ata_write;
21
    input [11:1] ata_addr;
22
    input [15:0] ata_din;
23
    output [15:0] ata_dout;
24
 
25
  wire [9:0] internal_bus_addr;
26
  wire [9:0] internal_ata_addr;
27
  wire [15:0] lo_din_bus;
28
  wire [15:0] hi_din_bus;
29
  wire [15:0] lo_din_ata;
30
  wire [15:0] hi_din_ata;
31
  wire [15:0] lo_dout_bus;
32
  wire [15:0] hi_dout_bus;
33
  wire [15:0] lo_dout_ata;
34
  wire [15:0] hi_dout_ata;
35
  wire lo_write_bus;
36
  wire hi_write_bus;
37
  wire lo_write_ata;
38
  wire hi_write_ata;
39
  reg ata_out_muxctrl;
40
 
41
  assign internal_bus_addr[9:0] = bus_addr[11:2];
42
  assign internal_ata_addr[9:0] = ata_addr[11:2];
43
 
44 197 hellwig
  assign lo_din_bus = { bus_din[7:0], bus_din[15:8] };
45
  assign hi_din_bus = { bus_din[23:16], bus_din[31:24] };
46 27 hellwig
  assign lo_din_ata = ata_din;
47
  assign hi_din_ata = ata_din;
48
 
49
  // pipeline register for ata output mux control
50
  always @(posedge clk) begin
51
    ata_out_muxctrl <= ata_addr[1];
52
  end
53
 
54 197 hellwig
  assign bus_dout = { hi_dout_bus[7:0], hi_dout_bus[15:8],
55
                      lo_dout_bus[7:0], lo_dout_bus[15:8] };
56 27 hellwig
  assign ata_dout = ata_out_muxctrl ? lo_dout_ata : hi_dout_ata;
57
 
58
  assign lo_write_bus = bus_write;
59
  assign hi_write_bus = bus_write;
60
  assign lo_write_ata = ata_write & ata_addr[1];
61
  assign hi_write_ata = ata_write & ~ata_addr[1];
62
 
63
  RAMB16_S18_S18 lo_buffer (
64
    .DOA(lo_dout_bus),
65
    .DOB(lo_dout_ata),
66
    .ADDRA(internal_bus_addr),
67
    .ADDRB(internal_ata_addr),
68
    .CLKA(clk),
69
    .CLKB(clk),
70
    .DIA(lo_din_bus),
71
    .DIB(lo_din_ata),
72
    .DIPA(2'b00),
73
    .DIPB(2'b00),
74
    .ENA(1'b1),
75
    .ENB(1'b1),
76
    .SSRA(1'b0),
77
    .SSRB(1'b0),
78
    .WEA(lo_write_bus),
79
    .WEB(lo_write_ata)
80
  );
81
 
82
  RAMB16_S18_S18 hi_buffer (
83
    .DOA(hi_dout_bus),
84
    .DOB(hi_dout_ata),
85
    .ADDRA(internal_bus_addr),
86
    .ADDRB(internal_ata_addr),
87
    .CLKA(clk),
88
    .CLKB(clk),
89
    .DIA(hi_din_bus),
90
    .DIB(hi_din_ata),
91
    .DIPA(2'b00),
92
    .DIPB(2'b00),
93
    .ENA(1'b1),
94
    .ENB(1'b1),
95
    .SSRA(1'b0),
96
    .SSRB(1'b0),
97
    .WEA(hi_write_bus),
98
    .WEB(hi_write_ata)
99
  );
100
 
101
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.