本文首发于个人博客
1.设计目标
设计一个参数可配置的异步FIFO,要求:
- FIFO深度从4开始在2的幂次方连续可配(4、8、16、…)
- 读写时钟域相位差、频率差任意(同步器参数可配)
2.参数列表
名称 |
默认值 |
说明 |
DEPTH_LOG |
4 |
FIFO容量为 2 D E P T H _ L O G 2^{DEPTH\_LOG} 2DEPTH_LOG |
DATA_WIDTH |
8 |
数据位宽 |
3.端口
3.1.端口列表
3.1.1.系统端口
名称 |
类型 |
位宽 |
说明 |
read_clk |
input |
1 |
读时钟域时钟 |
write_clk |
input |
1 |
写时钟域时钟 |
rst_n |
input |
1 |
系统复位端口,低有效 |
3.1.2.读端口
名称 |
类型 |
位宽 |
说明 |
read_req |
input |
1 |
读完成信号 |
read_valid |
output |
1 |
读数据有效信号 |
read_data |
output |
DEPTH_LOG |
读数据 |
fifo_empty |
output |
1 |
FIFO空信号 |
3.1.3.写端口
名称 |
类型 |
位宽 |
说明 |
write_req |
input |
1 |
写请求信号 |
write_data |
input |
DEPTH_LOG |
写数据 |
fifo_full |
output |
1 |
FIFO满信号 |
3.2.端口时序
3.2.1.读端口时序
read_req
信号拉高表示请求读数据,若此时FIFO非空(fifo_empty
为低),FIFO将会将数据置于read_data
上,同时拉高read_valid
信号。即当read_valid
有效时,对应的read_data
上的数据有效。fifo_empty
拉高表示FIFO已空,当前数据输出端口上的数据无意义, 再拉高read_req