SDRAM学习笔记(MT48LC16M16A2,w9812g6kh)

一、基本知识

SDRAM : 即同步动态随机存储器(Synchronous Dynamic Random Access Memory), 同步是指其时钟频率与对应控制器(CPU/FPGA)的系统时钟频率相同,并且内部命令 的发送与数据传输都是以该时钟为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机指数据的读取和写入可以随机指定地址,而不是必须按照严格的线性次序变化。

SDRAM 使用电容的电荷存储特性存储数据,而 SRAM使用CMOS晶体管存储数据,这决定了SDRAM的运行功耗要远远低于SRAM。由于使用晶体管存储数据,要能够正确的存储一位数据,需要最少6个晶体管。因此,从芯片面积上来说,单片SRAM芯片的容量不可能做到很高。

通常情况下,SDRAM 是拥有四个 BANK 的动态刷新存储器,存储器工作在 3.3V 的电 压下,拥有一个同步接口,SDRAM 的所有信号都在时钟信号的上升沿被寄存。对于 SDRAM 的读写是以突发的方式进行的,对 sdram 的获取(读或者写)是从一个指定的地址开始,并按照编程好的数量(长度)的地址,以编程好的数据顺序读写数据。

存取原理:先通过行地址打开行地址线,后通过列地址线打开列地址,便实现把电容与数据线连通,实现读/写操作。

   打开行地址需要tRCD时间,后才能打开列地址。tRCD可查手册,计算需要多少个对应频率的时钟的延迟,进行设计。

   打开列地址后,如果是读操作,需要CL(CAS READ LATENCY)个时钟周期才会出数据,如果是写操作,则数据需要同时送出,不用CL。

  不同型号的sdram:命令、时序参数有区别

二、型号MT48LC16M16A2的sdram

引脚:

对于sdram的控制,通过CS_N、RAS_N、CAS_N、WE_N四个引脚来控制,故记这四个引脚组成的状态为控制命令cmd。

通过这个表来设置cmd。

1.时序设计

控制sdram只需要结合时序图和命令表,通过线性序列机和状态机来设计就可以。

1.上电初始化:通过计数器使sdram处于nop状态 不少于100us后,发出一个precharge命令,经过tRP时间(一直处于nop,下同),发出一个autorefresh命令,经过tRFC时间,再autorefresh一次,经过tRFC时间,便可发出load mode register命令配置模式寄存器。

模式寄存器设置规则如下:

2.读/写命令:

       器件手册给出了包括读/写在内的多种命令的时序图,根据时序图进行设计即可,比如常用的:

2.代码设计

       类似IIC协议和SPI协议,依旧是状态机加线性序列机的形式来是实现。最底层用状态机实现每种状态需要的操作,中间层用线性序列机实现一个完整的读/写/其他操作需要经过几种状态的跳转。故先定义状态和命令cmd。

       注意,设计时仍然需要注意时钟问题,给sdram的时钟是在上升沿读取数据,所以输出的数据在上升沿应该是稳定的,具体可以通过设计与读写两个时钟的移相来实现。

