add Video ship
[fleet.git] / ships / DRAM.ship
1 ship: DRAM
2
3 == Ports ===========================================================
4 data  in:    inAddrRead
5 data  in:    inAddrWrite
6 data  in:    inDataWrite
7
8 data  out:   out
9
10 == TeX ==============================================================
11
12 == Fleeterpreter ====================================================
13     public void service() { }
14 == FleetSim ==============================================================
15
16 == FPGA ==============================================================
17
18   // FIXME: use the other chip (64-bit data bus)
19
20   reg         dram_addr_r;
21   reg         dram_isread;
22   reg         dram_write_data_push;
23   reg         dram_read_data_pop;
24   reg  [`DATAWIDTH-1:0]  out_d;
25
26   assign dram_addr_r_ = dram_addr_r;
27   assign dram_isread_ = dram_isread;
28   assign dram_addr_ = !dram_isread ? inAddrWrite_d[31:0] : inAddrRead_d[31:0];
29   assign dram_write_data_push_ = dram_write_data_push;
30   assign dram_read_data_pop_ = dram_read_data_pop;
31   assign dram_write_data_ = inDataWrite_d[31:0];
32   assign out_d_ = out_d;
33
34   always @(posedge clk) begin
35
36     if (!rst) begin
37       `reset
38       dram_isread <= 0;
39       dram_addr_r <= 0;
40       dram_read_data_pop <= 0;
41
42     end else begin
43
44       if (!inAddrRead_r  && inAddrRead_a)  inAddrRead_a  <= 0;
45       if (!inDataWrite_r && inDataWrite_a) inDataWrite_a <= 0;
46       if (!inAddrWrite_r && inAddrWrite_a) inAddrWrite_a <= 0;
47       if ( out_r         && out_a)         out_r <= 0;
48
49       if (dram_addr_r && !dram_addr_a) begin
50          // busy
51       end else if (dram_addr_r &&  dram_addr_a && !dram_isread) begin
52           dram_addr_r <= 0;
53           inAddrWrite_a <= 1;
54           inDataWrite_a <= 1;
55       end else if (dram_addr_r &&  dram_addr_a && dram_isread) begin
56           dram_addr_r <= 0;
57           inAddrRead_a <= 1;
58           out_d <= dram_read_data;
59           out_r <= 1;
60       end else if (inAddrWrite_r && !inAddrWrite_a && inDataWrite_r && !inDataWrite_a && !dram_addr_r && !dram_addr_a) begin
61           dram_addr_r <= 1;
62           dram_isread <= 0;
63       end else if (inAddrRead_r && !inAddrRead_a && !out_r && !out_a && !dram_addr_r && !dram_addr_a) begin
64           dram_addr_r <= 1;
65           dram_isread <= 1;
66       end
67     end
68   end
69
70
71 == Constants ========================================================
72
73 == Contributors =========================================================
74 Adam Megacz <megacz@cs.berkeley.edu>