当前位置:   article > 正文

FPGA入门嵌入式块RAM使用FIOF

fiof

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
仿真结果

在这里插入图片描述

双时钟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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

输入为16位,输出位8位

双时钟仿真结果

在这里插入图片描述
在这里插入图片描述
可以看到输入值为04ff时,对应输出为377 004。先出低位,后出高位。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/801519
推荐阅读
相关标签
  

闽ICP备14008679号