练习十一:简单卷积器的设计
简单卷积器的设计
- 1,任务目的:
- 2,明确设计任务
- 2.1,目前这部分代码两个文件没找到,见第5、6节,待解决中。
- ,卷积器的设计,RTL:con1.v
- 4,前仿真和后仿真,测试信号:test_con1.v
- 5,A/D转换器的Verilog HDL 模型所需要的技术参数,RTL代码adc.v
- 5.1 问题:这个文件没找到,待解决中
- 5.2,RTL源代码
- 6,2K×8位 异步CMOS静态 RAM HM-65162模型,RTL代码:sram.v
- 6.1,这个文件,没找到,待解决中。
- 6.2,RTL代码
- 7,vivado生成的RTL原理图
- 8,波形图
1,任务目的:
(1)学习和掌握高速计算逻辑状态机的基本控制方法;
(2)了解计算逻辑与存储器和AD模块的接口设计技术基础;
(3)进一步掌握数据总线在模块设计中的应用和控制;
(4)熟悉工程概念来编写较完整的测试模块,做到接近真实的完整测试。
2,明确设计任务
在设计之前必须明确设计的具体内容。
卷积器是数字信号处理系统中常用的部件,它首先对模拟输入信号实时采样,得到数字信号序列。然后,对数字信号进行卷积运算,再将卷积结果存入RAM中。对模拟信号的采样由 A/D 转换器来完成,而卷积过程由卷积器来实现。
为了设计卷积器:
首先设计 RAM 和 A/D 转换器的 Verilog HDL模型。在电子工业发达的国家,可以通过商业渠道得到非常准确的外围器件的虚拟模型。如果没有外围器件的虚拟模型,就需要仔细阅读和分析 RAM 和 A/D 转换器的器件说明书自行编写。因为 RAM 和 A/D 转换器不是设计的硬件对象,所以需要的只是它们的行为模型,精确的行为模型需要认真细致地编写,并不比可综合模块容易编写。它们与实际器件的吻合程度直接影响设计的成功。在这里可把重点放在卷积器的设计上,直接给出 RAM 和 A/D 转换器的 Verilog HDL 模型和它的器件参数(见本文后面章节),读者也可以对照器件手册,认真阅读 RAM 和 A/D 转换器的 Verilog HDL 模型。对 RAM 和 A/D 转换器的Verilog HDL 模型的详细了解对卷积器的设计是十分必要的。
2.1,目前这部分代码两个文件没找到,见第5、6节,待解决中。
,卷积器的设计,RTL:con1.v
通过前面的练习已经知道,用高层次的设计方法来设计复杂的时序逻辑,重点是把时序逻辑抽象为有限状态机,并用可综合风格的 Verilog HDL 把状态机描述出来。
下面通过注释来介绍整个程序的设计过程。
选择8位输入总线,输出到 RAM 的数据总线也选择8位,卷积值为16位,分高、低字节分别写到两个 RAM 中,地址总线是 11 位。
为了理解卷积器设计中的状态机,必须对 A/D 转换器和 RAM 的行为模块有深入的理解。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/12/01 09:32:20
// Design Name:
// Module Name: con1
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module con1(
address, indata, outdata, wr, nconvst,
nbusy, enout1, enout2, clk, reset,
start
);
input clk; // 采用10Mhz的时钟
input reset; // 复位信号
input start; // 因为RAM 的空间是有限的,当RAM存满后采样和卷积都会停止// 此时给一个start的高电平脉冲将会开始下一次的卷积
input nbusy; // 从A/D转换器来的信号表示 转换器 的忙 或 闲output wr; // RAM 写控制信号
output enout1; // enout1是存储卷积低字节结果 RAM 的片选信号
output enout2; // enout2是存储卷积高字节结果 RAM 的片选信号output nconvst; // 给出A/D转换器的控制信号,命令转换器开始工作,低电平有效
output address; // 地址输出input [7:0] indata; // 从 A/D 转换器来的数据总线
output [7:0] outdata; // 写到 RAM 去的数据总线wire nbusy;
reg wr;
reg nconvst;
reg enout1;
reg enout2;
reg [7:0] outdata;reg [10:0] address;
reg [8:0] state;
reg [15:0] result;
reg [23:0] line;
reg [11:0] counter;
reg high;
reg [4:0] j;
reg EOC;parameter h1 = 1, h2 = 2, h3 = 3; // 假设的系统系数parameter IDLE = 9'b0_0000_0001;
parameter START = 9'b0_0000_0010;
parameter NCONVST = 9'b0_0000_0100;
parameter READ = 9'b0_0000_1000;parameter CALCU = 9'b0_0001_0000;
parameter WRREADY = 9'b0_0010_0000;
parameter WR = 9'b0_0100_0000;
parameter WREND = 9'b0_1000_0000;parameter WAITFOR = 9'b1_0000_0000;parameter FMAX = 20; // 因为 A/D 转换的时间是随机的,为保证按一定的频率采样,// A/D转换控制信号应以一定频率给出。这里的采样频率可通过// FMAX控制,并设为 500KHzalways@(posedge clk)if(!reset) beginstate <= IDLE;nconvst <= 1'b1;enout1 <= 1;enout2 <= 1;counter <= 12'b0;high <= 0;wr <= 1;line <= 24'b0;address <= 11'b0;endelse case(state)IDLE:if(start == 1) begincounter <= 0; // counter 是一个计数器,记录已用的// RAM 空间line <= 24'b0;state <= START;endelsestate <= IDLE; START: // START状态控制 A/D 开始转换if(EOC) beginnconvst <= 0;high <= 0;state <= NCONVST;endelsestate <= START;NCONVST: begin // NCONVST 状态是 A/D 转换保持阶段nconvst <= 1;state <= READ;endREAD: if(EOC) beginline <= {line[15:0], indata};state <= CALCU;endelsestate <= READ;CALCU: beginresult <= line[7:0] * h1 + line[15:8] * h2 + line[23:16] * h3;state <= WRREADY;endWRREADY: begin // 将卷积结果写入 RAM 时,先写入低字节,再写入高字节// WRREADY 状态是写 RAM 准备状态,建立地址和数据信号address <= counter;if(!high)outdata <= result[7:0];elseoutdata <= result[15:8];state <= WR;endWR: begin // WR状态产生片选和写脉冲if(!high)enout1 <= 0;elseenout2 <= 0;wr <= 0;state <= WREND;endWREND: begin // WREND状态结束一次写操作,若还未写入高字节则转到WRREADY状态// 开始高字节写入wr <= 1;enout1 <= 1;enout2 <= 1;if(!high) beginhigh <= 1;state <= WRREADY;endelsestate <= WAITFOR;endWAITFOR: // WAITFOR 状态控制采样频率并判断 RAM 是否已被写满if(j == FMAX - 1) begincounter <= counter + 1;if(!counter[11])state <= START;else beginstate <= IDLE;$display ($time, "The ram is used up.");$stop;endendelsestate <= WAITFOR;default:state <= IDLE;endcase// assign rd = 1; // RAM 的读信号时钟保持高电平
// 记录时钟,与 FMAX 共同控制采样频率,由于直接用 clk 的上升沿对 nbusy 判断,
// 以决定某些操作是否运行时,会因为两个信号的跳变沿相隔太近而令状态机不能正常工作,
// 因此利用 clk 的下降沿建立 EOC信号与 nbusy 同步,相位相差 180°,然后用clk的
// 上升沿判断操作是否进行always@(negedge clk) beginEOC <= nbusy;if(! reset || state == START)j <= 1;elsej <= j + 1;
endendmodule
4,前仿真和后仿真,测试信号:test_con1.v
程序写完后首先用仿真器(如Vivado)做前仿真,然后为检查编写的程序,需要编写测试程序,测试程序应尽可能检测出各种极限情况。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/12/01 09:34:59
// Design Name:
// Module Name: test_con1
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//// 程序写完后首先用仿真器做前仿真,然后为检查编写的程序,
// 需要编写测试程序,测试程序应尽可能检测出各种极限情况。
//module test_con1;
wire wr;
wire enin;
wire enout1;
wire enout2;wire [10:0] address;reg rd;
reg clk;
reg reset;
reg start;wire nbusy;
wire nconvst;wire [7:0] indata;
wire [7:0] outdata;integer i;parameter HALF_PERIOD = 1000;// 产生 10k Hz的时钟
initial beginrd = 1;i = 0;clk = 1;forever #HALF_PERIOD clk = ~clk;
end// 产生置位信号
initial beginreset = 1;#(HALF_PERIOD * 2 + 50) reset = 0;#(HALF_PERIOD * 3) reset = 1;
end// 产生开始卷积控制信号
initial beginstart = 0;#(HALF_PERIOD * 7 + 20) start = 1;#(HALF_PERIOD * 2) start = 0;#(HALF_PERIOD * 1000) start = 1;#(HALF_PERIOD * 2) start = 0;
endassign enin = 1;con1 u_con1(
.address (address ),
.indata (indata ),
.outdata (outdata ),
.wr (wr ),
.nconvst (nconvst ),
.nbusy (nbusy ),
.enout1 (enout1 ),
.enout2 (enout2 ),
.clk (clk ),
.reset (reset ),
.start (start )
);sram u_sram(
.Address (address ),
.Data (outdata ),
.SRW (wr ),
.SRG (rd ),
.SRE (enout1 )
);adc u_adc(
.nconvst (nconvst ),
.nbusy (nbusy ),
.data (indata )
);endmodule
如果前仿真通过,则可以做后仿真。
后仿真考虑了器件的延时,更具可靠性。
首先用综合器(如:synplify)进行综合。在综合时应注意选择器件库,如Altera FLEX10K系列FPGA或其他类型的FPGA。综合完后生成了与原程序名相应的一个扩展名为edf的文件,然后用布线工具(如:MAX+PLUS II ver.9.3)对刚才得到的扩展名为edf的文件进行编译,如果编译不出错就可得到扩展名为vo的两个文件:一个文件名与原文件名相同,另一个文件名是alt_max2.vo。
用仿真器如(Modelsim)来做后仿真与前仿真一样,对于Altera系列的FPGA只须将con1.vo和alt_max2.vo两个文件重新编译,取代原先用con1.v编译的模型就可以了,不同的FPGA具体方法有些不同,但原理都是一样的。这时将后仿真波形与前仿真波形比较就会发现后仿真把器件的延迟考虑进去了。看波形,检查结果是否正确,若不正确则改动原程序,重新进行上述步骤。
5,A/D转换器的Verilog HDL 模型所需要的技术参数,RTL代码adc.v
5.1 问题:这个文件没找到,待解决中
(1)adc.v
data_mem影响databuf,data_buf影响data,data端口连接indata。
因此,找到这个文件,对indata输出的解决是有意义的。
5.2,RTL源代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/12/01 17:31:50
// Design Name:
// Module Name: adc
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//// A、D转换器的 Verilog HDL行为模型如下:
module adc(nconvst, nbusy, data);
input nconvst; // A/D 启动脉冲ST
output nbusy; // A/D 工作标志
output data; // 数据总线,从 AD.DATA 文件中读取数据后经端口输出reg [7:0] databuf, i; // 内部寄存器
reg nbusy;wire [7:0] data;
reg [7:0] data_mem [0:255];
reg link_bus;integer tconv, t5, t8, t9, t12;
integer wideth1, wideth2, wideth;// 时间参数定义(依据AD7886手册)
always@(negedge nconvst) begintconv = 9500 + {$random} % 500; // (type 950, max 1000ns) Conversion timet5 = {$random} % 1000; // (max 100 ns) CONVST to BUSY Propagation Dlay// CL = 10 pft8 = 200; // (min 20 ns) CL = 20pf Data Setup Time Prior to BUSY// (min 10 ns) CL = 100pft9 = 100 + {$random} % 900; // (min 10ns, max 100ns) Bus Relinquish Time After CONVSTt12 = 2500; // (type) BUSY High to CONVST Low, SHA Acquisition Time
endinitial begin$readmemh("adc.data", data_mem); // 从数据文件 adc.data 中读取数据i = 0;nbusy = 1;link_bus = 0;
endassign data = link_bus ? databuf : 8'bzz; // 三态总线/*
在信号 NCONVST 的负跳降沿到来后,隔 t5 秒后,使 NBUSY 信号置为低,tconv 是 AD 将模拟信号转换为
数字信号的时间,在信号 NCONVST 的正跳降沿到来后经过 tconv 时间后,输出 NBUSY 信号由低变为高。
*/always@(negedge nconvst)fork#t5 nbusy = 0;@(posedge nconvst) begin#tconv nbusy = 1; endjoin
/*
NCONVST 信号的下降沿触发,经过 t9 延时后,把数据总线输出关闭并置为高阻态,如图14所示。
NCONVST 信号的上升沿到来后,经过(tconv - t8)时间,输出一个字节(8位数据)到数据缓冲器
databuf,该数据来自于 data_mem。而 data_mem 中的数据是初始化时从数据文件 AD.DATA 中
读取的,此时应启动总线的三态输出。
*/always@(negedge nconvst) begin@(posedge nconvst)#(tconv - t8) databuf = data_mem[i];if(wideth < 10000 && wideth > 500)if(i == 255)i = 0;elsei = i + 1;elsei = i;
end// 在模数转换期间关闭三态输出,转换结束时启动三态输出
always@(negedge nconvst)fork#t9 link_bus = 1'b0; // 关闭三态输出,不允许总线输出@(posedge nconvst)#(tconv - t8) link_bus = 1'b1;join/*
当 NCONVST 输入信号的下一个转换的下降沿与 NBUSY 信号上升沿之间时间延迟小于
t12 时,出现警告信息,通知设计者请求转换的输入信号频率太快,A/D 器件转换
速度跟不上,仿真模型不仅能够实现硬件电路的输出功能,同时能够对输入信号进行
检测,当输入信号不符合手册要求时,显示警告信息。
*/// 检查 A/D 启动信号的频率是否太快
always@(posedge nbusy) begin#t12;if(!nconvst)$display("Warning! SHA Acquistion Time is too short!");
// else
// $display("SHA Acquistion Time is enough!");
end// 检查 A/D 启动信号的负脉冲宽度是否足够和太宽
always@(negedge nconvst) beginwideth = $time;@(posedge nconvst)wideth = $time - wideth;if(wideth <= 500 || wideth > 10000) begin$display("nCONVST Pulse Width = %d", wideth);$display("Warning! nCONVST Pulse Wideth is too narrow or too wide!");// $stop;end
endendmodule
6,2K×8位 异步CMOS静态 RAM HM-65162模型,RTL代码:sram.v
6.1,这个文件,没找到,待解决中。
下面是chatgpt对这条语句的解释:
6.2,RTL代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/12/01 17:38:38
// Design Name:
// Module Name: sram
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
///* sram is Verilog HDL model for HM - 65162, 2K*8 bit Asynchronous(异步) CMOS
Static RAM. It is used in simulation to substitute the real RAM to verify whether
the writing or reading of the RAM is OK.
This module is a behavioral model for simulation only, not synthesizable. It's
writing and reading function are verified.
*/module sram(
Address, Data, SRG, SRE, SRW
);
input [10:0] Address;
input SRG; // output enable
input SRE; // chip enable
input SRW; // write enableinout [7:0] Data; // Buswire [10:0] Addr = Address;
reg [7:0] RdData;
reg [7:0] SramMem [0:'h7ff];
reg RdSramDly, RdFlip;
wire [7:0] FlpData;
wire [7:0] Data;reg WR_flag; // to judge the signals according to the specification of // HM-65162
integer i;wire RdSram = ~SRG & ~SRE;
wire WrSram = ~SRW & ~SRE;reg [10:0] DelayAddr;
reg [7:0] DelayData;
reg WrSramDly;integer file;assign FlpData = (RdFlip) ? ~RdData : RdData;
assign Data = (RdSramDly) ? FlpData : 'hz;/*
parameters of read circle
*/// 参数序号、最大或最小、参数含义
parameter TAVQV = 90, // 2, max, address access timeTELQV = 90, // 3, max, chip enable access timeTELQX = 5, // 4, min, chip enable output enable time TGLQV = 65, // 5, max, output enable access tiemTGLQX = 5, // 6, min, output enable output enable time TEHQZ = 50, // 7, max, chip enable output disable timeTGHQZ = 40, // 8, max, output enable output disable timeTAVQX = 5; // 9, min, output hold from address changeparameter TAVWL = 10, // 12, min, address setup timeTWLWH = 55, // 13, min, chip enable pulse setup time,// write enable pluse width,TWHAX = 15, // 14, min10, write enable read setup time,// 读上升沿后地址保留时间TWLQZ = 50, // 16, max, write enable output disable timeTDVWH = 30, // 17, min, data setup timeTWHDX = 20, // 18, min15, data hold timeTWHQX = 20, // 19, min0, write enable output enable time, 0TWLEH = 55, // 20, min, write enable pulse setup timeTDVEH = 30, // 21, min, chip enable data setup timeTAVWH = 70; // 22, min65, address valid to end of writeinitial beginfile = $fopen("ramlow.txt");if(!file) begin$display("Could not open the file.");$stop;end
endinitial beginfor(i = 0; i < 'h7ff; i = i + 1)SramMem[i] = i;// monitor($time, "DelayAddr = %h, DelayData = %h", DelayAddr, DelayData);
endinitial RdSramDly = 0;
initial WR_flag = 1;// READ CIRCLE
always@(posedge RdSram) #TGLQX RdSramDly = RdSram;
always@(posedge SRW) #TWHQX RdSramDly = RdSram;
always@(Addr) begin#TAVQX;RdFlip = 1;#(TGLQV - TAVQX); // address access timeif(RdSram)RdFlip = 0;
end always@(posedge RdSram) beginRdFlip = 1;#TAVQV; // output enable access timeif(RdSram) RdFlip = 0;
endalways@(Addr) #TAVQX RdFlip = 1;
always@(posedge SRG) #TEHQZ RdSramDly = RdSram;
always@(posedge SRE) #TGHQZ RdSramDly = RdSram;
always@(negedge SRW) #TWLQZ RdSramDly = 0;always@(negedge WrSramDly or posedge RdSramDly) RdData = SramMem[Addr];// WRITE CIRCLE
always@(Addr) #TAVWL DelayAddr = Addr; // Address setup
always@(Data) #TDVWH DelayData = Data; // Data setup
always@(WrSram) #5 WrSramDly = WrSram;
always@(Addr or Data or WrSram) WR_flag = 1;always@(negedge SRW) begin#TWLWH; // Write enable pulse widthif(SRW) beginWR_flag = 0;$display("ERROR! Can't write! Write enable time(W) is too short!");end
endalways@(negedge SRW) begin#TWLEH; // Write enable pulse setup timeif(SRE) beginWR_flag = 0;$display("ERROR! Can't write! write enable pulse setup time(E) is too short!");end
endalways@(posedge SRW) begin#TWHAX; // Write enable read setup timeif(DelayAddr !== Addr) beginWR_flag = 0;$display("ERROR! Can't write! Write enable read setup time is too short!");end
endalways@(Data)if(WrSram) begin#TDVEH; // chip enable data setup timeif(SRE) beginWR_flag = 0;$display("ERROR! Can't write! chip enable data setup time is too short!");end
endalways@(Data)if(WrSram) begin#TDVEH;if(SRW) beginWR_flag = 0;$display("ERROR! Can't write! chip enable data setup time is too short!");end
endalways@(posedge SRW) begin#TWHDX; // Data hold timeif(DelayData !== Data)$display("Warning! Data hold time is too short!");
endalways@(DelayAddr or DelayData or WrSramDly)if(WrSram && WR_flag) beginif(!Addr[5]) begin#15 SramMem[Addr] = Data;// $display("mem[%h] = %h", Addr, Data);$fwrite(file, "mem[%h] = %h", Addr, Data);if(Addr[0] && Addr[1]) $fwrite(file, "\n");endelse begin$fclose(file);$display("Please check the txt.");$stop;end
endendmodule
7,vivado生成的RTL原理图
8,波形图
相关文章:
练习十一:简单卷积器的设计
简单卷积器的设计 1,任务目的:2,明确设计任务2.1,目前这部分代码两个文件没找到,见第5、6节,待解决中。 ,卷积器的设计,RTL:con1.v4,前仿真和后仿真,测试信号…...
外包干了4年,技术退步太明显了。。。。。
先说一下自己的情况,本科生生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…...
微服务实战系列之EhCache
前言 书接前文,继续深耕。上一篇博主对Redis进行了入门级介绍,大体知道了Redis可以干什么以及怎么使用它。 今日博主继续带着大家学习如何使用EhCache,这是一款基于Java的缓存框架。 微服务实战系列之Redis微服务实战系列之Cache微服务实战…...
SpringBoot:SpringMVC(上)
文章目录 前言一、SpringMVC是什么?1.1 MVC的定义:1.2 MVC 和 Spring MVC 的关系 二、Spring MVC 创建和连接2.1创建springmvc2.2接下来,创建⼀个 UserController 类,实现⽤户到 Spring 程序的互联互通,具体实现代码如…...
一文搞懂Go语言中包导入
一文搞懂Go语言中包导入 定义包 在go语言中,定义包的关键字为package,如package main等,在go语言中有一个约定俗成的标准,那就是包名与目录名把持一致。 //service目录下 package servicepackage utils 可以看到,我…...
Vue2学习笔记(事件处理)
一、基本使用 1.使用v-on:xxx 或 xxx 绑定事件,其中xxx是事件名;2.事件的回调需要配置在methods对象中,最终会在vm上;3.methods中配置的函数,不要用箭头函数!否则this就不是vm了;4.methods中配…...
【2023第十二届“认证杯”数学中国数学建模国际赛】A题 太阳黑子预报完整解题思路
A题 太阳黑子预报 题目任务思路分析第一问第二问第三问 题目 太阳黑子是太阳光球上的一种现象,表现为比周围区域更暗的临时斑点。它们是由于磁通量集中而导致表面温度降低的区域,磁通量的集中抑制了对流。太阳黑子出现在活跃区域内,通常成对…...
Huawei FusionSphere FusionCompte FusionManager
什么是FusionSphere FusionSphere 解决方案不独立发布软件,由各配套部件发布,请参 《FusionSphere_V100R005C10U1_版本配套表_01》。 目前我们主要讨论FusionManager和FusionCompute两个组件。 什么是FusionCompte FusionCompute是华为提供的虚拟化软…...
GSLB是什么?谈谈对该技术的一点理解
GSLB是什么?它又称为全局负载均衡,是主流的负载均衡类型之一。众所周知,负载均衡位于服务器的前面,负责将客户端请求路由到所有能够满足这些请求的服务器,同时最大限度地提高速度和资源利用率,并确保无任何…...
【接口测试】POST请求提交数据的三种方式及Postman实现
1. 什么是POST请求? POST请求是HTPP协议中一种常用的请求方法,它的使用场景是向客户端向服务器提交数据,比如登录、注册、添加等场景。另一种常用的请求方法是GET,它的使用场景是向服务器获取数据。 2. POST请求提交数据的常见编…...
SpringBoot系列之集成Jedis教程
SpringBoot系列之集成Jedis教程,Jedis是老牌的redis客户端框架,提供了比较齐全的redis使用命令,是一款开源的Java 客户端框架,本文使用Jedis3.1.0加上Springboot2.0,配合spring-boot-starter-data-redis使用࿰…...
centos用什么命令可查看版本号
概述 查版本号的命令:1、“cat /etc/redhat-release”,可输出centos版本号;2、“cat /proc/version”、“uname -a”或“uname -r”,可输出内核版本号。 本教程操作环境:centos7.9.2009系统。 查看centos版本 [roo…...
大数据之Redis
NoSQL SQL数据库泛指关系型数据库NoSQL不拘泥于关系型数据的设计范式,放弃了通用的技术标准,为某一特定领域场景而设计 NoSQL的特点 不遵循SQL标准不支持ACID远超SQL的性能 NoSQL的适用场景 对数据高并发的读写海量数据的读写对数据高可扩展性的 N…...
【React设计】React企业级设计模式
Image Source : https://bugfender.com React是一个强大的JavaScript库,用于构建用户界面。其基于组件的体系结构和构建可重用组件的能力使其成为许多企业级应用程序的首选。然而,随着应用程序的规模和复杂性的增长,维护和扩展变得更加困难。…...
赴日程序员高年薪过上“躺平”生活?
日本的IT行业想要达到的高薪,也是需要很多资历和经验的,不过即使你是新卒,也能拿到相比国内来说让你满意的薪资。 刚入职的起薪是20-23万日元/月,情报信息业出身,技术掌握不错,起薪是25万-30万日元。之后经…...
Windows开启SQL Server服及1433端口
需求:Windows开启SQL Server服务及1433端口 目前端口没有启动 解决: 打开SQL Server配置管理器(winR) 各个sqlserver版本在textbox中输入对应的命令如下: SQLServerManager15.msc(对于 SQL Server 2019 &am…...
网盘系统设计:万亿 GB 网盘如何实现秒传与限速?
Java全能学习面试指南:https://javaxiaobear.cn 网盘,又称云盘,是提供文件托管和文件上传、下载服务的网站(File hostingservice)。人们通过网盘保管自己拍摄的照片、视频,通过网盘和他人共享文件ÿ…...
整数和浮点数在内存中的存储
文章目录 每日一言整数在内存中的存储方式浮点数在内存中的存储结语 每日一言 You just can’t beat the person who never gives up. 你无法打败那位永不放弃的人。 整数在内存中的存储方式 整数在内存中的存储方式通常采用二进制形式,即将整数的数值转化为二进制…...
rabbitMQ镜像队列的使用
在rabbitMQ集群中,默认发送消息时,队列默认时在一个节点上存在的。 我们以node01 node02 node03三节点集群为例,在node01声明队列发送消息后,发现: 测试队列只在节点node01上出现。 我们手动停止node01后,…...
ros来保存图像和保存记录视频的方法---gmsl相机保存视频和图片
1,保存图片 rosrun image_view image_view image:=/myimg_topic这个命令只是用来查看图像的,它并不会保存图像。如果你想要保存图像,你需要使用image_saver节点,并指定保存路径。例如: 下面指令就可以了,可以用 rosrun image_view image_saver image:=/myimg_topic _fi…...
Oracle19c使用adrci清理日志文件
Oracle中通常有好多日志文件,遇到异常情况会产生大量日志,造成磁盘空间紧张。 故需要清理对应文件。包括trace文件,incident文件,listener log文件等。 19c中oracle提供了一个ADRCI的命令行工具来查看ADR中的alert日志和trace信息…...
Ubuntu之Sim2Real环境配置(坑居多)
不要一上来就复制哦,因为很多下面的步骤让我走了很多弯路,如果可能的话,我会重新整理再发出来 前提: 参考教程 Docs 创建工作空间(不用跟着操作,无用) 1.创建sim2real server container 1.尝试创建sim2r…...
java中BigDecimal里面的subtract函数的意思?
在Java中,BigDecimal类提供了一个名为subtract()的函数,用于执行两个BigDecimal对象的减法操作。该函数返回一个新的BigDecimal对象,表示两个操作数相减的结果。 下面是BigDecimal.subtract()函数的用法示例: java Copy code im…...
线程变量引发的session混乱问题
最近不是在救火,就是在救火的路上。 也没什么特别可写的,今天记录下最近遇到的一个问题,个人觉得挺有意思, 待有缘人阅读 言归正传,售后反馈: 营业查询中付款方式为第三方支付的几条银行缴费,创…...
dockerfile与docker-compose解释及对比
Dockerfile 是一个文本文件,用于定义单个Docker镜像的构建过程和配置。它包含了一系列的指令,如FROM、RUN、COPY、CMD等,按照顺序执行这些指令来构建镜像。Dockerfile可以定义容器的基础镜像、安装依赖软件、拷贝文件、运行命令等操作。通过…...
数据库更换版本
目录 0.前言 1.官网下载MySQL 2.配置初始化文件my.ini 3.初始化MySQL 4.安装mysql服务并启动修改密码 5.配置环境变量编辑 0.前言 心累,为了完成实验,必须使用8.0版本导致我更新版本的时候,把sqlyog干崩溃了,什么版本不兼…...
Unity Meta Quest 一体机开发(九):【手势追踪】通过录制抓取手势实现自定义抓取姿势
文章目录 📕教程说明📕录制前的准备📕第一种录制方法(Hand Grab Pose Tool 场景)⭐在运行模式中确认录制⭐保存录制的手势,将物体做成 Prefab⭐在编辑阶段调整抓取手势🔍Fingers Freedom&#x…...
Git 简介及异常场景处理
一、简介 介绍Git之前,还得先介绍下 版本控制系统(VCS), 和它的发展历史 纵观版本控制系统的发展历史,广义上讲,版本控制工具的历史可以分为三代: 第一代 第一代版本控制系统被称为本地版本控…...
龙迅LT2611UX 四端口LVDS转HDMI(2.0)
1.描述: LT2611UX 四端口LVDS TO HDMI2.0。 LT2611UX是一款高性能得LVDS到HDMI2.0转换器得STB,DVD应用程序,LVDS输入可以配置单端口,双端口或者四端口,带有一个高速时钟通道,最多可运行三到四个高速数据…...
MySQL基础『数据类型』
✨个人主页: 北 海 🎉所属专栏: MySQL 学习 🎃操作环境: CentOS 7.6 阿里云远程服务器 🎁软件版本: MySQL 5.7.44 文章目录 1.数据类型一览2.整型2.1.INT2.2.BIT 3.浮点数3.1.FLOAT3.2.DECIMAL3…...
新公司网站建设方案/谷歌独立站
学会等待,享受孤独!一提到等字,首先就能想到等车等人,等的过程中就觉得时间和蜗牛一般在向前移动,焦虑,烦躁,一遍遍张望倒数,脚下的那块地恨不能踩个洞出来。这时候何不稍微平复一下…...
自己做电商网站吗/短视频代运营合作方案
问题出于安全原因,默认参数很严格,禁止root用户直接使用ssh登陆比如先用非root的帐户,登陆到ssh后,su成为root解决方案如果想直接用root登陆,则修改如下配置文件:vi /etc/ssh/sshd_config找到其中的如下一行…...
网站设置伪静态/广州白云区疫情实时动态
首先声明一下,这不是我的原创,只是借用别人的东西,放在这里以供自己查阅和大家一起分享,如果原作者看不到了,可以留言与我联系,要求删除 js中数组常用方法总结 前言 从事前端到现在也有快两年了࿰…...
汕头吧 百度贴吧/优化疫情防控措施
2019独角兽企业重金招聘Python工程师标准>>> $(document).mousedown(function(e) {var clientY e.clientY;// .panel-body为需要点击滑动的容器,需要加style"overflow: auto;"var scrollTop $(.panel-body)[0].scrollTop;$(document).mousem…...
刚刚邯郸发生大事了/seo公司排名
方案一:使用360急救箱扫描打开 360安全卫士,在主界面右侧点击“功能大全(更多)”,找到并打开“系统急救箱”。等360系统急救箱安装并更新完成后,点击右侧的“系统设置修复区”点击“全选”按钮后,点击“扫描修复”按钮…...
常州做网站/预测2025年网络营销的发展
本文章著作权归Pushy所有,如需转载请联系作者,并注明出处:pushy.site 1. Protobuf 1.1 介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google公司研发的一种灵活高效的可序列化的数据协议。什么是序列化呢? 序列化(Serializati…...