adjust ships to use fill/drain/full/empty macros
[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   reg         dram_addr_r;
19   reg         dram_isread;
20   reg         dram_write_data_push;
21   reg         dram_read_data_pop;
22   reg  [`DATAWIDTH:0]  out_d;
23   wire [31:0] dram_addr__;
24
25   assign dram_addr_r_ = dram_addr_r;
26   assign dram_isread_ = dram_isread;
27   assign dram_addr__ = !dram_isread ? inAddrWrite_d[31:0] : inAddrRead_d[31:0];
28   assign dram_addr_  = { dram_addr__[30:6], 1'b0, dram_addr__[5: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;
32 //  assign dram_write_data_ = inDataWrite_d[(`DATAWIDTH-1):0];
33   assign out_d_ = out_d;
34
35   always @(posedge clk) begin
36
37     if (!rst) begin
38       `reset
39       dram_isread <= 0;
40       dram_addr_r <= 0;
41       dram_read_data_pop <= 0;
42
43     end else begin
44       `flush
45       `cleanup
46
47       if (dram_addr_r && !dram_addr_a) begin
48          // busy
49       end else if (dram_addr_r &&  dram_addr_a && !dram_isread) begin
50           dram_addr_r <= 0;
51           `drain_inDataWrite
52           `drain_inAddrWrite
53           `fill_out
54           out_d <= { 1'b1, 37'b0 };
55       end else if (dram_addr_r &&  dram_addr_a && dram_isread) begin
56           dram_addr_r <= 0;
57           `drain_inAddrRead
58           `fill_out
59           out_d <= { 1'b0, dram_read_data[36:0] };
60       end else if (`out_empty && `inAddrWrite_full && `inDataWrite_full && !dram_addr_r && !dram_addr_a) begin
61           dram_addr_r <= 1;
62           dram_isread <= 0;
63       end else if (`out_empty && `inAddrRead_full && !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 == Test ========================================================
72 #skip
73
74 == Constants ========================================================
75
76 == Contributors =========================================================
77 Adam Megacz <megacz@cs.berkeley.edu>