双口RAM及Vivado RAM IP核的使用

2023-11-16

目录

1.双口RAM概述

2.Vivado 双口RAM IP核

2.1 Block Memory Generator概述

2.2 真双口RAM的设置

2.2.1 Basic设置

2.2.2 Port设置

3.双口RAM例程

4.仿真

4.后记

5.参考文献

1.双口RAM概述

双口RAM(dual port RAM)在异构系统中应用广泛,通过双口RAM,不同硬件架构的芯片可以实现数据的交互,从而实现通信。例如,一般情况下,ARM与DSP之间的通信,可以利用双口RAM实现,ARM通过EBI总线连接到双口RAM的A口,DSP通过EMIF总线(也可以是uPP总线,取决于速度需求)连接到双口RAM的B口,两者对同一块存储区域进行操作,即可实现两者的数据交互。

但是,因为双口RAM的A口和B口都可以对相同的内存地址进行操作,这就引出了一个问题——假如通信双方在两个端口对同一地址同时读写,就会引发冲突。要解决这个问题,办法有二。一是通信双方在时序上保证不会同时读写同一地址,将ARM和DSP可写地址范围进行分区,无论任何一方写完数据后都通过IO发送中断通知对方,对方进行数据读取(乒乓RAM操作),这样是比较可靠的;另外一个办法就是在fpga里设置写busy信号,实现两端写同步[1]。在FPGA中,构建双口RAM可以通过两种方法,一种是利用distributed RAM构建,另一种是利用Block RAM构建,关于两者的具体区别,可以参考这两篇文章[2][3]。简而言之,Block RAM是是使用FPGA中的整块双口RAM资源,而distributed RAM则是用FPGA中的逻辑资源拼凑形成的。一般的原则是,较大的存储应用,建议用bram;零星的小ram,一般就用dram。

在Vivado中,RAM IP核在Memories & Strorage Elements\RAM & ROMs和RAM & ROMs & BRAM文件夹下,如图所示,下面简要介绍一下Vivado的双口RAM IP核。

                                                                                       (图1.1)

2.Vivado 双口RAM IP核

2.1 Block Memory Generator概述

    点击图1.1的Block Memory Generator项,利用BRAM来构建双口RAM。Block Memory Generator窗口如图2.1所示。图中,第1部分,在IP symbol选项卡,点击"+"号可以展开端口具体信号,如图2.2所示。第2部分,Component Name可以设置IP核的名字。第3部分,Basic选项卡,在Memory Type下拉列表中,可以设置内存的类型,如图2.3所示。Block Memory Gnerator一共可以产生5种不同类型的内存空间,其中block RAM有三种:单口RAM、简化双口RAM和真双口RAM[4]。单口RAM只有一个端口(A端口),可以对A端口进行读写。简化双口RAM有两个端口(A和B端口),但是A端口只能进行写入操作,不能进行读出操作,而B端口则只能进行读出操作,不能进行写入操作。真双口RAM有两个端口(A和B端口),A和B端口都能进行读写操作[5]

                                                                                          (图2.1)

                                                                                         (图2.2)

                                                                                         (图2.3)

2.2 真双口RAM的设置

2.2.1 Basic设置

    在Basic选项卡的Memory type选项中选择真双口RAM,IP Symbol如图2.4所示。ECC Options为默认设置,Write Enable中也选择默认设置,不使能字节写,Algorithm Options选择默认设置。

                                                                                        (图2.4)

2.2.2 Port设置

    点击Port A Options选项卡,对A端口进行设置, 设置Write Width为16(即RAM单元为16位),Write Width为1024(即内存深度为1024,该端口可读写的RAM单元有1024个),Operating Mode(操作模式)一共有三种:Write First,Read First,No Change。在Write First模式中,在一个时钟周期里,写入内存单元的数据被同步输出到输出数据总线上;在Read First模式中,在一个时钟周期里,写入到内存单元的数据是当前输入数据总线上的数据,而输出到输出数据总线上的数据则是上一个时钟周期存储在内存单元中的数据。细节可参考PG058的49到50页4。Enable Port Type设置为Always Enabled,一直使能端口A。其它设置使用默认设置。如图2.5所示。

                                                                                       (图2.5)

    端口B设置为与A一致。在Other Options选项卡中,保留默认设置。Load Init File设置是否用Coe文件对内存区域初始化,这个在初始化ROM的时候会用到,这里不勾选,保持默认。最后,在Summary选项卡会显示消耗的资源。

