使用VIVADO中的MIG控制DDR3(AXI接口)二——用AXI4读写BRAM测试

article/2025/10/9 10:51:07

        上篇文章主要讲了一些关于AXI的知识,有了这些理论,让我们进行一些简单的实验测试,加深对AXI协议的理解。本次实验使用的平台是VIVADO2019.1。

       1. 首先创建一个工程,名称和路径自己决定。

        2.然后按照图中所示,点击新建和打包一个新IP核。

3.点击NEXT

4.选择一个带AXI4接口的IP核,然后点击NEXT

 5.记得修改名称,不然后边不好修改,路径可以直接放在工程根目录下

 6.名称我们进行修改,然后选用FULL接口的AXI,选择IP核为主机,数据位宽选32bits

 7.我们选择编辑此IP,我们便成功调用IP

 8.IP设置完成后,我们可以看到里边的.v代码,主要就是一个测试模块,它实现的功能就是利用AXI4接口向外发送1024个数据,然后再将数据读回,通过对比来验证AXI4这个IP核的功能。我对生成的代码做了一些注释,大家可以对照理解,代码不需要动,可以直接使用。

`timescale 1 ns / 1 psmodule AXI4_v1_0_AXI_MASTER #(// Users to add parameters here// User parameters ends// Do not modify the parameters beyond this line// Base address of targeted slave               基地址parameter  C_M_TARGET_SLAVE_BASE_ADDR	= 32'h40000000,// Burst Length. Supports 1, 2, 4, 8, 16, 32, 64, 128, 256 burst lengths   突发长度parameter integer C_M_AXI_BURST_LEN	= 16,// Thread ID Width             写ID宽度parameter integer C_M_AXI_ID_WIDTH	= 1,// Width of Address Bus           写地址宽度parameter integer C_M_AXI_ADDR_WIDTH	= 32,// Width of Data Bus              写数据宽度parameter integer C_M_AXI_DATA_WIDTH	= 32,// Width of User Write Address Busparameter integer C_M_AXI_AWUSER_WIDTH	= 0,// Width of User Read Address Busparameter integer C_M_AXI_ARUSER_WIDTH	= 0,// Width of User Write Data Busparameter integer C_M_AXI_WUSER_WIDTH	= 0,// Width of User Read Data Busparameter integer C_M_AXI_RUSER_WIDTH	= 0,// Width of User Response Busparameter integer C_M_AXI_BUSER_WIDTH	= 0)(// Users to add ports here// User ports ends// Do not modify the ports beyond this line
//用户IO// Initiate AXI transactions 写开始信号input wire  INIT_AXI_TXN,// Asserts when transaction is complete写完成信号output wire  TXN_DONE,     // Asserts when ERROR is detected 数据检测信号output reg  ERROR,// Global Clock Signal. 全剧时钟input wire  M_AXI_ACLK,// Global Reset Singal. This Signal is Active Low  全局复位信号input wire  M_AXI_ARESETN,// Master Interface Write Address ID      写地址IDoutput wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_AWID,// Master Interface Write Address        写地址output wire [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_AWADDR,// Burst length. The burst length gives the exact number of transfers in a burstoutput wire [7 : 0] M_AXI_AWLEN,   //写长度// Burst size. This signal indicates the size of each transfer in the burstoutput wire [2 : 0] M_AXI_AWSIZE,  //写宽度// Burst type. The burst type and the size information, // determine how the address for each transfer within the burst is calculated.output wire [1 : 0] M_AXI_AWBURST, //写类型// Lock type. Provides additional information about the// atomic characteristics of the transfer.output wire  M_AXI_AWLOCK,  //独占传输类型// Memory type. This signal indicates how transactions// are required to progress through a system.output wire [3 : 0] M_AXI_AWCACHE,  //存储类型,指明是否缓存// Protection type. This signal indicates the privilege// and security level of the transaction, and whether// the transaction is a data access or an instruction access.output wire [2 : 0] M_AXI_AWPROT,  //安全保护// Quality of Service, QoS identifier sent for each write transaction.output wire [3 : 0] M_AXI_AWQOS,  //服务质量QOS// Optional User-defined signal in the write address channel. 用户自定义output wire [C_M_AXI_AWUSER_WIDTH-1 : 0] M_AXI_AWUSER,// Write address valid. This signal indicates that// the channel is signaling valid write address and control information.output wire  M_AXI_AWVALID, // 写地址发送有效,主机发给从机// Write address ready. This signal indicates that// the slave is ready to accept an address and associated control signalsinput wire  M_AXI_AWREADY,  //写地址接收有效,从机发给主机// Master Interface Write Data. 写数据 32位output wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_WDATA,// Write strobes. This signal indicates which byte// lanes hold valid data. There is one write strobe// bit for each eight bits of the write data bus.   频闪信号32/8 = 4位output wire [C_M_AXI_DATA_WIDTH/8-1 : 0] M_AXI_WSTRB,// Write last. This signal indicates the last transfer in a write burst.output wire  M_AXI_WLAST, //写数据最后一位// Optional User-defined signal in the write data channel.output wire [C_M_AXI_WUSER_WIDTH-1 : 0] M_AXI_WUSER, //用户自定义// Write valid. This signal indicates that valid write// data and strobes are available  写数据发送有效,主到从output wire  M_AXI_WVALID,// Write ready. This signal indicates that the slave// can accept the write data. //写数据接收有效,从到主input wire  M_AXI_WREADY,// Master Interface Write Response. 写响应IDinput wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_BID,// Write response. This signal indicates the status of the write transaction.input wire [1 : 0] M_AXI_BRESP, //写响应信号// Optional User-defined signal in the write response channelinput wire [C_M_AXI_BUSER_WIDTH-1 : 0] M_AXI_BUSER, // 用户自定义// Write response valid. This signal indicates that the// channel is signaling a valid write response.input wire  M_AXI_BVALID,  //写响应信号发送有效,从到主// Response ready. This signal indicates that the master// can accept a write response.output wire  M_AXI_BREADY, //写响应信号接收有效,主到从// Master Interface Read Address.读地址IDoutput wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_ARID,// Read address. This signal indicates the initial// address of a read burst transaction. 读地址output wire [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_ARADDR,// Burst length. The burst length gives the exact number of transfers in a burstoutput wire [7 : 0] M_AXI_ARLEN,  //读突发长度// Burst size. This signal indicates the size of each transfer in the burstoutput wire [2 : 0] M_AXI_ARSIZE, //读突发大小// Burst type. The burst type and the size information, // determine how the address for each transfer within the burst is calculated.output wire [1 : 0] M_AXI_ARBURST, //读突发类型// Lock type. Provides additional information about the// atomic characteristics of the transfer.output wire  M_AXI_ARLOCK,  //总线锁信号// Memory type. This signal indicates how transactions// are required to progress through a system.output wire [3 : 0] M_AXI_ARCACHE, //Cache类型,是否缓存// Protection type. This signal indicates the privilege// and security level of the transaction, and whether// the transaction is a data access or an instruction access.output wire [2 : 0] M_AXI_ARPROT, //保护类型// Quality of Service, QoS identifier sent for each read transactionoutput wire [3 : 0] M_AXI_ARQOS, //质量服务// Optional User-defined signal in the read address channel.output wire [C_M_AXI_ARUSER_WIDTH-1 : 0] M_AXI_ARUSER,// Write address valid. This signal indicates that// the channel is signaling valid read address and control informationoutput wire  M_AXI_ARVALID, //读地址发送有效,主到从// Read address ready. This signal indicates that// the slave is ready to accept an address and associated control signalsinput wire  M_AXI_ARREADY, //读地址接收有效,从到主// Read ID tag. This signal is the identification tag// for the read data group of signals generated by the slave.input wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_RID, //读数据ID// Master Read Data                  读数据input wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_RDATA, // Read response. This signal indicates the status of the read transferinput wire [1 : 0] M_AXI_RRESP,   //读响应信号// Read last. This signal indicates the last transfer in a read burstinput wire  M_AXI_RLAST,        //突发读传输的最后一个数据// Optional User-defined signal in the read address channel.input wire [C_M_AXI_RUSER_WIDTH-1 : 0] M_AXI_RUSER, //用户自定义信号// Read valid. This signal indicates that the channel// is signaling the required read data.input wire  M_AXI_RVALID, //读数据发送有效,从到主// Read ready. This signal indicates that the master can// accept the read data and response information.output wire  M_AXI_RREADY   //读数据接收有效。主到从);// function called clogb2 that returns an integer which has the//value of the ceiling of the log base 2// function called clogb2 that returns an integer which has the // value of the ceiling of the log base 2.                      function integer clogb2 (input integer bit_depth);         //计算信号的位宽     begin                                                           for(clogb2=0; bit_depth>0; clogb2=clogb2+1)                   bit_depth = bit_depth >> 1;                                 end                                                           endfunction                                                     // C_TRANSACTIONS_NUM is the width of the index counter for // number of write or read transaction.(4)                  C_TRANSACTIONS_NUM指读/写标识计数器的位宽localparam integer C_TRANSACTIONS_NUM = clogb2(C_M_AXI_BURST_LEN-1);// Burst length for transactions, in C_M_AXI_DATA_WIDTHs.// Non-2^n lengths will eventually cause bursts across 4K address boundaries.localparam integer C_MASTER_LENGTH	= 12;// total number of burst transfers is master length divided by burst length and burst sizelocalparam integer C_NO_BURSTS_REQ = C_MASTER_LENGTH-clogb2((C_M_AXI_BURST_LEN*C_M_AXI_DATA_WIDTH/8)-1);//12-6 = 6// Example State machine to initialize counter, initialize write transactions, // initialize read transactions and comparison of read data with the // written data words.parameter [1:0] IDLE = 2'b00, // This state initiates AXI4Lite transaction // after the state machine changes state to INIT_WRITE // when there is 0 to 1 transition on INIT_AXI_TXN 上升沿INIT_WRITE   = 2'b01, // This state initializes write transaction,// once writes are done, the state machine // changes state to INIT_READ INIT_READ = 2'b10, // This state initializes read transaction// once reads are done, the state machine // changes state to INIT_COMPARE INIT_COMPARE = 2'b11; // This state issues the status of comparison // of the written data with the read data	reg [1:0] mst_exec_state;// AXI4LITE signals//AXI4 internal temp signalsreg [C_M_AXI_ADDR_WIDTH-1 : 0] 	axi_awaddr; //32位写地址reg  	axi_awvalid;reg [C_M_AXI_DATA_WIDTH-1 : 0] 	axi_wdata;  //32位写数据reg  	axi_wlast;reg  	axi_wvalid;reg  	axi_bready;reg [C_M_AXI_ADDR_WIDTH-1 : 0] 	axi_araddr;  //32位读地址reg  	axi_arvalid;reg  	axi_rready;//write beat count in a burst 写计数5位reg [C_TRANSACTIONS_NUM : 0] 	write_index;//read beat count in a burst  读计数5位reg [C_TRANSACTIONS_NUM : 0] 	read_index;//size of C_M_AXI_BURST_LEN length burst in bytes 7位wire [C_TRANSACTIONS_NUM+2 : 0] 	burst_size_bytes;//The burst counters are used to track the number of burst transfers of C_M_AXI_BURST_LEN burst length needed to transfer 2^C_MASTER_LENGTH bytes of data.reg [C_NO_BURSTS_REQ : 0] 	write_burst_counter; //7位reg [C_NO_BURSTS_REQ : 0] 	read_burst_counter;  //7位reg  	start_single_burst_write;reg  	start_single_burst_read;reg  	writes_done;reg  	reads_done;reg  	error_reg;reg  	compare_done;reg  	read_mismatch;reg  	burst_write_active;reg  	burst_read_active;reg [C_M_AXI_DATA_WIDTH-1 : 0] 	expected_rdata;//Interface response error flagswire  	write_resp_error;wire  	read_resp_error;wire  	wnext;wire  	rnext;reg  	init_txn_ff;reg  	init_txn_ff2;reg  	init_txn_edge;wire  	init_txn_pulse;// I/O Connections assignmentswire douta;wire ena;//I/O Connections. Write Address (AW)assign M_AXI_AWID	= 'b0;//The AXI address is a concatenation of the target base address + active offset rangeassign M_AXI_AWADDR	= C_M_TARGET_SLAVE_BASE_ADDR + axi_awaddr;//Burst LENgth is number of transaction beats, minus 1assign M_AXI_AWLEN	= C_M_AXI_BURST_LEN - 1;//Size should be C_M_AXI_DATA_WIDTH, in 2^SIZE bytes, otherwise narrow bursts are usedassign M_AXI_AWSIZE	= clogb2((C_M_AXI_DATA_WIDTH/8)-1);//2'b10; 4BYTE//INCR burst type is usually used, except for keyhole burstsassign M_AXI_AWBURST	= 2'b01;  //INCR自增类型assign M_AXI_AWLOCK	= 1'b0;//Update value to 4'b0011 if coherent accesses to be used via the Zynq ACP port. Not Allocated, Modifiable, not Bufferable. Not Bufferable since this example is meant to test memory, not intermediate cache. assign M_AXI_AWCACHE	= 4'b0010;assign M_AXI_AWPROT	= 3'h0;assign M_AXI_AWQOS	= 4'h0;assign M_AXI_AWUSER	= 'b1;assign M_AXI_AWVALID	= axi_awvalid;//Write Data(W)assign M_AXI_WDATA	= douta;//All bursts are complete and aligned in this exampleassign M_AXI_WSTRB	= {(C_M_AXI_DATA_WIDTH/8){1'b1}};//4'B1111;assign M_AXI_WLAST	= axi_wlast;assign M_AXI_WUSER	= 'b0;assign M_AXI_WVALID	= axi_wvalid;//Write Response (B)assign M_AXI_BREADY	= axi_bready;//Read Address (AR)assign M_AXI_ARID	= 'b0;assign M_AXI_ARADDR	= C_M_TARGET_SLAVE_BASE_ADDR + axi_araddr;//Burst LENgth is number of transaction beats, minus 1assign M_AXI_ARLEN	= C_M_AXI_BURST_LEN - 1;//Size should be C_M_AXI_DATA_WIDTH, in 2^n bytes, otherwise narrow bursts are usedassign M_AXI_ARSIZE	= clogb2((C_M_AXI_DATA_WIDTH/8)-1);//INCR burst type is usually used, except for keyhole burstsassign M_AXI_ARBURST	= 2'b01;assign M_AXI_ARLOCK	= 1'b0;//Update value to 4'b0011 if coherent accesses to be used via the Zynq ACP port. Not Allocated, Modifiable, not Bufferable. Not Bufferable since this example is meant to test memory, not intermediate cache. assign M_AXI_ARCACHE	= 4'b0010;assign M_AXI_ARPROT	= 3'h0;assign M_AXI_ARQOS	= 4'h0;assign M_AXI_ARUSER	= 'b1;assign M_AXI_ARVALID	= axi_arvalid;//Read and Read Response (R)assign M_AXI_RREADY	= axi_rready;//Example design I/Oassign TXN_DONE	= compare_done;//Burst size in bytesassign burst_size_bytes	= C_M_AXI_BURST_LEN * C_M_AXI_DATA_WIDTH/8;//16*32/8 = 64assign init_txn_pulse	= (!init_txn_ff2) && init_txn_ff;//上升沿//Generate a pulse to initiate AXI transaction.always @(posedge M_AXI_ACLK)    //对输入按键信号打两拍,消除亚稳态begin                                                                        // Initiates AXI transaction delay    if (M_AXI_ARESETN == 0 )                                                   begin                                                                    init_txn_ff <= 1'b0;                                                   init_txn_ff2 <= 1'b0;                                                   end                                                                               else                                                                       begin  init_txn_ff <= INIT_AXI_TXN;init_txn_ff2 <= init_txn_ff;                                                                 end                                                                      end     //--------------------//Write Address Channel 写地址通道//--------------------// The purpose of the write address channel is to request the address and  写地址通道是传输整个传输过程中的首地址和控制信号// command information for the entire transaction.  It is a single beat    只传输一次// of information.// The AXI4 Write address channel in this example will continue to initiate// write commands as fast as it is allowed by the slave/interconnect.// The address will be incremented on each accepted address transaction,// by burst_size_byte to point to the next address. always @(posedge M_AXI_ACLK)                                   begin                                                                if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )                                           begin                                                            axi_awvalid <= 1'b0;                                           end                                                              // If previously not valid , start next transaction                else if (~axi_awvalid && start_single_burst_write)                 begin                                                            axi_awvalid <= 1'b1;                                           end                                                              /* Once asserted, VALIDs cannot be deasserted, so axi_awvalid      must wait until transaction is accepted */                         else if (M_AXI_AWREADY && axi_awvalid)                             begin                                                            axi_awvalid <= 1'b0;                                           end                                                              else                                                               axi_awvalid <= axi_awvalid;                                      end                                                                // Next address after AWREADY indicates previous address acceptance    always @(posedge M_AXI_ACLK)                                         begin                                                                if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1)                                            begin                                                            axi_awaddr <= 'b0;                                             end                                                              else if (M_AXI_AWREADY && axi_awvalid)                             begin                                                            axi_awaddr <= axi_awaddr + burst_size_bytes;        //突发长度为16,突发大小为4个字节,16*4=64           end                                                              else                                                               axi_awaddr <= axi_awaddr;                                        end                                                                //--------------------//Write Data Channel    写数据通道//--------------------//The write data will continually try to push write data across the interface.//The amount of data accepted will depend on the AXI slave and the AXI//Interconnect settings, such as if there are FIFOs enabled in interconnect.//Note that there is no explicit timing relationship to the write address channel.//The write channel has its own throttling flag, separate from the AW channel.//Synchronization between the channels must be determined by the user.//The simpliest but lowest performance would be to only issue one address write//and write data burst at a time.//In this example they are kept in sync by using the same address increment//and burst sizes. Then the AW and W channels have their transactions measured//with threshold counters as part of the user logic, to make sure neither //channel gets too far ahead of each other.//Forward movement occurs when the write channel is valid and readyassign wnext = M_AXI_WREADY & axi_wvalid;                            //wnext表示握手成功       // WVALID logic, similar to the axi_awvalid always block above                      always @(posedge M_AXI_ACLK)                                                      begin                                                                             if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )                                                        begin                                                                         axi_wvalid <= 1'b0;                                                         end                                                                           // If previously not valid, start next transaction                              else if (~axi_wvalid && start_single_burst_write)                               begin                                                                         axi_wvalid <= 1'b1;                                                         end                                                                           /* If WREADY and too many writes, throttle WVALID                               Once asserted, VALIDs cannot be deasserted, so WVALID                           must wait until burst is complete with WLAST */                                 else if (wnext && axi_wlast)                                                    axi_wvalid <= 1'b0;                                                           else                                                                            axi_wvalid <= axi_wvalid;                                                     end                                                                               

 9.然后大家在Block Design中添加刚刚生成的这个IP核,再添加一个DRAM,然后对模块进行连接。BRAM我的配置如下所示:

 

 

 

然后其他的不用修改,直接添加,添加完成后对模块进行连接,使用一个控制模块将他们连起来。连接完成后如图所示: 

 10.在完成上述工作后,我们便将AXI的IP核与BRAM连接起来了,通过AXI接口给BRAM发送数据,然后再将数据读出来,通过验证输出结果。TX_DONE表示发送成功,若得到错误的结果,会将erro_flag拉高。我们将这个设计打包成.v文件,具体操作如下。

 11.这样我们就得到了这个测试系统的顶层文件,然后我们对其编写测试激励,仿真验证。

module tb_design_1();reg KEY;reg SCLK;reg SRST_N;wire TX_done;wire error_flag;wire rsta_busy_0;design_1 design_1(.KEY(KEY),.SCLK(SCLK),.SRST_N(SRST_N),.TX_done(TX_done),.error_flag(error_flag),.rsta_busy_0(rsta_busy_0));always #10 SCLK = ~SCLK;initial beginKEY = 0;   SCLK = 0;  SRST_N = 0;#201;SRST_N = 1;#100;KEY = 1;#200;KEY = 0;#200000;$stop;endendmodule

 12.如图所示,前半部分是写数据,后半部分是读数据,最后可以看到发送完成信号TX_DONE信号拉高,而erro_flag没有拉高,我们也可以观察数据得到这个结果是正确的。

 13.这样我们便通过AXI4的IP核对BRAM读写验证了功能的正确性,大家有兴趣的话可以看一下正点原子ZYNQ系列的视频,讲了该IP核去读写PS端DDR3的实验。

        后续我还会总结一些关于DDR3相关的知识以及通过MIG去控制DDR3,实现该AXI4 IP核对DDR3进行读写的实验。


http://chatgpt.dhexx.cn/article/fmJPyRiO.shtml

相关文章

URAM和BRAM有什么区别

无论是7系列FPGA、UltraScale还是UltraScale Plus系列FPGA&#xff0c;都包含Block RAM&#xff08;BRAM&#xff09;&#xff0c;但只有UltraScale Plus芯片有UltraRAM也就是我们所说的URAM。BRAM和URAM都是重要的片上存储资源&#xff0c;但两者还是有些显著的区别。 容量 B…

【FPGA】AXI4-Lite总线读写BRAM

博主参考和学习的博客 AXI协议基础知识 。这篇博客比较详细地介绍了AXI总线&#xff0c;并且罗列了所有的通道和端口&#xff0c;写代码的时候可以方便地进行查表。AXI总线&#xff0c;AXI_BRAM读写仿真测试 。 这篇文章为代码的书写提供大致的思路&#xff0c;比如状态机和时…

如何对bram/ram进行初始化赋值呢?

1、首先对于常规的情况&#xff0c;即加载.coe文件的方式实现初始化&#xff08;与rom相同&#xff09; 点击load initial file, 在右侧可以直接添加.coe文件&#xff0c;或者选择edit进行手动编辑&#xff08;数据量不大的情况下可选&#xff0c;但是不推荐&#xff09;&#…

vivado中bram的种类与使用

vivado中bram的种类与使用 vivado中bram的分类单端口ram初始化工作时序仿真验证 简化的双端口RAM初始化端口定义仿真结果 双端口RAM初始化端口定义功能仿真单端口读数双端口读数双端口一读一写双端口写数据 vivado中bram的分类 在vivado中打开IP catalog&#xff0c;在其中搜索…

BRAM的使用

使用Block Memory Generator IP核&#xff0c;PL读取BRAM数据 软件环境&#xff1a;Vivado 2018.3 IP核&#xff1a;Block Memory Generator 8.4(Rev.2) 1、点击IP Catalog 2、搜索”Block Memory Generator“双击选择RAMs & ROMs & BRAM下的IP核 3、配置IP核为Si…

FPGA — BRAM学习笔记—读写操作

使用软件&#xff1a; Vivado 开发板&#xff1a; EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA BRAM笔记 BRAM介绍同步双端口BRAMBRAM读写操作(1)读操作(2)写操作(3)写模式写优先模式读优先模式不变模式 双端口块内存接口BRAM IP的使用及仿真验证IP核使用coe文件将IP核添…

FPGA从入门到精通(8)-BRAM

所使用EDA软件&#xff1a;VIVADO2018.3 FPGA型号&#xff1a;xc7a35tcsg325-2 很久没写了&#xff0c;随便写一篇BRAM的吧。说到BRAM &#xff0c;很多人都喜欢拿它来DRAM比较 &#xff0c;两者都有啥优缺点&#xff0c;其实我也拿不准。不过一般来说&#xff0c;存储较大的数…

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据 一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zyn…

FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)

FPGA设计中BRAM&#xff08;Block RAMs&#xff09;资源的使用 RAM分为BRAM&#xff08;Block RAMs&#xff09;和DRAM&#xff08;Distributed RAM&#xff09;&#xff0c;即块RAM与分布式RAM&#xff0c;这两个差别在于BRAM是FPGA上固有的一些存储资源&#xff08;针对不同型…

web测试与app测试的区别

目录 前言 首先从系统架构来看 专项测试 安装、卸载、更新&#xff1a; 界面操作&#xff1a; 前言 仅仅从功能测试的层面上来讲的话&#xff0c;在流程和功能测试上是没有区别的。那么区别在哪里呢&#xff1f; 我个人觉得就是由于载体不一样&#xff0c;所以系统测试和…

APP测试与WEB测试

APP测试与WEB测试的区别(异同) 相同点&#xff1a; 功能测试层面而言&#xff1a;APP测试和web测试都是使用相同的测试用例测试方法&#xff08;都用到等价类划分、边界值分析、正常和异常情况去考虑测试点&#xff09; UI界面测试&#xff1a;都需要按照原型图和设计图检查UI…

web测试,App测试,小程序测试区别

最近项目真的太忙了&#xff0c;不过&#xff0c;今天无论如何我都要更文章了&#xff0c;谢谢大家的支持&#xff0c;不断努力进步 这篇文章&#xff0c;我就是要梳理一下&#xff0c;web测试&#xff0c;app测试&#xff0c;和小程序的区别 话不多说&#xff0c;上主题 web…

WEB端与移动端测试区别和总结

WEB端与移动端测试区别总结如下&#xff1a; 1、系统架构 WEB端 B/S结构&#xff0c;WEB端的前端一般不做端的区分 WEB端的上线不管是预发布还是N环上线&#xff0c;server上线后&#xff0c;前端同步更新&#xff0c;一般是不存在多个版本的问题; 移动端 C/S结构&#xff0c;移…

Apifox简单了解——WEB端测试的集大成者

文章目录 0 引入1、Postman2、Swagger &#xff08;丝袜哥&#xff09;3、Mock4、JMeter5、Apifox6、引用 0 引入 Apifox Postman Swagger Mock JMeter 1、Postman 1 作用 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;简单易用的接口测试…

web测试的基本流程

1、web测试流程&#xff1a; (1)web测试 1)参与一个web新项目的测试前&#xff0c;先搜集测试相关的资料&#xff0c;包括原型图、各种需求文档、业务相关等需求相关材料 2)结合第一步搜集到的需求相关资料&#xff0c;自行熟悉系统&#xff0c;同时列出不明白的点&#xff0c;…

Web端测试常用方法

介绍下工作中&#xff0c;Web端测试所涉及到的方法&#xff1a; 前言&#xff1a;Web测试常用的方法&#xff0c;兼容性测试、安全性测试、可用性测试 & 逻辑功能测试 1 > 兼容性测试 先说下兼容性测试&#xff0c;工作中在测试时&#xff0c;一般涉及操作系统测试、浏…

web端测试经验(项目实战经验)

软件测试相信大家已经有一定的了解了&#xff0c;无非就是找bug 找缺陷 找问题 找这个程序&#xff08;前端、后端&#xff09;的不足点 以及不人性化的地方 &#xff0c;由我们监测并提出有效的建议给项目进行缺陷修复以及优化点。软件测试大体分为Web、App两个&#xff0c;当…

这可能是最全的Web测试各个测试点,有这一篇就够了

前言 什么是Web测试&#xff1f; Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 Web测试检查 功能测试 易用性测试 接口测试 性能测试 安全测试 兼容性测试 1、功能测试 测试网页中的所有链接、数据库连接、网页中用于提交或从…

【转载】 web项目测试

前言 之前说了APP项目的测试&#xff0c;今天来总结一下web项目的测试&#xff0c;其实大多数过程是差不多类似的。对比平常移动端手机的高频率使用来说&#xff0c;对于部分人使用pc端浏览器的概率就不会这么高&#xff0c;讲APP项目测试的时候没怎么涉及到网络协议部分的介绍…

Web端测试方法

web端通用测试点请移步 1. Web 测试的总体策略 2. Web 测试的范围 √ 功能 √ 性能 √ 界面 √ 兼容性 √ 安全性 √ DB √ 文档 2.1 功能测试 ☆ 功能测试主要从链接、表单、Cookies、设计语言、数据库、文件上传等方面进行。 2.1.1 链接 ☆ 链接也称超链接&#xff0c;…