当前位置: 首页 > news >正文

『FPGA通信接口』DDR(4)DDR3内存条SODIMMs读写测试

在这里插入图片描述

文章目录

  • 前言
  • 1.MIG IP核配置
  • 2.测试程序
  • 3.DDR应用
  • 4.传送门

前言

不论是DDR3颗粒还是DDR3内存条,xilinx都是通过MIG IP核实现FPGA与DDR的读写。本文区别于DDR颗粒,记录几个与颗粒配置不同的地方。关于DDR的原理与MIG IP的简介,请查看前面文章,链接在文末。本文提供了配套的工程源码,链接在文末,本文用的内存条为MT16KTF1G64HZ-1G6,FPGA芯片为xc7k325tffg900 -2。请按照顺序循序渐进阅读本系列的文章。

1.MIG IP核配置

  • 1.如无特殊说明,配置保持与前述文章MIG IP核配置一致。第五页如图所示配置。其中①指DDR3颗粒的物理时钟,例如一颗16bit位宽的DDR设置为400MHz,则它的传输速度为每一个800MHz(DDR双沿传输的原因)周期传输16bit。这里时钟的范围受到FPGA芯片速度等级和型号的制约,以及与内存条的支持速度也有关。如我用的内存条MT16KTF1G64HZ-1G6,速度范围在1500ps-3000ps之间。②指的是用户时钟,4:1的4指的是①设置的物理时钟。第③部分指的是类型选择,内存条选择SODIMMs。④处是DDR3内存条的型号,如果不在列表需要根据速度参数,位宽大小找一个兼容的型号。⑤处勾选上mask后,如果相应的管脚不连接,会造成DDR3初始化失败。其余配置保持默认即可。
    在这里插入图片描述
  • 2.第六页 此处①代表参考时钟,选择200MHz为固定大小。②处如果是内存条就选择RZQ/4,如果是颗粒就选择RZQ/6。
    在这里插入图片描述
  • 3.DDR3颗粒要勾选DCI Cascade,内存条不用勾选。后面就是选择引脚,其他的都保持默认,即可。
    在这里插入图片描述

2.测试程序