3.双口RAM例程

    例程1,该例程是Altera官方例程[6],采用寄存器构建双口RAM,代码如下:

module true_dpram_sclk
(
    input [7:0] data_a, data_b,
    input [5:0] addr_a, addr_b,
    input we_a, we_b, clk,
    output reg [7:0] q_a, q_b
);
    // Declare the RAM variable
    reg [7:0] ram[63:0];
    
    // Port A
    always @ (posedge clk)
    begin
        if (we_a) 
        begin
            ram[addr_a] <= data_a;
            q_a <= data_a;
        end
        else 
        begin
            q_a <= ram[addr_a];
        end
    end
    
    // Port B
    always @ (posedge clk)
    begin
        if (we_b)
        begin
            ram[addr_b] <= data_b;
            q_b <= data_b;
        end
        else
        begin
            q_b <= ram[addr_b];
        end
    end
    
endmodule

例程2,该例程是Xilinx官方例程[7],采用寄存器构建真双口RAM,代码如下:

// Dual-Port Block RAM with Two Write Ports
// File: rams_16.v

module v_rams_16 (clka,clkb,ena,enb,wea,web,addra,addrb,dia,dib,doa,dob);

input clka,clkb,ena,enb,wea,web;
input [9:0] addra,addrb;
input [15:0] dia,dib;
output [15:0] doa,dob;
reg[15:0] ram [1023:0];
reg[15:0] doa,dob;

always @(posedge clka) begin if (ena)
begin
 if (wea)
 ram[addra] <= dia;
 doa <= ram[addra];
 end
end

always @(posedge clkb) begin if (enb)
begin
 if (web)
 ram[addrb] <= dib;
 dob <= ram[addrb];
 end
end

endmodule

例程3,该例程是网友博客中的例程[8],代码如下:

module TOP(  
input USER_CLK  
    );  
  
`define DLY #1  
reg FPGA_Enable=0;  
reg[3:0] FPGA_Write_Enable=4'h0;  
reg[31:0] FPGA_Address=0;  
reg[31:0] FPGA_Write_Data=0;  
reg[31:0] FPGA_Read_Data_reg=0;  
wire[31:0] FPGA_Read_Data;  
  
reg[10:0] count=0;  
always @ (posedge USER_CLK)  
begin  
    count <= count + 1;  
    if(count<=100)  
    begin  
        FPGA_Enable <= 0;  
        FPGA_Write_Enable <= 4'h0;  
    end  
    else if((count <= 105)&&(count >100))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 4'hf;  
        FPGA_Address <= FPGA_Address + 4;  
        FPGA_Write_Data <= FPGA_Write_Data + 1;  
    end  
    else if((count <= 110)&&(count >105))  
    begin  
        FPGA_Enable <= 0;  
        FPGA_Write_Enable <= 4'h0;  
        FPGA_Address <= 0;  
        FPGA_Write_Data <= 0;  
    end  
    else if((count <= 117)&&(count >110))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 4'h0;  
        FPGA_Read_Data_reg <= FPGA_Read_Data;  
        FPGA_Address <= FPGA_Address + 4;  
    end  
    else if(count == 118)  
    begin  
        FPGA_Enable <= 0;  
        count <= count;  
          
    end  
end  
  
BBBB your_instance_name (  
  .clka(USER_CLK), // input clka  
  .ena(FPGA_Enable), // input ena  
  .wea(FPGA_Write_Enable), // input [3 : 0] wea  
  .addra(FPGA_Address), // input [31 : 0] addra  
  .dina(FPGA_Write_Data), // input [31 : 0] dina  
  .douta(FPGA_Read_Data), // output [31 : 0] douta  
    
    
  .clkb(clkb), // input clkb  
  .enb(enb), // input enb  
  .web(web), // input [3 : 0] web  
  .addrb(addrb), // input [31 : 0] addrb  
  .dinb(dinb), // input [31 : 0] dinb  
  .doutb(doutb) // output [31 : 0] doutb  
);  
endmodule  

该例程中,在count为101(>100)后开始往地址4到20写入1-5,然后在count为111(>110)的时候读出写入的数据。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2017/12/09 22:36:48
// Design Name: 
// Module Name: dual_port_ram_demo
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module dual_port_ram_demo(
input USER_CLK
    );
  
`define DLY #1  

