FPGA入门嵌入式块RAM使用FIOF

FPGA入门嵌入式块RAM使用为FIOF(First In First Out)

单时钟FIOF、双时钟FIOF(普通双时钟和混合宽度双时钟)FPGA入门嵌入式块RAM使用FIOF_第1张图片
由于单时钟FIOF只有一个时钟信号,所以可以在FPGA内部中使用单时钟FIOF用以其他模块数据的缓存。FPGA中从传感器模块读取到的数据首先保存到FIOF中缓存,然后再通过UART发送。
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议
接收数据速率与发送速率不同时使用双时钟FIOF进行收发(将高速ADC采集的数据通过千兆以太网发送到PC机)。
FPGA入门嵌入式块RAM使用FIOF_第2张图片

单时钟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

仿真结果

FPGA入门嵌入式块RAM使用FIOF_第3张图片

双时钟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位

双时钟仿真结果

FPGA入门嵌入式块RAM使用FIOF_第4张图片
FPGA入门嵌入式块RAM使用FIOF_第5张图片
可以看到输入值为04ff时,对应输出为377 004。先出低位,后出高位。

你可能感兴趣的:(FPGA,fpga,verilog)