FPGA入门嵌入式块RAM使用为FIOF(First In First Out)
单时钟FIOF、双时钟FIOF(普通双时钟和混合宽度双时钟)
由于单时钟FIOF只有一个时钟信号,所以可以在FPGA内部中使用单时钟FIOF用以其他模块数据的缓存。FPGA中从传感器模块读取到的数据首先保存到FIOF中缓存,然后再通过UART发送。
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议
接收数据速率与发送速率不同时使用双时钟FIOF进行收发(将高速ADC采集的数据通过千兆以太网发送到PC机)。
单时钟FIOF仿真
`timescale 1ns/1ns
`define Clk_period 20
module fifo_single_tb;
reg Clk;
reg [7:0] data;
reg rdreq;
reg sclr;
reg wrreq;
wire almost_empty;
wire almost_full;
wire empty;
wire full;
wire [7:0] q;
wire [7:0] usedw;
fifo fifo0(
.clock(Clk),
.data(data),
.rdreq(rdreq), //读使能信号
.sclr(sclr), //高电平清零信号usedwz值为0
.wrreq(wrreq), //写使能信号
.almost_empty(almost_empty),
.almost_full(almost_full),
.empty(empty),
.full(full),
.q(q), //输出信号
.usedw(usedw) //可查看FIFO中剩余的值 usedw=8表示FIFO里有8个值
);
initial Clk =1;
always #(`Clk_period/2) Clk = ~ Clk;
integer i;
initial begin
#(`Clk_period*2);
wrreq=0;
rdreq=0;
sclr =0;
for(i=0;i<=255;i=i+1) begin
wrreq=1;
data =i;
#`Clk_period;
end
wrreq=0;
#(`Clk_period*10);
for(i=0;i<=255;i=i+1) begin
rdreq=1;
#`Clk_period;
end
#`Clk_period;
wrreq=0;
#(`Clk_period*10);
$stop;
end
endmodule
仿真结果
双时钟FIOF仿真文件
`timescale 1ns/1ns
`define rdclk_period 10 //读时钟100M
`define wrclk_period 20 // 写时钟50M
module medcfifo_tb;
reg[15:0] data;
reg rdclk;
reg rdreq;
reg wrclk;
reg wrreq;
wire [7:0] q;
wire rdempty;
wire [8:0] rdusedw;
wire wrfull;
wire [7:0] wrusedw;
medcfifo medcfifo1(
.data(data),
.rdclk(rdclk),
.rdreq(rdreq), //读使能信号
.wrclk(wrclk),
.wrreq(wrreq), //写使能信号
.q(q), //输出信号
.rdempty(rdempty),
.rdusedw(rdusedw),
.wrfull(wrfull),
.wrusedw(wrusedw)
);
initial rdclk =1;
always #(`rdclk_period/2) rdclk =~rdclk;
initial wrclk =1;
always #(`wrclk_period/2) wrclk =~wrclk;
integer i;
initial begin
data=0;
rdreq=0;
wrreq=0;
for(i=0;i<=255;i=i+1)begin
wrreq=1;
data = i+1024;
#`wrclk_period;
end
wrreq=0;
#(`wrclk_period*5);
for(i=0;i<=511;i=i+1)begin
rdreq=1;
#`rdclk_period;
end
rdreq=0;
#(`rdclk_period*2);
$stop;
end
endmodule
输入为16位,输出位8位
双时钟仿真结果
可以看到输入值为04ff时,对应输出为377 004。先出低位,后出高位。