如果需要修改这段程序,需要注意MIG的接口各信号的位宽应该保持一致,另外程序中设计了两个LED灯,读写测试正确的时候,指示灯led1常亮,反之则闪烁。LED2只是容量,当测试到所设置的容量的时候常量。代码中TEST_LENGTH指示的含义是突发次数,也可以说是容量。每一次突发是512bit数据,使用内存的容量除以512bit,即为最大的突发次数。当然使用的芯片的物理位宽不同,例如只有一片16bit位宽的DDR颗粒,那一次突发的数据为8*16bit=128bit,那最大的突发次数就要用量除以128bit了。

  module dimm_top(input              sys_clk_p,input              sys_clk_n,       inout  [63:0]      ddr3_dq			, inout  [7:0]       ddr3_dqs_n		, inout  [7:0]       ddr3_dqs_p		,   output [15:0]      ddr3_addr		, output [2:0]       ddr3_ba			, output             ddr3_ras_n		, output             ddr3_cas_n		, output             ddr3_we_n		, output             ddr3_reset_n	, output [1:0]       ddr3_ck_p		, output [1:0]       ddr3_ck_n		, output [1:0]       ddr3_cke		    , output [1:0]       ddr3_cs_n		, output [7:0]       ddr3_dm			, output [1:0]       ddr3_odt         , output reg         led1,              output reg         led2        );         wire                clk_rst;                            wire                clk_200;reg     [29:0]      app_addr_begin=0;wire                app_en;              //写命令使能wire    [2:0]       app_cmd;             //用户读写命令wire                app_wdf_wren;        //DDR3写使能wire                app_wdf_end;         //突发写最后一个数标识wire    [29:0]      app_addr;            //用户平面地址wire                app_rdy;             //设备接收准备就绪   wire                app_wdf_rdy;         //写响应wire    [511:0]     app_rd_data;         //用户读数据wire                app_rd_data_end;     //突发读当前时钟最后一个数据wire                app_rd_data_valid;   //读数据有效wire    [511:0]     app_wdf_data;        //用户写数据wire                app_sr_active;       //保留wire                app_ref_ack;         //刷新请求wire                app_zq_ack;          //ZQ 校准请求wire        		init_calib_complete; //校准完成信号wire                ui_clk ;             //用户时钟wire                ui_clk_sync_rst;              clk_wiz_0 u_clk_wiz_0(.clk_out1(clk_200), .reset(1'b0), .locked(clk_rst), .clk_in1_p(sys_clk_p),.clk_in1_n(sys_clk_n));mig_7series_0 mig_JC (// Memory interface ports.ddr3_addr                      (ddr3_addr), 		// output [15:0]	.ddr3_ba                        (ddr3_ba),  		// output [2:0].ddr3_cas_n                     (ddr3_cas_n), 		// output			.ddr3_ck_n                      (ddr3_ck_n),  		// output [1:0]		.ddr3_ck_p                      (ddr3_ck_p),  		// output [1:0]		.ddr3_cke                       (ddr3_cke),  		// output [1:0]		.ddr3_ras_n                     (ddr3_ras_n),  		// output		.ddr3_reset_n                   (ddr3_reset_n),  	// output			.ddr3_we_n                      (ddr3_we_n),  		// output		.ddr3_dq                        (ddr3_dq),  		// inout [63:0]	.ddr3_dqs_n                     (ddr3_dqs_n),  		// inout [7:0]		.ddr3_dqs_p                     (ddr3_dqs_p),  		// inout [7:0]		.init_calib_complete            (init_calib_complete),  // output		.ddr3_cs_n                      (ddr3_cs_n),  		// output [1:0]		.ddr3_dm                        (ddr3_dm),  		// output [7:0]	.ddr3_odt                       (ddr3_odt),  		// output [1:0]		// Application interface ports.app_addr                       (app_addr), 		 // input [29:0]		.app_cmd                        (app_cmd),  		 // input [2:0]		.app_en                         (app_en),  			 // input	.app_wdf_data                   (app_wdf_data), 	 // input [511:0]	.app_wdf_end                    (app_wdf_end), 		 // input			.app_wdf_wren                   (app_wdf_wren),  	 // input				.app_rd_data                    (app_rd_data),  	 // output [511:0]		.app_rd_data_end                (app_rd_data_end),   // output		.app_rd_data_valid              (app_rd_data_valid), // output	.app_rdy                        (app_rdy),  		 // output		.app_wdf_rdy                    (app_wdf_rdy),  	 // output			.app_sr_req                     (1'b0),  			 // input			.app_ref_req                    (1'b0),  			 // input		.app_zq_req                     (1'b0),              // input			.app_sr_active                  (app_sr_active),     // output			.app_ref_ack                    (app_ref_ack), 		 // output		.app_zq_ack                     (app_zq_ack),  	   	 // output		.ui_clk                         (ui_clk),  			 // output用户时钟输出,其实是通过IP配置自己配出来的 	 .ui_clk_sync_rst                (ui_clk_sync_rst),   // output		.app_wdf_mask                   (64'b0),  			 // input [63:0] //写数据屏蔽.sys_clk_i                      (clk_200),//输入IP的时钟// Reference Clock Ports.clk_ref_i                      (clk_200),//参考时钟		.sys_rst                        (clk_rst) // input sys_rst);parameter  TEST_LENGTH = 27'd134200000; //每一次突发是512bit 8GB可以支持134217728次突发 99.98%// parameter  TEST_LENGTH = 32'd60000000;//**************1.先写后读状态机state machineparameter  IDLE  = 2'd0;           parameter  WRITE = 2'd1;          parameter  WAIT  = 2'd2;           parameter  READ  = 2'd3;   reg [511:0]my_512_data;reg [26:0] wr_addr_cnt;reg [26:0] rd_addr_cnt;reg [1:0]  state;always @(posedge ui_clk or negedge rst_n) beginif((~rst_n)||(error_flag)) begin state    <= IDLE;          my_512_data <= 512'd0;     wr_addr_cnt  <= 27'd0;      rd_addr_cnt  <= 27'd0;       app_addr_begin<= 30'd0;         endelse if(init_calib_complete)begin               //MIG IP核初始化完成case(state)IDLE:beginstate    <= WRITE;my_512_data <= 512'd0;   wr_addr_cnt  <= 27'd0;     rd_addr_cnt  <= 27'd0;       app_addr_begin     <= 30'd0; endWRITE:beginif((wr_addr_cnt == TEST_LENGTH-1) &&(app_rdy && app_wdf_rdy))state    <= WAIT;                  //写到设定的长度跳到等待状态else if(app_rdy && app_wdf_rdy)begin   //写条件满足my_512_data <= my_512_data + 1;  //写数据自增wr_addr_cnt  <= wr_addr_cnt + 1;   //写计数自增app_addr_begin<= app_addr_begin + 8;      //DDR3 地址自增end else begin          //写条件不满足,保持当前状态my_512_data <= my_512_data;      wr_addr_cnt  <= wr_addr_cnt;app_addr_begin<= app_addr_begin; endendWAIT:begin                                                 state   <= READ;                     //下一个时钟,跳到读状态rd_addr_cnt <= 27'd0;                //读地址复位app_addr_begin<= 30'd0;                //DDR3读从地址0endREAD:begin                               //读到设定的地址长度    if((rd_addr_cnt == TEST_LENGTH -1 ) && app_rdy)state   <= IDLE;                   //则跳到空闲状态 else if(app_rdy)begin                  //若MIG已经准备就绪,则开始读rd_addr_cnt <= rd_addr_cnt + 1'd1; //用户地址每次加一app_addr_begin    <= app_addr_begin + 8;       //DDR3地址加8end else begin   //若MIG没准备好,则保持原rd_addr_cnt <= rd_addr_cnt;app_addr_begin    <= app_addr_begin; endenddefault:beginstate    <= IDLE;my_512_data  <= 512'd0;wr_addr_cnt  <= 27'd0;rd_addr_cnt  <= 27'd0;app_addr_begin <= 30'd0;endendcaseendend   //**************2.根据状态机与MIG指示信号为app信号赋值assign app_en  =((state == WRITE && (app_rdy && app_wdf_rdy))||(state == READ && app_rdy)) ? 1'b1:1'b0;             assign app_cmd =(state == READ) ? 3'd1 :3'd0;  assign app_wdf_wren=(state == WRITE && (app_rdy && app_wdf_rdy)) ? 1'b1:1'b0;assign app_wdf_end =app_wdf_wren; assign app_addr    =app_addr_begin;assign app_wdf_data=my_512_data;   //*******************3.用户判错逻辑reg     [26:0]   rd_cnt;wire             rst_n;     //复位,低有效reg              error_flag;parameter  L_TIME = 28'd200_000_000;reg     [27:0]   led_cnt;    //led计数wire             error;     //读写错误标记assign rst_n = ~ui_clk_sync_rst;//&&myrstalways @(posedge ui_clk or negedge rst_n) beginif(~rst_n) rd_cnt  <= 0;              //若计数到读写长度,且读有效,地址计数器则�?0                                    else if(app_rd_data_valid&&(rd_cnt == TEST_LENGTH - 1))rd_cnt <= 0;              //其他条件只要读有效,每个时钟自增1else if (app_rd_data_valid)rd_cnt <= rd_cnt + 1;end//判断错误,读出数据应为计数递增数据assign error = (app_rd_data_valid && (rd_cnt!=app_rd_data));always @(posedge ui_clk or negedge rst_n) beginif(~rst_n)led2<=0;else if(rd_cnt==32'd134200000-1)led2<=1;end always @(posedge ui_clk or negedge rst_n) beginif(~rst_n) error_flag <= 0;else if(error)error_flag <= 1;end//读写测试正确,指示灯led1常亮,反之则闪烁always @(posedge ui_clk or negedge rst_n) beginif((~rst_n) || (~init_calib_complete )) beginled_cnt <= 28'd0;led1 <= 1'b0;endelse beginif(~error_flag)   //常亮代表正常,闪烁代表故障                            led1 <= 1'b1;                     else begin                            led_cnt <= led_cnt + 28'd1;if(led_cnt == L_TIME - 1'b1) beginled_cnt <= 25'd0;led1 <= ~led1;                     end                    endendendendmodule

