FPGA寄存器 Vivado IP核

1.  今日任务

小梅哥视频:21A 认识并理解FPGA中的存储器模型_哔哩哔哩_bilibili

                      21B 学习使用Vivado中的存储器资源_哔哩哔哩_bilibili

2. FPGA中的存储器类型

只读ROM                 eg.CMOS摄像头初始化、DDS信号发生器(固定波形数据的形式)

                数据量比较多

                数据值已知

                数据值不需要更改

可读可写RAM                 eg. DDS信号发生器(波形可调)
                数据量相对较大

                数据要求能被更改

                数据要能重复使用

                                         eg. 高速数据采集系统

                数据速率不匹配

                数据消耗速率  慢于  数据生产速率

                数据总量有限

                                         eg. 以太网 or USB传输
                数据速率不匹配

                数据消耗速率  快于  数据生产速率

                数据消耗时要求连续

3.  存储器资源使用

4.  matlab生成coe文件

【FPGA】:matlab生成coe文件-优快云博客

sin-cos wave

%% sin-cos wave data write in coe file
clear all ;
clc ;

width = 10;//与幅值有关
N = 4096 ;  // depth  数据个数
y = zeros(N , 1) ;
for i = 1:1:N 
    x = i ;
    %y(i,1) = ceil( 127*sin(x*2*pi/N) ) + 127 ;
    y(i,1) = ceil( 127*cos(x*2*pi/N) ) + 127 ;
end   
plot(y);
hold on;
fid = fopen('cos_4096.coe','wt');    
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');                     
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
    fprintf(fid,'%d,\n',y(i,1));  
end
fclose(fid);

triangle wave

%% triangle wave data write in coe file
clear all ;
clc ;
width = 10;//与幅值有关
N = 4096 ;  // depth  数据个数
y = zeros(N , 1) ;
for i = 1:1:N 
    if(i < 2049)
        y(i,1) = fix( (i/8) - 1 ) ;
    else
        y(i,1) = fix( ((4096 - i )/8) ) ;
    end
end   
plot(y);
hold on;
fid = fopen('triangle_4096.coe','wt');    
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');                     
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
    fprintf(fid,'%d,\n',y(i,1));  
end
fclose(fid);

rectangle wave
%% rectangle wave data write in coe file
clear all ;
clc ;
width = 10;//与幅值有关
N = 4096 ;  // depth  数据个数
y = zeros(N , 1) ;
for i = 1:1:N 
    if(i < 2049)
        y(i,1) = 255 ;
    else
        y(i,1) = 0 ;
    end
end   
plot(y);
hold on;
fid = fopen('rectangle_4096.coe','wt');    
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');                     
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
    fprintf(fid,'%d,\n',y(i,1));  
end
fclose(fid);
 

5.  rom_tb

`timescale 1ns / 1ns

module rom_1_tb(    );
        reg  clka;
        reg  ena;
        reg  [11 : 0] addra;
        wire  [9 : 0] douta;
     blk_mem_gen_0   rom_1_test(
                          .clka(clka),
                          .ena(ena),
                          .addra(addra),
                          .douta(douta)
                            );
        initial clka = 1 ;
        always #10 clka = ~clka ;
        
        initial
        begin
                ena = 0 ; 
                addra = 0 ;
                #201;
                ena = 1 ;
                repeat(8000)
                begin 
                    addra = addra + 1 ;
                    #20;
                end
                #200;
        $stop;
        end
        

endmodule
 

FPGA移位寄存器IP是一种在FPGA开发中常用的IP,可以方便地实现基于RAM的移位寄存器功能。该IP具有参数化的抽头,可以在寄存器链的特定节点将数据输出。它的接口信号包括移位寄存器的数据输入(shiftin)、末端的输出(shiftout)、工作时钟(clock)以及中间固定间隔抽头的输出(taps)。抽头的数据位宽为数据位宽乘以抽头数。 该IP可以通过Quartus II进行配置和调用,并通过SignalTap II工具进行板级测试和抓取。在SignalTap II中,可以选择创建group来将多个抽头数据组合输出,也可以不创建group直接输出每个抽头的数据。 使用FPGA移位寄存器IP可以简化移位寄存器的实现,并且可以快速实现较大移位寄存器,同时可以实现不同移位位数的移位寄存器。 另外,根据一些FPGA图像处理的资料,获得3×3图像矩阵的方法也可以使用移位寄存器IP。除此之外,还可以使用RAM或FIFO实现这一功能。在Vivado开发环境中,移位寄存器只能缓存一行数据,且最多可以缓存1088个数据。因此,在Vivado中推荐使用FIFO或RAM来实现图像数据的缓存。 综上所述,FPGA移位寄存器IP是一种方便实现移位寄存器功能的IP,可以通过Quartus II进行配置调用,也可以通过SignalTap II工具进行测试与抓取。它在FPGA开发中具有广泛的应用,并且可以与其他IP协同工作,实现更复杂的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值