//Port A declaration
reg FPGA_Enable=0;  
reg FPGA_Write_Enable=0;  
reg[31:0] FPGA_Address=0;  
reg[31:0] FPGA_Write_Data=0;  
reg[31:0] FPGA_Read_Data_reg=0;  
wire[31:0] FPGA_Read_Data;  

//Port B declaration
reg enb=0;
reg[3:0] web=4'h0;
reg[31:0] addrb=0;
reg[31:0] dinb=0;
reg[31:0] doutb_reg=0;
wire[31:0] doutb=0;
  
reg[10:0] count=0;  
always @ (posedge USER_CLK)  
begin  
    count <= count + 1;  
    if(count<=100)  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 0;  
    end  
    else if((count <= 105)&&(count >100))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 1;  
        FPGA_Address <= FPGA_Address + 4;  
        FPGA_Write_Data <= FPGA_Write_Data + 1;  
    end  
    else if((count <= 110)&&(count >105))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 0;  
        FPGA_Address <= 0;  
        FPGA_Write_Data <= 0;  
    end  
    else if((count <= 117)&&(count >110))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 1;  
        FPGA_Read_Data_reg <= FPGA_Read_Data;  
        FPGA_Address <= FPGA_Address + 4;  
    end  
    else if(count == 118)  
    begin  
        FPGA_Enable <= 0;  
        count <= count;  
          
    end  
end  
  
dpRAM u1 (  
  .clka(USER_CLK), // input clka  
  .ena(FPGA_Enable), // input ena  
  .wea(FPGA_Write_Enable), // input [3 : 0] wea  
  .addra(FPGA_Address), // input [31 : 0] addra  
  .dina(FPGA_Write_Data), // input [31 : 0] dina  
  .douta(FPGA_Read_Data), // output [31 : 0] douta  
    
    
  .clkb(USER_CLK), // input clkb  
  .enb(enb), // input enb  
  .web(web), // input [3 : 0] web  
  .addrb(addrb), // input [31 : 0] addrb  
  .dinb(dinb), // input [31 : 0] dinb  
  .doutb(doutb) // output [31 : 0] doutb  
);  
endmodule  
testbench文件如下:
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2017/12/09 22:47:26
// Design Name: 
// Module Name: simu
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module simu(

    );
//testbench 时钟信号
reg clk = 0;
always # 10 clk <= ~clk;
//调用dual_port_ram_demo模块
dual_port_ram_demo demo1(clk);
endmodule

4.仿真

    下面利用Modelsim和Vivado进行联合仿真,关于vivado如何与modelsim进行联合仿真可以参考这篇文章:

vivado与modelsim的关联以及器件库编译

有一点要注意的是,我用的是Vivado2017.1版本,这个版本只支持Modelsim10.5及以上的版本,如果是低版本的Modelsim,在用Vivado2017.1编译Modelsim的仿真库时,会出错。Modelsim10.5版本可以在这里下载:

modelsim 10.5 适用vivado 2017.1

    用Modelsim仿真时,会在sim_1/behav文件夹下产生3个.do文件,分别是xx_compile.do,xx_simulate.do,xx _wave.do文件。在设计的verilog文件修改之后,如果在Modelsim中直接restart,仿真的其实还是没有修改前的文件,要使修改的.v文件在Modelsim中生效,可以在Modelsim的命令窗口输入do xx_compile.do文件,对仿真的库文件以及设计文件(.v文件)重新编译,然后在输入do xx_simulate.do文件,才能仿真修改后的文件。输入do xx_compile.do命令对设计文件重新编译的时候,Modelsim会强制退出,这时由最后一句force quit命令引起的,只要把它删掉就行了。如果要保存波形文件,可以save format,另存为xx_wave.do文件。

    参考上面双口RAM的例程3进行功能仿真,RAM IP使用Write First模式,设计文件代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2017/12/09 22:36:48
// Design Name: 
// Module Name: dual_port_ram_demo
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module dual_port_ram_demo(
input USER_CLK
    );
  