module sdram_driver(input clk ,input rst_n ,input write_sig ,input read_sig ,input initial_sig ,input [12:0]write_addr ,input [1:0]write_bank ,input [12:0]read_addr ,input [1:0]read_bank ,output reg [3:0]cmd ,output reg [1:0]bank ,output reg [12:0]addr ,output reg [11:0]mode ,output reg cke_ctrl ,output reg [1:0]dqm_ctrl ,output reg initial_done ,output reg [15:0]read_data ,output reg trans_done ,inout [15:0]DQ 
);//状态参数
localparam nop1 = 					4'b1000 ; //空闲态:禁止命令
localparam nop2 = 					4'b0111 ; //空闲态:空命令
localparam active = 					4'b0011 ; //选bank与行
localparam read = 					4'b0101 ; //选bank和列,启动突发读 ,最后一位为屏蔽位
localparam write = 					4'b0100 ; //选bank和列,启动突发读 ,最后一位为屏蔽位
localparam burst_terminate = 		4'b0110 ; //突发中止
localparam precharge = 				4'b0010 ; //关闭行,预充电
localparam refresh = 				4'b0001 ; //刷新
localparam load_mode_register =	4'b0000 ; //a0 - a11 tmrd// mode register
localparam M9_BL_mode = 1'b0 ; //length
localparam M9_SL_mode = 1'b1 ; //single
localparam M87_SO_mode = 2'b00 ; 
localparam M654_CAS_2 = 3'b010 ;//CL
localparam M654_CAS_3 = 3'b011 ;//CL
localparam M3_seq = 1'b0 ;
localparam M3_intl = 1'b1 ;
localparam M210_BL_1 = 3'b000 ;//be able to replace single read/write (M9)
localparam M210_BL_2 = 3'b001 ;
localparam M210_BL_4 = 3'b010 ;
localparam M210_BL_8 = 3'b011 ;
localparam M210_BL_full = 3'b111 ;// read with auto precharge ?
localparam auto_precharge = 1 ;
wire rd_with_auto , wr_with_auto ;
assign rd_with_auto = auto_precharge ;
assign wr_with_auto = auto_precharge ;reg [15:0]cmd_cnt ;
always@( posedge clk or negedge rst_n )	
if(!rst_n)begincmd_cnt 		<= 0 ;cmd 			<= nop2 ;bank			<= 0 ;addr			<= 0 ;mode			<= 0 ;cke_ctrl		<= 0 ;dqm_ctrl		<= 0 ;	trans_done 	<= 0 ;initial_done<= 0 ;read_data   <= 0 ;end
else if(initial_sig)begincmd_cnt <= cmd_cnt + 1 ;case(cmd_cnt)1:cmd <= nop2 ;//delay > 100 us10005: begin cke_ctrl <= 1 ;  end10010: begin cmd <= precharge ; addr[10] = 1 ;  end //precharge all banks : tRP >= 20ns (2T)10011: begin cmd <= nop2 ; end10015: begin cmd <= refresh ; cke_ctrl <= 1 ; end //auto refresh : >= 2T(RFC) ; T(RFC) >= 66ns    1T(auto)(256Mb) = 819210016: begin cmd <= nop2 ; end10026: begin cmd <= refresh ; cke_ctrl <= 1 ; end // 10027: begin cmd <= nop2 ; end						  // 10040: begin cmd <= load_mode_register ; bank <= 0 ; mode <= { 2'b00 , M9_BL_mode , M87_SO_mode , M654_CAS_3 , M3_seq , M210_BL_4 } ;end //set mode :t(mrd) = 2t(ck) = 2*6 = 12 ns10041: begin cmd <= nop2 ; end10045: begin initial_done <= 1 ;  end10046: begin cmd_cnt <= 0 ; enddefault:cmd <= nop2 ;	endcaseend
else if(initial_done)beginif(write_sig)beginif(wr_with_auto)begincmd_cnt <= cmd_cnt + 1 ;case(cmd_cnt)1:begin cmd <= active ; bank <= write_bank ; addr <= write_addr ; end4:begin cmd <= write ; bank <= write_bank ; addr <= {write_addr[12:11],1'b1,write_addr[9:0]}; end10:begin trans_done <= 1 ; cmd_cnt <= 0 ;enddefault:cmd<=nop2;endcaseendelse if(~wr_with_auto)begincmd_cnt <= cmd_cnt + 1 ;case(cmd_cnt)1:begin cmd <= active ; bank <= write_bank ; addr <= write_addr ; end4:begin cmd <= write ; bank <= write_bank ; addr <= {write_addr[12:11],1'b1,write_addr[9:0]}; end9:begin cmd <= precharge ; addr[10] = 1 ;end12:begin trans_done <= 1 ; cmd_cnt <= 0 ;enddefault:cmd<=nop2;endcaseend		endelse if(read_sig)beginif( rd_with_auto )begincmd_cnt <= cmd_cnt + 1 ;case(cmd_cnt)1:begin cmd <= active ; bank <= read_bank ; addr <= read_addr ;  end4:begin cmd <= read ; bank <= read_bank ; addr <= {read_addr[12:11],1'b1,read_addr[9:0]}; end //addr10 control auto charge9:begin read_data <= DQ ; end10:begin read_data <= DQ ; end11:begin read_data <= DQ ; end12:begin read_data <= DQ ; end13:begin trans_done<= 1 ; cmd_cnt <= 0 ; enddefault:begin cmd <= nop2 ;read_data <= DQ ;endendcaseendelse if( ~rd_with_auto )begincmd_cnt <= cmd_cnt + 1 ;case(cmd_cnt)1:begin cmd <= active ; bank <= read_bank ; addr <= read_addr ;  end4:begin cmd <= read ; bank <= read_bank ; addr <= {read_addr[12:11],1'b0,read_addr[9:0]}; end //addr10: control auto charge9:begin read_data <= DQ ; end10:begin read_data <= DQ ; end11:begin read_data <= DQ ; cmd <= precharge ; addr[10] = 1 ; end //precharge12:begin read_data <= DQ ;  end14:begin trans_done<= 1 ; cmd_cnt <= 0 ; enddefault:cmd <= nop2 ;endcaseendendelsebegincmd <= nop2 ;cmd_cnt <= 0 ;trans_done<= 0 ;endend
elsebegincmd_cnt <= 0 ;endendmodule
//-75 100MHz CL = 2 setup = 1.5 hold = 0.8 上升沿读写数据//
// 100MHz : T = 10ns //
// tRP >= 20ns ; T(RFC) >= 66ns ; t(mrd) = 12 ns
// 这里实现 普通的写和读 ;有特殊要求的根据手册进行cmd修改即可module sdram_ctrl(input fpga_clk ,input rst_n ,input write_sig ,input read_sig ,input [12:0]write_addr ,input [1:0]write_bank ,input [15:0]write_data ,input [12:0]read_addr ,input [1:0]read_bank , output trans_done ,output [15:0]read_data ,output sclk ,output  CKE ,output  CS_N ,output  RAS_N ,output  CAS_N ,output  WE_N ,output  [1:0]DQM ,//高电平时屏蔽output  [12:0]SA ,//A12 - A0output  [1:0]BA ,inout [15:0]DQ
);wire clk_100m;
wire clk_100m_90shift ;
pll pll_inst(.inclk0(fpga_clk),.c0(clk_100m),.c1(clk_100m_90shift));
assign sclk = clk_100m_90shift ;//read / write signal catch
reg write_sig_reg ;
always@(posedge fpga_clk or negedge rst_n)
if(!rst_n)write_sig_reg <= 0 ;
elsewrite_sig_reg <= write_sig ;reg read_sig_reg ;
always@(posedge fpga_clk or negedge rst_n)
if(!rst_n)read_sig_reg <= 0 ;
else read_sig_reg <= read_sig ;reg write_signal ;
reg read_signal ;
always@(posedge fpga_clk or negedge rst_n)
if(!rst_n)write_signal <= 0 ;
else if( write_sig & (!write_sig_reg ) )write_signal <= 1 ;
else if(trans_done)write_signal <= 0 ;always@(posedge fpga_clk or negedge rst_n)
if(!rst_n)read_signal <= 0 ;
else if( read_sig & (!read_sig_reg ) )read_signal <= 1 ;
else if(trans_done)read_signal <= 0 ;	// initial sdram
reg [5:0]initial_cnt ;
wire initial_done ;
always@(posedge clk_100m or negedge rst_n)
if(!rst_n)initial_cnt <= 0 ;
else if( initial_cnt < 50 )initial_cnt <= initial_cnt + 1 ;
elseinitial_cnt <= initial_cnt ;reg initial_sig ;
always@(posedge clk_100m or negedge rst_n)	
if(!rst_n)initial_sig <= 0 ;
else if(initial_cnt == 48)initial_sig <= 1 ;
else if(initial_done)initial_sig <= 0 ;wire [3:0]cmd ;
wire [1:0]bank ;
wire [12:0]addr ;
wire [11:0]mode ;
wire cke_ctrl ;
wire [1:0]dqm_ctrl ;
sdram_driver sdram_driver_inst(.clk(clk_100m) ,.rst_n(rst_n) ,.write_sig(write_signal) ,.read_sig(read_signal) ,.initial_sig(initial_sig),.write_addr(write_addr) ,.write_bank(write_bank) ,.read_addr(read_addr) ,.read_bank(read_bank) ,.cmd(cmd) ,.bank(bank) ,.addr(addr) ,.mode(mode) ,.cke_ctrl(cke_ctrl) ,.dqm_ctrl(dqm_ctrl) ,.initial_done(initial_done),.read_data(read_data) ,.trans_done(trans_done) ,.DQ(DQ)
);	sdram_underlying_logic sdram_underlying_logic_inst(.clk(clk_100m) ,.rst_n(rst_n) ,.mode(mode),//A11 -A0.cmd(cmd) ,.cke_ctrl(cke_ctrl) ,.bank(bank) ,.addr(addr) ,.write_data(write_data) ,.dqm_ctrl(dqm_ctrl),.CKE(CKE) ,.CS_N(CS_N) ,.RAS_N(RAS_N) ,.CAS_N(CAS_N) ,.WE_N(WE_N) ,.DQM(DQM) ,//高电平时屏蔽.SA(SA) ,//A12 - A0.BA(BA) ,.DQ(DQ)
);endmodule
module sdram_underlying_logic(input clk ,input rst_n ,input [11:0]mode,//A11 -A0input [3:0]cmd ,input cke_ctrl ,input [1:0]bank ,input [12:0]addr ,input [15:0]write_data ,input [1:0]dqm_ctrl,output reg CKE ,output reg CS_N ,output reg RAS_N ,output reg CAS_N ,output reg WE_N ,output reg[1:0]DQM ,//高电平时屏蔽output reg[12:0]SA ,//A12 - A0output reg [1:0]BA ,inout [15:0]DQ
);reg DQ_ctrl ;
reg [15:0]DQ_out ;
assign DQ = (DQ_ctrl ? DQ_out : 16'hzzzz) ;/////状态参数
localparam nop1 = 					10'b1000000000 ; //空闲态:禁止命令
localparam nop2 = 					10'b0100000000 ; //空闲态:空命令
localparam active = 					10'b0010000000 ; //选bank与行
localparam read = 					10'b0001000000 ; //选bank和列,启动突发读 ,最后一位为屏蔽位
localparam write = 					10'b0000100000 ; //选bank和列,启动突发读 ,最后一位为屏蔽位
localparam burst_terminate = 		10'b0000010000 ; //突发中止
localparam precharge = 				10'b0000001000 ; //关闭行,预充电
localparam auto_refresh = 			10'b0000000100 ; //自动刷新
localparam self_refresh = 			10'b0000000010 ; //自刷新
localparam load_mode_register =	10'b0000000001 ; //加载模式寄存器reg [9:0]state ;//状态机
always@(posedge clk or negedge rst_n)
if(!rst_n)state <= nop2 ;
else if( cmd[3] )state <= nop1 ;
else if( cmd == 4'b0111 )state <= nop2 ;
else if( cmd == 4'b0011 )state <= active ;
else if( cmd == 4'b0101 )state <= read ;
else if( cmd == 4'b0100 )state <= write ;
else if( cmd == 4'b0110 )state <= burst_terminate ;
else if( cmd == 4'b0010 )state <= precharge ;
else if( cmd == 4'b0001 )beginif(cke_ctrl)state <= auto_refresh ;elsestate <= self_refresh ;end
else if( cmd == 4'b0000 )state <= load_mode_register ;reg [7:0]state_cnt ;
always@(posedge clk or negedge rst_n)
if(!rst_n)beginstate_cnt <= 0 ;CKE <= 1 ;CS_N <= 1 ;RAS_N <= 1 ;CAS_N <= 1 ;WE_N <= 1 ;BA <= 0 ;SA <= 0 ;DQM <= 0 ;DQ_ctrl <= 1 ;//获取数据线的控制权DQ_out <= 0 ;end
else begincase(state)nop1 : begin CS_N <= 1 ;  endnop2 : begin CS_N <= 0 ; RAS_N <= 1 ; CAS_N <= 1 ; WE_N <= 1 ; DQ_out <= write_data ;endactive: begin CS_N <= 0 ; RAS_N <= 0 ; CAS_N <= 1 ; WE_N <= 1 ; SA <= addr ; BA <= bank ;end		read : begin CS_N <= 0 ; RAS_N <= 1 ; CAS_N <= 0 ; WE_N <= 1 ; SA <= addr ; BA <= bank ; DQM <= dqm_ctrl ; DQ_ctrl <= 0 ; endwrite : begin CS_N <= 0 ; RAS_N <= 1 ; CAS_N <= 0 ; WE_N <= 0 ; SA <= addr ; BA <= bank ; DQM <= dqm_ctrl ; DQ_out <= write_data ;endprecharge : begin CS_N <= 0 ; RAS_N <= 0 ; CAS_N <= 1 ; WE_N <= 0 ; SA[10] <= addr[10] ; BA <= bank ;DQ_ctrl <= 1 ; end//sa[10] = 1 :对所有bank预充电 ; sa[10] = 0 : 对ba1 ba0 选中的bank预充电auto_refresh : begin CS_N <= 0 ; RAS_N <= 0 ; CAS_N <= 0 ; WE_N <= 1 ; CKE <= 1 ; endself_refresh : begin CS_N <= 0 ; RAS_N <= 0 ; CAS_N <= 0 ; WE_N <= 1 ; CKE <= 0 ; endload_mode_register : begin CS_N <= 0 ; RAS_N <= 0 ; CAS_N <= 0 ; WE_N <= 0 ; SA <= { 1'b0 , mode } ; enddefault:;endcaseendendmodule
`timescale 1ns/1ns 
module sdram_ctrl_tb();reg fpga_clk ;
reg rst_n ;
reg write_sig ;
reg read_sig ;
reg [12:0]write_addr ;
reg [1:0] write_bank ;
reg [15:0]write_data ;
reg [12:0]read_addr ;
reg [1:0] read_bank ; wire sclk ;
wire CKE ;
wire CS_N ;
wire RAS_N ;
wire CAS_N ;
wire WE_N ;
wire [1:0]DQM ;//高电平时屏蔽
wire [12:0]SA ;//A12 - A0
wire [1:0]BA ;
wire [15:0]DQ;
wire [15:0]read_data;
wire trans_done;
wire [3:0]cmd_state ;
sdram_ctrl sdram_ctrl_inst(.fpga_clk(fpga_clk) ,.rst_n(rst_n) ,.write_sig(write_sig) ,.read_sig(read_sig) ,.write_addr(write_addr) ,.write_bank(write_bank) ,.write_data(write_data) ,.read_addr(read_addr) ,.read_bank(read_bank) , .trans_done(trans_done) ,.read_data(read_data) ,.sclk(sclk) ,.CKE(CKE) ,.CS_N(CS_N) ,.RAS_N(RAS_N) ,.CAS_N(CAS_N) ,.WE_N(WE_N) ,.DQM(DQM) ,.SA(SA) ,.BA(BA) ,.DQ(DQ)
);mt48lc16m16a2 mt48lc16m16a2_inst(.Dq(DQ),.Addr(SA),.Ba(BA),.Clk(sclk),.Cke(CKE),.Cs_n(CS_N),.Ras_n(RAS_N),.Cas_n(CAS_N),.We_n(WE_N),.Dqm(DQM)
);pulldown(DQ[15]);
pulldown(DQ[14]);
pulldown(DQ[13]);
pulldown(DQ[12]);
pulldown(DQ[11]);
pulldown(DQ[10]);
pulldown(DQ[9]);
pulldown(DQ[8]);
pulldown(DQ[7]);
pulldown(DQ[6]);
pulldown(DQ[5]);
pulldown(DQ[4]);
pulldown(DQ[3]);
pulldown(DQ[2]);
pulldown(DQ[1]);
pulldown(DQ[0]);
assign cmd_state = {CS_N,RAS_N,CAS_N,WE_N} ;initial fpga_clk = 0 ;
always #10 fpga_clk = !fpga_clk ;
initial beginrst_n = 0 ;write_sig = 0 ;read_sig = 0 ;write_addr = 0 ;write_bank = 0 ;write_data = 0 ;read_addr  = 0 ;read_bank  = 0 ;#201 ;rst_n = 1 ;#102000;#200 ;write_addr = 13'd2 ;write_bank = 2'd1;write_data = 16'h5a5a ;write_sig = 1;#70;write_data = 16'h5a5b ;#10;write_data = 16'h5a5c ;#10;write_data = 16'h5a5d ;#200 ;write_sig = 0;#5000;read_addr = 13'd2 ;read_bank = 2'd1;read_sig = 1 ;#200 ;read_sig = 0 ;#10000;$stop ;endendmodule

3.仿真

1.上点初始化

2.写数据(带自动预充电)

3.读数据(带自动预充电)

读出来的数据,DQ的最后一个数据只有7.6ns,不知道是什么原因。

但是移相适当仍然可以读取。

接下来对AC609板载的SDRAM:w9812g6kh进行设计,并进行板级验证。

三、型号w9812g6kh的sdram

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171894.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Javascript】编写⼀个函数,排列任意元素个数的数字数组,按从⼩到⼤顺序输出

目录 sort方法 两个for循环 写法一&#xff1a; 写法二&#xff1a; sort方法 var list[3,6,2,8,1,7];list.sort();console.log(list);使用sort方法有局限&#xff0c;适合元素为个位数 var list[3,6,80,100,78,4];list.sort();console.log(list);如果元素 解决方法&#xf…

PY32F002A系列单片机:高性价比、低功耗,满足多样化应用需求

PY32F002A系列微控制器是一款高性能、低功耗的MCU&#xff0c;它采用32位ARM Cortex-M0内核&#xff0c;最高工作频率达到24MHz&#xff0c;提供了强大的计算能力。此外&#xff0c;PY32F002A拥有最大20Kbytes的flash存储器和3Kbytes的SRAM&#xff0c;为简单的数据处理提供了充…

asp.net教务管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 教务管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net教务管理系统 应用技术&a…

①【数据库操作】 MySQL数据库的查询、创建、删除、使用。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 数据库相关概念数据库的查询、创建、删除…

数据结构绪论,基本概念

目录 1.什么是数据结构&#xff1f; 2.三种数据结构&#xff1a; 3.第一章绪论 了解概念 1.几个概念 2.数据存储方式&#xff1a; 3.算法的五个重要特性: 4.算法设计的要求: 1.什么是数据结构&#xff1f; 数据 数据&#xff0c;是对客观事物的符号表示&#xff0c;在计…

将自己本地项目上传到git,IDEA图文操作

文章目录 一、初始化git仓库二、gitee创建仓库三、输入自己仓库的地址四、在添加所修改的文件可能的错误 五、合并需上传文件六、上传参考文档 一、初始化git仓库 在自己的项目中&#xff0c;命令行中输入 git init二、gitee创建仓库 新建仓库 设置仓库参数&#xff0c;设置…

iOS Autolayout 约束设置【顺序】的重要性!

0x00 顺序不同&#xff0c;结果不同 看图说话 1 代码是这样滴~ 设置好约束&#xff0c;让 4 个按钮&#xff0c;宽度均分~ 结果如上图 [_pastButton.topAnchor constraintEqualToAnchor:_textView.bottomAnchor constant:6].active YES;[_pastButton.leftAnchor constraintEq…

Postman如何导出接口的几种方法?

本文主要介绍了Postman如何导出接口的几种方法&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 前言&#xff1a; 我的文章还是一贯的作风&#xff0c;简确用风格&#xff08;简单确实有用&#xff09;&a…

从REST到GraphQL:升级你的Apollo体验

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

ubuntu安装nps客户端

Ubuntu安装nps客户端 1.什么是nps内网穿透&#xff1f;2.设备情况3.下载客户端3.链接服务端3.1、无配置文件模式3.2、注册到系统服务(启动启动、监控进程) 1.什么是nps内网穿透&#xff1f; nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发…

注意力机制、Transformer模型、生成式模型、目标检测算法、图神经网络、强化学习、深度学习模型可解释性与可视化方法等详解

采用“理论讲解案例实战动手实操讨论互动”相结合的方式&#xff0c;抽丝剥茧、深入浅出讲解注意力机制、Transformer模型&#xff08;BERT、GPT-1/2/3/3.5/4、DETR、ViT、Swin Transformer等&#xff09;、生成式模型&#xff08;变分自编码器VAE、生成式对抗网络GAN、扩散模型…

华为机试题:HJ3 明明的随机数

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目描述&…

MySQL篇---第一篇

系列文章目录 文章目录 系列文章目录一、数据库的三范式是什么二、MySQL数据库引擎有哪些三、说说InnoDB与MyISAM的区别一、数据库的三范式是什么 第一范式:列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:表的非主属性不能依赖与 其他表的非主属性 外键约束 且三…

单片机中的 _nop_() 延时以及其相关的基础扩展

使用 _nop_() 函数做延时遇到的一些问题 以及对此延伸出的一些需要了解的基本概念 ...... by 矜辰所致 完善文章内容结构&#xff0c;补充指令周期、机器周期等一些基本概念 2023/10/25前言 最近还是继续做着项目&#xff0c;因为在某 8051 内核芯片上使用到了 I…

聚焦AIGC落地,八仙过海,谁更神通?

【科技明说 &#xff5c; 重磅专题开篇】 从AI高谈阔论的概念&#xff0c; 到AI真金白银的投资&#xff0c;再到AI因ChatGPT大模型的升温&#xff0c;每一次技术带动产业的革新&#xff0c;都离不开不了两样东西的驱动。一是此起彼伏的技术迭代&#xff0c;二是不计后果的资本…

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…

树莓派 Qt中 QCameraInfo 无法使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、QCameraInfo 是什么&#xff1f;二、使用步骤1.测试代码2.解决方案2.1输入命令2.2输出 3. 成功打印了摄像头的信息 总结 前言 提示&#xff1a;这里可以添…

电脑技巧:Win10飞行模式相关知识介绍

目录 一、飞行模式简介 二、如何开关Windows 10中的飞行模式 方法一&#xff1a;使用硬件开关 方法二&#xff1a;使用Windows 10操作中心 方法三&#xff1a;使用Windows 10设置 三、飞行模式开关被卡住、变灰或不工作时怎么办 什么是 Windows 10 飞行模式? 用户如何打…

【机器学习可解释性】3.部分依赖图

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP Value5.SHAP Value 高级使用 正文 每个特征怎么样影响预测结果&#xff1f; 部分依赖图 Partial Dependence Plots 虽然特征重要性显示了哪些变量对预测影响最大&#xff0c;但部分依赖图显示了特征如…

大数据-Storm流式框架(五)---DRPC

DRPC 概念 分布式RPC&#xff08;DRPC&#xff09;背后的想法是使用Storm在运行中并行计算真正强大的函数。 Storm拓扑接收函数参数流作为输入&#xff0c;并为每个函数调用发送结果的输出流。 DRPC并不是Storm的一个特征&#xff0c;因为它基于Storm的spouts&#xff0c;bo…