Xilinx FPGA BRAM使用方法

BRAM使用方法

在利用fpga进行数据处理的过程中,对高速数据采集或者传输的过程中,需要对数据尽心缓存,缓存一般有两种不同的方法,一种是FIFO,一种是RAM,FIFO在vivado中提供IP核,FIFO的缓存特性适用于先存先取得过程,没有寻址地址,数据只能按照次序读出,可以用于速率变换,位宽变换的应用中,数据的读写可以分开控制。RAM可以缓存数据,然后按照地址进行读出,这样不受顺序的限制,能够更加灵活的读取数据。在vivado中提供BRAM IP核,Block Memory Generator,使用该IP核可以实现该功能。

以下为使用BRMA的介绍 参考官方文档PG058 - Block Memory Generator v8.4 Product Guide(PG058) 。

直入主题,使用RAM,重点是实现写入和读取的过程,参照官方手册,查看操作模式。

操作模式

1.Write First Mode 写优先模式

在WRITE_FIRST模式下,输入数据同时写入内存,并驱动输出数据,如图3-9所示。这种透明模式提供了在同一端口上进行Write操作期间使用数据输出总线的灵活性。

写优先模式时序
这种模式适合用于先把数据都传入ram,传完之后再进行读取,在写使能信号有效时,输出的是当前写入地址的数据

测试过程



module test(
    input clk,
    input rst_n,
    input [1:0] data_type,
    input en,
    input wr
);

wire [9:0] addra;
wire [7:0] dina;
wire [7:0] douta;

reg [9:0] addrw,addrr,addr;//读地址和写地址
reg [7:0] din;
reg [7:0] dout;  //读出的有效数据

reg [1:0] mode_wr;  //读写模式地址
parameter size = 10'd100;
//在单端口的控制模式下,只有一个地址,
//在写入使能的时候,从写模式的时序中可以看出想当与透传模式,
//先通过有效位进行读写模式判断
always@(posedge clk)begin
    if(~rst_n)begin
        mode_wr <= 2'b0;
    end
    else begin
       if(en==1'b1 & wr==1'b0)begin
          mode_wr <= 2'b01;    //读模式;
       end
       if(en==1'b1 & wr==1'b1)begin 
          mode_wr <= 2'b10;    //写模式
       end
    end
end

//分别读写地址
assign addra = (mode_wr == 2'b10) ? addrw : addrr;
//写控制 从0地址开始写,
always@(posedge clk)begin
    if(~rst_n)begin
        addrw <= 10'b0;
    end
    else begin
        if(mode_wr == 2'b10)begin
            if(addrw >= size)begin
                addrw <= 10'b0;
            end
            else begin
            addrw <= addrw + 10'b1;
            end
        end 
        else begin
            addrw <= 10'b0;
        end 
    end
end
//写数据
always@(posedge clk)begin
    if(!rst_n)begin
        din <= 8'b0;
    end
    else begin
        if(mode_wr == 2'b10)begin
            case(addrw)
                10'h1: begin din <= 8'h1a;end
                10'h2: begin din <= 8'hcf;end
                10'h3: begin din <= 8'hfc;end
                10'h4: begin din <= 8'hdc;end
                10'h5: begin din <= 8'hb6;end
                default: begin din <= 8'h11;end
            endcase
        end
    end
end
assign dina = din;
//读控制
always@(posedge clk)begin
    if(~rst_n)begin
        addrr <= 10'b0;
    end
    else begin
        if(mode_wr == 2'b01)begin
            if(addrr >= size)begin
                addrr <= 10'b0;
            end
            else begin
                addrr <= addrr + 10'b1;
            end
        end 
        else begin
            addrr <= 10'b0;
        end 
    end
end
//读数据
always@(posedge clk)begin
    if(!rst_n)begin
        dout <= 8'b0;
    end
    else begin
        if(mode_wr == 2'b01)begin
           dout <= douta;
        end
    end
end

blk_mem u0 (   //2clk
  .clka(clk),    // input wire clka
  .ena(en),      // input wire ena 使能信号
  .wea(wr),      // input wire [0 : 0] wea
  .addra(addra),  // input wire [9 : 0] addra
  .dina(dina),    // input wire [7 : 0] dina
  .douta(douta)  // output wire [7 : 0] douta
);



endmodule

测试结果

在这里插入图片描述

2.Read First Mode 读优先模式

在READ_FIRST模式下,以前存储在Write地址的数据出现在数据输出中,而输入数据存储在内存中。这种先读后写的行为如图3-10所示
读优先模式时序
在这种模式下,写的地址在移动,但是不影响读数据,数据的内容是之前存储的。

3.No Change Mode 保持模式

在NO_CHANGE模式下,Write操作期间输出锁存保持不变。如图3-11所示,输出的数据仍然是原来的Read数据,不受同一个端口写操作的影响。
保持模式时序

这种模式和读优先的模式相比,是在写的时候地址在动,但是输出不变,还是最开始的地址。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LZW(Lempel-Ziv-Welch)压缩算法是一种无损的数据压缩算法,可用于减小数据的存储空间和传输带宽。使用Xilinx FPGA(现场可编程门阵列)实现LZW压缩算法可以提供硬件加速和高性能。 在实现LZW压缩算法之前,我们首先需要了解算法的基本原理。LZW算法的核心是将输入的连续字符序列编码为较短的固定长度编码,以减小数据的表示。算法通过不断扩展编码本(码表)来实现。 使用Xilinx FPGA实现LZW压缩算法可以利用FPGA的并行处理和并行存储器来加速算法的执行。为了实现LZW压缩算法,我们可以将以下步骤转化为硬件描述语言(HDL)代码: 1. 初始化编码本:在FPGA中,可以使用片上存储器(BRAM)来存储初始编码本。这些编码可以是ASCII字符集的所有单字符编码,也可以是预先设计好的更大的编码集。 2. 输入字符序列:通过逐字读取输入字符序列,将其传输到FPGA的输入缓冲区。 3. 编码匹配:使用硬件逻辑来实现编码本的搜索和匹配。如果当前输入字符序列在编码本中,则将其与之前的字符序列进行匹配,并更新匹配序列。 4. 生成输出编码:如果没有匹配,将当前输入字符序列的编码发送到输出缓冲区中。如果有匹配,继续读取输入字符,直到找到最长的匹配字符串。 5. 更新编码本:将匹配的输入字符序列和新的编码添加到编码本中,以扩展编码本。 6. 输出压缩数据:将生成的输出编码从输出缓冲区传输到外部存储器或其他设备。 通过将LZW压缩算法转化为HDL代码并在Xilinx FPGA上实现,可以获得高效的硬件加速。FPGA的并行处理和并行存储器特性能够极大地提高算法的执行速度和压缩效率。同时,由于FPGA的可编程性,也可以根据特定的需求进行优化和定制化,以实现更高的性能和更低的功耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支绝命钩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值