`define DLY #1  

//Port A declaration
reg FPGA_Enable=0;  
reg FPGA_Write_Enable=0;  
reg[31:0] FPGA_Address=0;  
reg[31:0] FPGA_Write_Data=0;  
reg[31:0] FPGA_Read_Data_reg=0;  
wire[31:0] FPGA_Read_Data;  

//Port B declaration
reg enb=0;
reg[3:0] web=4'h0;
reg[31:0] addrb=0;
reg[31:0] dinb=0;
reg[31:0] doutb_reg=0;
wire[31:0] doutb=0;
  
reg[10:0] count=0;  
always @ (posedge USER_CLK)  
begin  
    count <= count + 1;  
    if(count<=100)  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 0;  
    end  
    else if((count <= 105)&&(count >100))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 1;  
        FPGA_Address <= FPGA_Address + 4;  
        FPGA_Write_Data <= FPGA_Write_Data + 1;  
    end  
    else if((count <= 110)&&(count >105))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 0;  
        FPGA_Address <= 0;  
        FPGA_Write_Data <= 0;  
    end  
    else if((count <= 117)&&(count >110))  
    begin  
        FPGA_Enable <= 1;  
        FPGA_Write_Enable <= 1;  
        FPGA_Read_Data_reg <= FPGA_Read_Data;  
        FPGA_Address <= FPGA_Address + 4;  
    end  
    else if(count == 118)  
    begin  
        FPGA_Enable <= 0;  
        count <= count;  
          
    end  
end  
  
dpRAM u1 (  
  .clka(USER_CLK), // input clka  
  .ena(FPGA_Enable), // input ena  
  .wea(FPGA_Write_Enable), // input [3 : 0] wea  
  .addra(FPGA_Address), // input [31 : 0] addra  
  .dina(FPGA_Write_Data), // input [31 : 0] dina  
  .douta(FPGA_Read_Data), // output [31 : 0] douta  
    
    
  .clkb(USER_CLK), // input clkb  
  .enb(enb), // input enb  
  .web(web), // input [3 : 0] web  
  .addrb(addrb), // input [31 : 0] addrb  
  .dinb(dinb), // input [31 : 0] dinb  
  .doutb(doutb) // output [31 : 0] doutb  
);  
endmodule  

testbench文件如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2017/12/09 22:47:26
// Design Name: 
// Module Name: simu
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module simu(

    );
//testbench 时钟信号
reg clk = 0;
always # 10 clk <= ~clk;
//调用dual_port_ram_demo模块
dual_port_ram_demo demo1(clk);
endmodule

仿真结果如下:

                                                                                      (图4.1)

    程序在1时刻准备好地址和要写入RAM的数据,在2时刻写入RAM中,在3时刻端口才会输出2时刻写入RAM的数据,注意与PG058的图稍有不同。

                                                       

                                                                                         (图4.2)

4.后记

    关于BRAM,推荐一个youtube视频,里面讲的非常清晰易懂。

What is a Block RAM in an FPGA?

5.参考文献

[1] 基于FPGA的双口RAM设计方法.

[2] 关于Xilinx芯片中Block RAM和Distributed RAM 的区别.

[3] Block RAM 和Distributed RAM.

[4] Block Memory Generator v8.2 LogiCORE IP Product Guide (PG058).P42-45.P49-50.

[5] FPGA开发之RAM IP的使用

[6] Verilog HDL:具有单时钟的真双端口RAM.

[7] Vivado Design Suite User Guide: Synthesis (UG901).P96.

[8] FPGA 内部双口块RAM 读写实现.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双口RAM及Vivado RAM IP核的使用 的相关文章

  • FPGA Xilinx 7系列高速收发器GTX通信

    Xilinx 7系列高速收发器GTX 说明 FPGA TX端 zynq 7z035 RX端 zynq 7z100 两个FPGA通过SFP 光纤 接口相连进行GTX的通信 环境 Vivado2018 2 IP核 7 Series FPGAs
  • Lattice Diamond安装

    1 下载 到Lattice官网 http www latticesemi com 注册一个lattice的账号后就可以去下载Diamond 登陆后如下图 根据自己系统情况选择对应的版本 我用的是32位win8 Diamond软件安装包和La
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • [从零开始学习FPGA编程-28]:进阶篇 - 基本组合电路-奇偶校验生成器(Verilog语言版本)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 奇偶校验生成器 1 1 什么是奇校验 1 2 Verilog语言描述
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • 使用七牛云进行文件上传

    目录 一 七牛云入门测试 1 注册七牛云账号 完成后选择对象存储 2 在里面创建空间 一个空间相当于一个文件夹 就是将对象上传到的地方 3 查看个人秘钥 注册完成账号后 会有一个秘钥 上传文件的时候进行授权和认证 4 文件上传测试 二 封装
  • FPGA学习笔记(一)__电平知识

    常见电平标准 文章目录 1 TTL电平标准 2 LVTTL电平标准 1 LVTTL3V3 2 LVTTL2V5 3 CMOS电平标准 4 LVCOMS电平标准 1 LVCOMS3V3 2 LVCOMS2V5 3 LVCOMS1V8 4 LV
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • FPGA功耗估计(二)

    针对于Altera的Cyclone III 做出了静态功耗 对于Altera 其提供了一个功耗早期估计工具 可以在官网上下到 首先需要将宏设置为安全 在excel选型中选择文件 之后便可看到 根据相应的选择 红框部分 可以查看静态功耗 对于
  • FPGA_MIG驱动DDR3

    FPGA MIG驱动DDR3 说明 FPGA zynq 7z100 DDR3 MT41K256M16TW 107 内存大小为512MB 数据接口为16bit 环境 Vivado2018 2 IP核 Memory Interface Gene
  • [从零开始学习FPGA编程-38]:进阶篇 -语法-函数与任务

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 什么是函数Function 1 1 什么是函数 1 2 函
  • Spartan-3E 上的随机数生成

    我需要在 Spartan 3E FPGA 上为我的遗传算法生成伪随机数 并且我想在 verilog 中实现它 您能给我任何关于此的指示吗 当然 Adam 的随机生成器是不可合成的 您必须显式创建一个LFSR 以下示例可能会有所帮助 它是一个
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 模拟器和合成器之间初始化状态机的差异

    我的问题是关于合成状态机中使用的第一个状态 我正在使用莱迪思 iCE40 FPGA 用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer 在下面的示例中 我生成一系列信号 该示例仅显示引用状态机
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接

随机推荐

  • node.js如何封装一个接口

    用到的应用 1 webstorm 2 Navicat for MySQL 3 postman 一 使用express创建项目 1 npm install express generator g 2 express myapp 二 使用Nav
  • Openwrt下ipk包的安装、卸载与更新

    一 环境说明 Openwrt version 17 01 4 Linux version 4 4 92 二 安装ipk 将编译好的 ipk传到开发板上 使用命令 opkg install xxxxx ipk 安装成功的界面如下 再进入 li
  • 【软件工程期末复习内容】

    前言 时不可以苟遇 道不可以虚行 一 软件工程的概念 软件是计算机系统运行的 指令 数据 和 相关文档 的集合 即软件等于程序 数据 加上文档 程序 是事先按照预定功能性能等要求设计和编写的指令序列 数据 是使程序正常处理信息的数据结构及信
  • 远程计算机内部错误,Win10系统远程桌面连接出现内部错误怎么办?

    Win10系统远程桌面连接出现内部错误该怎么办 大家在使用Win10系统的时候总是会出现这样那样的问题 Win 10 远程桌面连接偶尔提示 出现了内部错误 刚刚明明还好好的 有时连接久了会突然断开 提示出现了内部错误 我们遇到这个问题该怎么
  • 生态系统过程模型

    生态系统过程模型 根据生态系统的生理生态学特性 结合影响生态系统过程的观测指标 提出的能够反映生态系统过程的机制模型 统计模型 stochasticmodel statisticmodel probabilitymodel 指以概率论为基础
  • qt 动态库的创建和使用教程(step by step)

    一般大型项目中 会将实现特定功能的函数或类 封装成链接库 供应用程序代码调用 下面我将一步步教你如何在qt 中创建动态库 并使用它 目录 创建多子目录项目 创建动态链接库 编辑链接库内容 创建应用工程并连接动态链接库 创建多子目录项目 首先
  • React基础入门

    系统学习React 一 基础知识 邂逅React开发 React系列一 核心JSX语法一 React系列二 核心JSX语法二 React系列三 阶段案例练习 React系列四 React脚手架 React系列五 组件化开发 一 React系
  • mysql8.0.30用户与权限管理

    文章目录 用户管理 登录mysql服务器 创建用户 修改用户 删除用户 查看用户 修改用户密码 权限管理 查看权限 授予权限的原则 授予权限 查看权限 收回权限 查看user 信息表结构和信息 db表 其他表信息 角色管理 创建角色 给角色
  • Python之NumPy(axis=0/1/2...)的透彻理解

    前言 在numpy的使用中 对axis的使用总是会产生疑问 如np sum函数 在多维情况下 axis不同的取值应该做怎样的运算呢 返回的是什么形状的数组呢 在网上查了很多资料 总是似懂非懂 查阅了官方文件 以及多次试验后 我总结出一种能深
  • [ZYNQ随笔] uboot移植中bitstream比特流加载问题:zynq_validate_bitstream: Bitstream is not validated yet

    问题介绍 由于项目设计需要 需要频繁的更换比特流文件 之前使用petalinux生成的boot bin每次都需要合并比特流 比较麻烦 遂换了一个uboot版本 米联客默认的u boot 将bitstream放到了独立于boot bin的文件
  • 经验教训

    最近有一个项目基于STM32F446ZE MCU使用FREERTOS操作系统开发 之前有部分功能代码是基于MCU裸机开发的 移植过程种发现程序老出错 DEBUG模式条件发现程序停在了HardFault Handler中断服务程序中 查看对应
  • 对角矩阵np.diag()

    np diag 是 NumPy 库中的一个函数 用于创建一个对角矩阵或从一个矩阵中提取对角线元素 具体来说 np diag 可以接受以下两种参数 一个一维数组 将其转换为一个对角矩阵 数组中的元素将成为对角线上的元素 例如 np diag
  • STM3232 GPIO的配置寄存器(为了移植IIC)

    参考 https blog csdn net qq 45539458 article details 129481019 https blog csdn net weixin 43314829 article details 1255734
  • 公共IP地址、私有IP地址、NAT技术

    1 公共IP地址和私有IP地址的区别 在 Internet 上存在数量有限的 IP 地址 这些能在Intenet上使用的地址被称为公共IP地址 且IP地址必须是唯一的 但是私有IP地址就是例外 这些IP地址供LAN网络中使用 同时它们可以在
  • Win7连接共享打印机时,报 0x00000bcb 错误

    打印服务器添了台 DocuCentre VI C3371 富士施乐3371打印机 问题描述 Win8 1 Win10等系统均能正常连接 部分 Win7 客户端连接时 报0x00000bcb错误 解决方法 后来桌面小哥找到了解决方法 Win7
  • 带头节点链表的操作使用讲解

    带头结点链表 链表一共具有创建 增添 删除 查找四种基本操作 接下来会对这四种操作进行挨个讲解 在此之前首先提供链表结点 初始化链表 删除链表的代码 链表结点 每一个节点都包含有一个数据以及指向下一结点的指针 以及定义一个链表的头指针 ty
  • 【Java八股文总结】之面试题(二)

    文章目录 面试题 一 几种锁的区别 1 synchronized 和ReentrantLock的区别 二 Java高级 1 反射 1 反射的应用场合 2 Java反射API 3 反射使用步骤 获取Class 对象 调用对象方法 4 获取Cl
  • shell脚本学习笔记2

    小试牛刀 文章目录 小试牛刀 1 7 别名 1 8 获取并设置日期及延时 1 9 调试脚本 1 10 函数和参数 1 11 将一个命令的输出发送给另一个命令 1 11 1 利用子 shell 生成一个独立的进程 1 11 2 通过引用子sh
  • 轻型数据库SQLite与Android实例

    SQLite 是一款轻型的数据库 是遵守ACID的关联式数据库管理系统 它的设计目标是嵌入式的 而且目前已经在很多嵌入式产品中使用了它 它占用资源非常的低 在嵌入式设备中 可能只需要几百K的内存就够了 它能够支持Windows Linux
  • 双口RAM及Vivado RAM IP核的使用

    目录 1 双口RAM概述 2 Vivado 双口RAM IP核 2 1 Block Memory Generator概述 2 2 真双口RAM的设置 2 2 1 Basic设置 2 2 2 Port设置 3 双口RAM例程 4 仿真 4 后