diff options
| author | Julian Blake Kongslie | 2022-03-13 16:50:34 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-03-13 16:50:34 -0700 |
| commit | fce46a9a7bb2fe2a9b3addca0f488931b9e231ff (patch) | |
| tree | 31a467115e726b0b0e79b8ae7dbe91c0472a6295 /hdl/mem_broadcast.sv | |
| parent | Fix DRAM timings to avoid back-to-back transactions. (diff) | |
| download | multipdp8-fce46a9a7bb2fe2a9b3addca0f488931b9e231ff.tar.xz | |
Add memory arbiter and broadcast in between command UART and DRAM.
Diffstat (limited to '')
| -rw-r--r-- | hdl/mem_broadcast.sv | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/hdl/mem_broadcast.sv b/hdl/mem_broadcast.sv new file mode 100644 index 0000000..720699b --- /dev/null +++ b/hdl/mem_broadcast.sv | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | `include "defs.svh" | ||
| 2 | |||
| 3 | module mem_broadcast | ||
| 4 | ( input bit clock | ||
| 5 | , input bit reset | ||
| 6 | |||
| 7 | , output bit ram_ready | ||
| 8 | , input bit ram_valid | ||
| 9 | , input ram_read_response_t ram_data | ||
| 10 | |||
| 11 | , input bit print_ready | ||
| 12 | , output bit print_valid | ||
| 13 | , output ram_read_response_t print_data | ||
| 14 | |||
| 15 | , input bit [`NUM_PDPS-1:0] pdp_ready | ||
| 16 | , output bit [`NUM_PDPS-1:0] pdp_valid | ||
| 17 | , output pdp_read_response_t [`NUM_PDPS-1:0] pdp_data | ||
| 18 | ); | ||
| 19 | |||
| 20 | bit hold_valid; | ||
| 21 | ram_read_response_t hold_data; | ||
| 22 | |||
| 23 | always @(posedge clock) begin | ||
| 24 | if (reset) begin | ||
| 25 | ram_ready = 0; | ||
| 26 | print_valid = 0; | ||
| 27 | for (int i = 0; i < `NUM_PDPS; ++i) | ||
| 28 | pdp_valid[i] = 0; | ||
| 29 | hold_valid = 0; | ||
| 30 | end else begin | ||
| 31 | if (print_ready) print_valid = 0; | ||
| 32 | for (int i = 0; i < `NUM_PDPS; ++i) | ||
| 33 | if (pdp_ready[i]) pdp_valid[i] = 0; | ||
| 34 | |||
| 35 | if (ram_ready && ram_valid) begin | ||
| 36 | hold_valid = 1; | ||
| 37 | hold_data = ram_data; | ||
| 38 | end | ||
| 39 | |||
| 40 | if (hold_valid) begin | ||
| 41 | if (hold_data.tag == 0) begin | ||
| 42 | if (!print_valid) begin | ||
| 43 | print_valid = 1; | ||
| 44 | print_data = hold_data; | ||
| 45 | hold_valid = 0; | ||
| 46 | end | ||
| 47 | end else begin | ||
| 48 | if (!pdp_valid[ram_data.tag-1]) begin | ||
| 49 | pdp_valid[ram_data.tag-1] = 1; | ||
| 50 | pdp_data[ram_data.tag-1].address = hold_data.address[`PDP_ADDRESS_BITS-1:$clog2(`RAM_LINE_WORDS)]; | ||
| 51 | pdp_data[ram_data.tag-1].data = hold_data.data; | ||
| 52 | hold_valid = 0; | ||
| 53 | end | ||
| 54 | end | ||
| 55 | end | ||
| 56 | |||
| 57 | ram_ready = !hold_valid; | ||
| 58 | end | ||
| 59 | end | ||
| 60 | |||
| 61 | endmodule | ||