3.DDR应用

DDR在FPGA系统中的作用主要是作为存储器使用,用于存储数据和程序。DDR存储器通常被用作FPGA系统中的主存储器,用于存储采集数据和中间结果。DDR3作为高速缓存与FPGA相连,在不同领域均发挥着重要作用。在高性能计算领域,DDR用于存储大规模数据集、模型参数、数据计算结果,从而充分发挥FPGA并行计算的能力,完成计算任务;在图像处理领域,用于匹配图像采集接口与传输接口之间的速度,完成图像采集;在通信领域,DDR用于存储大量数据包,实现数据的缓存和处理,提高数据传输速度和处理效率。总之,DDR在不同领域扮演着重要角色。以采集摄像头数据为例,采用乒乓操作的思想是在DDR中开辟两块大小为1帧图像的缓冲区,如果读取速度大于写入速度的时候,需要采用乒乓操作的方式发挥DDR弹性缓冲的作用。往缓冲区写的时候,1号缓冲区写满之后,切换到2号缓冲区写,2号写满之后,在往1号去写,如此往复 。由于读取速度大于写入速度,因此,读一定是在与当前写不同的另一块缓冲区去读,在底层,可能会对同一块缓冲区的数据读取很多次,但是这并不影响人在视觉上对于画面流畅的影响。这就是通过乒乓操作实现了数据缓冲,匹配了读写两端的速度。如下图所示,
在这里插入图片描述
说明:1.每一个bank存储一帧图像数据,bank中每一行为图像的一行数据(即每一次读写的突发长度是一行像素数据,这个突发长度可以自己定义,并不必须要是一行数据),读和写彼此独立进行;2.bank之间的切换由状态机实现,由于读速度大于写速度,则每写完一个bank切换另一个bank去写;每读完一个bank,判断当前写bank,选择不同于写bank的bank进行读。3.由于读速度大于写速度,因此永远不会发生冲突,只是可能某一帧会被重复播放,但在视频应用中,这对用户的视觉不产生任何影响。同理,如果是读的速度小于写的速度,那让写操作刷新缓冲区即选择与读相排斥的缓冲区写,让读操作按照顺序读即可。 上面描述的只是一种乒乓缓冲的思想,实际操作中,可以通过设置三缓存,四缓存的方式让图像更为平滑。另外可以考虑基于这种思想为DDR写一个消息队列,让DDR仲裁控制器的通用性和适配性更强。

