Skip to content

Commit 809bb16

Browse files
Correct information about RAM
An asynchronous RAM is asynchronous. A block RAM is synchronous and pipelined. How on earth did this happen? Of course asynchronous RAM is not synchronous, duh. I love it, "block RAM also has a synchronous read port and is used the same way as async RAM". Must have been some interesting editing that lead to this.
1 parent 64ffcd4 commit 809bb16

File tree

1 file changed

+3
-3
lines changed
  • compiler-user-guide/src/developing-hardware

1 file changed

+3
-3
lines changed

compiler-user-guide/src/developing-hardware/prelude.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,12 @@ ROM is defined using the functions in `Clash.Prelude.ROM`.
129129

130130
RAM is more complex, as it allows both reading and writing.
131131
The function to define a RAM takes in a signal for the address to read, and a signal for an optional address to update (bundled with the new value).
132-
At each cycle it outputs the value of the memory address read in the previous cycle.
132+
The RAM outputs the value of the memory at the requested read address.
133133
Asynchronous RAM is defined in `Clash.Prelude.RAM`.
134134

135135
An FPGA may include a block RAM, which is a larger memory structure and more suitable for some applications.
136-
Block RAM also has a synchronous read port, allowing memory access to be synchronized to a clock.
137-
Block RAM is used the same way as async RAM, allowing the two to be compared quickly.
136+
Block RAM has a synchronous read port, allowing memory access to be synchronized to a clock.
137+
Block RAM has a one-cycle delay, meaning that it outputs the value in memory pointed to by the read address input from the *previous* cycle.
138138
Block RAM is defined in `Clash.Prelude.BlockRam`.
139139

140140
## Undefined Values

0 commit comments

Comments
 (0)