4.传送门

  • 我的主页
  • FPGA通信接口专栏汇总导航
  • DDR测试工程源码
  • 上一篇:DDR(3)DDR3颗粒读写测试
END

🔈文章原创,首发于CSDN论坛。
🔈欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🔈欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。

相关文章:

『FPGA通信接口』DDR(4)DDR3内存条SODIMMs读写测试

文章目录 前言1.MIG IP核配置2.测试程序3.DDR应用4.传送门 前言 不论是DDR3颗粒还是DDR3内存条&#xff0c;xilinx都是通过MIG IP核实现FPGA与DDR的读写。本文区别于DDR颗粒&#xff0c;记录几个与颗粒配置不同的地方。关于DDR的原理与MIG IP的简介&#xff0c;请查看前面文章&…...

Element UI 快速入门指南

Element UI 快速入门指南 Element UI 是一个基于 Vue.js 的组件库&#xff0c;提供了丰富的 UI 组件和工具&#xff0c;可以帮助开发人员快速构建现代化的 Web 应用程序。本文将介绍如何快速入门使用 Element UI&#xff0c;并展示一些常用的组件和功能。 安装 Element UI 使…...

CentOS常用命令有哪些?

目录 一、CentOS常用命令有哪些&#xff1f; 二、不熟悉命令怎么办&#xff1f; 场景一&#xff1a;如果是文件操作&#xff0c;可以使用FileZilla工具来完成 场景二&#xff1a;安装CentOS桌面 一、CentOS常用命令有哪些&#xff1f; CentOS 系统中有许多常用命令及其用法…...

cmd查看局域网内所有设备ip

说明&#xff1a;最近碰到一个新问题&#xff0c;就是有一个安卓设备&#xff0c;安装了一个app导致死机了&#xff0c;app设置了开机重启&#xff0c;所以&#xff0c;无论重启还是关机&#xff0c;都是进来就白屏&#xff0c; 这可把人愁坏了&#xff0c;直接死循环了 无论…...

5.3作业

这个声明定义了一个名为 s 的数组&#xff0c;数组包含 10 个元素&#xff0c;每个元素都是一个函数指针。(1)C (2)D (3)C (4)DE (5)C8 11 14(1)int IsFull(sequeue *seqn) { return ((seqn->frnt ((seqn->rear 1) % N)) ? 1 : 0); } (2)int IsEmpty(sequ…...

java-Spring-mvc-(请求和响应)

目录 &#x1f4cc;HTTP协议 超文本传输协议 请求 Request 响应 Response &#x1f3a8;请求方法 GET请求 POST请求 &#x1f4cc;HTTP协议 超文本传输协议 HTTP协议是浏览器与服务器通讯的应用层协议&#xff0c;规定了浏览器与服务器之间的交互规则以及交互数据的格式…...

亚马逊测评工作室如何轻松实现高收益,跨境电商揭秘汇率差赚钱术

随着跨境电商在国内市场的持续繁荣&#xff0c;众多电商卖家纷纷将目光投向了这一充满活力的领域。面对国内市场的激烈竞争&#xff0c;许多卖家选择向外拓展&#xff0c;寻求更广阔的发展空间。其中&#xff0c;亚马逊成为了众多卖家的不二选择&#xff0c;毕竟老外的市场还是…...

unity中 UnityWebRequest.Post和 UnityWebRequest uwr = new UnityWebRequest两种方法有什么区别

在Unity中&#xff0c;UnityWebRequest.Post 和 UnityWebRequest uwr new UnityWebRequest(...) 是两种不同的方式来创建和发送HTTP POST请求&#xff0c;但它们之间有一些关键的区别和用法上的差异。 1. UnityWebRequest.Post (静态方法) UnityWebRequest.Post 是一个静态方…...

Java学习-练习试用Java实现求素数

以下是使用Java语言试着编写的求1-100内的素数的程序&#xff1a; public class PrimeNumbers {public static void main(String[] args) {System.out.println("Prime numbers between 1 and 100 are:");for (int i 2; i < 100; i) {if (isPrime(i)) {System.ou…...

最近学习发现一个background-blend-mode,这是CSS的一个新成员吧!这里分享记录一下

介绍 background-blend-mode CSS 属性定义该元素的背景图片&#xff0c;以及背景色如何混合。 混合模式应该按background-image CSS 属性同样的顺序定义。如果混合模式数量与背景图像的数量不相等&#xff0c;它会被截取至相等的数量。在所有的元素中。在SVG&#xff0c;它适…...

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法&#xff08;一&#xff09; 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志&#xff0c;专门建立一个存放自己日志的类&#xff0c;这个类继承自BlueprintFunctionLibrary 然后…...

云原生Kubernetes: K8S 1.29版本 部署Sonarqube

一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.29.0192.168.204.8 node1K8S node节点1.29.0192.168.204.9node2K8S node节点1.29.0192.168.204.10已部署Kuboard &#xff08;2&#xff09;master节点查看集群 1&…...

读天才与算法:人脑与AI的数学思维笔记19_深度数学

1. 深度数学 1.1. 组合与选择&#xff0c;是发明新事物的两个不可或缺的条件 1.1.1. 保尔瓦雷里&#xff08;Paul Valry&#xff09; 1.2. 利用以往的数学定理证明过程训练算法&#xff0c;以发现新的定理 1.3. 谷歌设在伦敦的总部整体有一种现代牛津大学的感觉&#xff0c…...

Springboot+Vue项目-基于Java+MySQL的旅游网站系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

Element UI 简介

Element UI是一个基于Vue.js的组件库&#xff0c;提供了一套丰富的可复用的组件&#xff0c;包括按钮、表单、弹框、表格、菜单等等。它的设计风格简洁大方&#xff0c;易于使用&#xff0c;能够帮助开发者快速构建现代化的Web应用。 在Element UI中&#xff0c;有许多常用的组…...

mysql 删除重复的数据保留id最大的一条

在 MySQL 中&#xff0c;可以使用以下查询删除重复数据&#xff0c;只保留 ID 最大的那条记录&#xff1a; SQL DELETE t FROM table_name t LEFT JOIN ( SELECT column_name, MAX(id) AS max_id FROM table_name GROUP BY column_name ) t2 ON t.column_name t2…...

UE4 Widget制作搜索框

效果&#xff1a; 一、控件层级结构 1.父控件层级结构 2.子控件层级结构 二、蓝图 1.先清除掉创建子项&#xff08;注意&#xff1a;这里使用的是reverse循环&#xff01;&#xff09; 2.判断是否含有关键字&#xff0c;创建子控件...

JavaScript js写九九乘法表(两种方法)

方法一&#xff1a; 观察规律&#xff1a; 第一个数每行都是自增1。 我们发下第二个数都是从1开始&#xff0c;依次递增1&#xff0c;永远不大于前面的数。 前面数字每自增一次&#xff0c;后面数字自增一轮。 我们可以用双重for循环&#xff0c;外层初始值设为i&#xff0…...

算法--贪心算法

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤其有效&#xff0c;这意味着局部最优解能决定全局最优解。简单来说&#xff0c;贪心…...

Redis基本數據結構 ― String

Redis基本數據結構 ― String 介紹常用命令範例1. 為字串鍵設值/取得字串鍵的值2. 查看字串鍵的過期時間3. 如何為key設置時間?4. 如何刪除指定key?5. 如何增加value的值?6. 獲取value值的長度 介紹 字串鍵是Redis中最基本的鍵值對類型&#xff0c;這種類型的鍵值對會在數據…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...