【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

2023-11-19

目录

建立工程

添加顶层

模块1

模块2

添加约束文件

编辑时钟约束

打开布线设计

代码代表的含义

时序报告

 进行时序分析

Summary:包含了汇总的信息量

Source Clock Path:这部分是表示Tclk1的延时细节

Data Path:数据路径的延时

往期系列博客:


 

建立工程

在之前进行了时序分析的理论部分的学习,接下来就开始真正在实验工程去实操,看看在Vivado中时序约束以及分析是如何进行操作的,同样实操也可以加深理论知识的理解,理论与实际相结合。

本次上手实操关于建立时间保持时间的时序分析和约束,实验工程源码和工程项目在资源可以下载。

新建一个实验工程,命名为timing,选择自己的板子的型号,我这里用的是xc7a75tfgg484-2型号的板子,点击创建即可。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

添加顶层

添加一个顶层文件命名为top_ioddr,将事先存在的.v文件加入即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_10,color_FFFFFF,t_70,g_se,x_16

module top_ioddr(    input wire        rx_clk,    input wire        rx_ctrl,    input wire    [3:0] rx_dat,  //tx    output  wire    tx_clk,    output  wire [3:0]  tx_d,    output  wire    tx_dv);wire rst;wire rx_clk_90;wire rx_en;wire [7:0] rx_data;reg tx_en1,tx_en2;reg [7:0] tx_data1,tx_data2;assign rst =0;assign rx_clk_90 = rx_clk;always @(posedge rx_clk_90 or posedge rst) beginif (rst == 1'b1) begintx_data1 <= 'd0;endelse if (rx_en == 1'b1) begintx_data1 <= rx_data+ rx_data -1;endendalways @(posedge rx_clk_90 or posedge rst) beginif (rst == 1'b1) begintx_data2 <= 'd0;endelse if (tx_en1 == 1'b1) begintx_data2 <= tx_data1+ tx_data1 -5;endendalways @(posedge rx_clk_90 ) begintx_en1 <= rx_en;endalways @(posedge rx_clk_90 ) begintx_en2 <= tx_en1;endiddr_ctrl inst_iddr_ctrl(.rx_clk_90 (rx_clk_90),.rst       (rst),.rx_dat    (rx_dat),.rx_ctrl   (rx_ctrl),.rx_en     (rx_en),.rx_data   (rx_data));oddr_ctrl inst_oddr_ctrl(.sclk    (rx_clk_90),.tx_dat  (tx_data2),.tx_en   (tx_en2),.tx_c    (rx_clk_90),.tx_data (tx_d),.tx_dv   (tx_dv),.tx_clk  (tx_clk));endmodule

其代码的大致实现的工程就是在之前的时序文章讲到的两拍寄存器的操作,类似下图的模型结构。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

另外同样的操作添加顶层下面的两个子模块

模块1

moduleoddr_ctrl(
inputwiresclk,
inputwire[7:0]tx_dat,
inputwiretx_en,
inputwiretx_c,//相移时钟
outputwire[3:0]tx_data,
outputwiretx_dv,
outputwiretx_clk
);
ODDR #(      
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"       
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1      
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC"   
 ) 
ODDR_DV_inst (   
.Q(tx_dv),   // 1-bit DDR output     
.C(sclk),   // 1-bit clock input      
.CE(1'b1), // 1-bit clock enable input      
.D1(tx_en), // 1-bit data input (positive edge)      
.D2(tx_en), // 1-bit data input (negative edge)     
.R(1'b0),  // 1-bit reset     
.S(1'b0)    // 1-bit set   
); 
ODDR #( 
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"       
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1      
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC"    
) 
ODDR_CLK_inst (      
.Q(tx_clk),   // 1-bit DDR output      
.C(tx_c),   // 1-bit clock input      
.CE(1'b1), // 1-bit clock enable input      
.D1(1'b1), // 1-bit data input (positive edge)      
.D2(1'b0), // 1-bit data input (negative edge)     
.R(1'b0),  // 1-bit reset     
.S(1'b0)    // 1-bit set   
);    

genvar j;
generate
for(j=0;j<4;j=j+1) begin
ODDR #(      
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"       
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1      
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC" 
) 
ODDR_DATA_inst (      
.Q(tx_data[j]),   // 1-bit DDR output      
.C(sclk),   // 1-bit clock input      
.CE(1'b1), // 1-bit clock enable input      
.D1(tx_dat[j]), // 1-bit data input (positive edge)      
.D2(tx_dat[j+4]), // 1-bit data input (negative edge)     
.R(1'b0),  // 1-bit reset     
.S(1'b0)    // 1-bit set   
);
end 
endgenerate 
endmodule

模块2

moduleoddr_ctrl(
inputwiresclk,
inputwire[7:0]tx_dat,
inputwiretx_en,
inputwiretx_c,//相移时钟
outputwire[3:0]tx_data,
outputwiretx_dv,
outputwiretx_clk
);

ODDR #(      
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"       
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1      
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC"    
) 
ODDR_DV_inst (      
.Q(tx_dv),   // 1-bit DDR output      
.C(sclk),   // 1-bit clock input      
.CE(1'b1), // 1-bit clock enable input      
.D1(tx_en), // 1-bit data input (positive edge)      
.D2(tx_en), // 1-bit data input (negative edge)     
.R(1'b0),  // 1-bit reset     
.S(1'b0)    // 1-bit set   
); 
ODDR #(      
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"       
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1      
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC"    
) 
ODDR_CLK_inst (      
.Q(tx_clk),   // 1-bit DDR output      
.C(tx_c),   // 1-bit clock input      
.CE(1'b1), // 1-bit clock enable input      
.D1(1'b1), // 1-bit data input (positive edge)      
.D2(1'b0), // 1-bit data input (negative edge)     
.R(1'b0),  // 1-bit reset     
.S(1'b0)    // 1-bit set   
);    

genvar j;
generate
for(j=0;j<4;j=j+1) begin
ODDR #(      
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"       
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1      
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC" 
) 
ODDR_DATA_inst (      
.Q(tx_data[j]),   // 1-bit DDR output      
.C(sclk),   // 1-bit clock input      
.CE(1'b1), // 1-bit clock enable input      
.D1(tx_dat[j]), // 1-bit data input (positive edge)      
.D2(tx_dat[j+4]), // 1-bit data input (negative edge)     
.R(1'b0),  // 1-bit reset     
.S(1'b0)    // 1-bit set   
);
end 
endgenerate 

endmodule

最终得到的设计层如下图,模块的命名可以自己定。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_11,color_FFFFFF,t_70,g_se,x_16

添加约束文件

点击加号添加constrains文件

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

约束代码如下,不同板子的管脚以及电压可能不一样,看原理图就可以分配管脚、电压。

set_property IOSTANDARD LVCMOS33 [get_ports rx_clk]set_property PACKAGE_PIN J19 [get_ports rx_clk]set_property PACKAGE_PIN H22 [get_ports rx_ctrl]set_property IOSTANDARD LVCMOS33 [get_ports rx_ctrl]set_property PACKAGE_PIN K22 [get_ports {rx_dat[0]}]set_property PACKAGE_PIN K21 [get_ports {rx_dat[1]}]set_property PACKAGE_PIN J22 [get_ports {rx_dat[2]}]set_property PACKAGE_PIN J20 [get_ports {rx_dat[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[0]}]set_property PACKAGE_PIN M18 [get_ports tx_dv]set_property IOSTANDARD LVCMOS33 [get_ports tx_dv]set_property PACKAGE_PIN K18 [get_ports tx_clk]set_property IOSTANDARD LVCMOS33 [get_ports tx_clk]set_property PACKAGE_PIN M22 [get_ports {tx_d[0]}]set_property PACKAGE_PIN L18 [get_ports {tx_d[1]}]set_property PACKAGE_PIN L19 [get_ports {tx_d[2]}]set_property PACKAGE_PIN L20 [get_ports {tx_d[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[0]}]

点击左侧菜单栏的布局布线,由于工会曾比较小,大概三分钟左右就可以完成。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_8,color_FFFFFF,t_70,g_se,x_16

编辑时钟约束

打开布线设计

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_11,color_FFFFFF,t_70,g_se,x_16

然后点击编辑时序约束,添加我们所想要的时序约束,在clock中选择创建时钟,注意:如果时钟由PLL生成,这里就不需要添加时钟的约束,因为它会自动生成约束,双击打开create clock,添加一个周期为8ns的时钟,令其一开始就为高电平,如下图设置,设置完点击ok即可。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_12,color_FFFFFF,t_70,g_se,x_16

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

时钟命名完成后,选择它所对应的时钟,再点击set,最后ctrl+s保存即可。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

这时候再打开xdc文件,就可以看到多出一行约束代码,这条约束就是刚刚设置的时钟约束。

代码代表的含义

创建一个名为rx_clk的时钟,周期为8ns,再0ns时刻为上升沿,再4ns时刻为下降沿,此时钟约束对应名为rx_clk的端口。

并且,由于约束文件发生了变化,因此需要重新生成比特流文件,然后重新打开此界面。

set_property IOSTANDARD LVCMOS33 [get_ports rx_clk]set_property PACKAGE_PIN J19 [get_ports rx_clk]set_property PACKAGE_PIN H22 [get_ports rx_ctrl]set_property IOSTANDARD LVCMOS33 [get_ports rx_ctrl]set_property PACKAGE_PIN K22 [get_ports {rx_dat[0]}]set_property PACKAGE_PIN K21 [get_ports {rx_dat[1]}]set_property PACKAGE_PIN J22 [get_ports {rx_dat[2]}]set_property PACKAGE_PIN J20 [get_ports {rx_dat[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {rx_dat[0]}]set_property PACKAGE_PIN M18 [get_ports tx_dv]set_property IOSTANDARD LVCMOS33 [get_ports tx_dv]set_property PACKAGE_PIN K18 [get_ports tx_clk]set_property IOSTANDARD LVCMOS33 [get_ports tx_clk]set_property PACKAGE_PIN M22 [get_ports {tx_d[0]}]set_property PACKAGE_PIN L18 [get_ports {tx_d[1]}]set_property PACKAGE_PIN L19 [get_ports {tx_d[2]}]set_property PACKAGE_PIN L20 [get_ports {tx_d[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {tx_d[0]}]create_clock -period 8.000 -name rx_clk -waveform {0.000 4.000} [get_ports rx_clk]

时序报告

点击report timing,可以打印时序报告

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

选择100条路径,每条路径设置一个结点,点击ok

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

这时候就会有时序的报告

slack:表示建立时间的余量

level:逻辑延时等级,这里1就表示你可能在语句中加了if条件语句、case语句等逻辑语句

fanout:表示从这一点连接到了几个目的端点,fanout = 1就表示连接了1个目的端点

from to:表示是哪两者之间的时序

以及后面的有总的延时、逻辑延时等等

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

双击点开想要看的路径细节(这里点开路径42为例)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 进行时序分析

对应着数据和时钟的时序图以及两级寄存器分析。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

Summary:包含了汇总的信息量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

Source Clock Path:这部分是表示Tclk1的延时细节

从时钟的上升沿clock rx_clk rise edge到rx_clk_IBUF_inst/I 这部分表示从源时钟到IBUF走过的延时,每一路时钟都须经过IBUF,IBUF起到缓冲的作用,增加时钟的驱动力,从时序报告里看,这部分是没有延时的。

rx_clk_IBUF_inst/I ->rx_clk_IBUF_inst/O:从IBUF的输入到输出这部分是有延时的,延时是1.416ns。

rx_clk_IBUF_inst/O ->rx_clk_IBUF:这部分就是从IBUF的输出到rx_clk_IBUF部分的net,也就是布线延迟,延时是1.709。

rx_clk_IBUF_BUFG_inst/I ->rx_clk_IBUF_BUFG_inst/O,从BUFG输入到输出的延时。

最后的net布线延时1.422ns。

这些一起加起来的延时总和就是Tclk1的延时时间。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

Data Path:数据路径的延时

Prop fdre C Q:这部分是时钟端到寄存器的Q端,也就是Tco,这部分的延时是0.348ns。

net:PCB布线延时0.658ns。

加上之前的Tck1,这部分总和延时就是数据到达的时间总和。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

Destination Clock Path:数据所被要求到达的时间。

clock rx_clk rise edge:一个时钟周期的延时8ns。

rx_clk_IBUF_inst/I ->rx_clk_IBUF_inst/O:从IBUF的输入到输出这部分是有延时的,延时是1.350ns。

net:布线延时1.620ns。

rx_clk_IBUF_BUFG_inst/I ->rx_clk_IBUF_BUFG_inst/O,从BUFG输入到输出的延时0.077ns。

net:布线延时1.304ns。

clock pessimism:时钟的悲观度

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

可以看到上面的建立时间余量的公式,为了能在最糟糕的情况下建立时间能够满足,我们就让Tclk1尽可能的大,Tclk2尽可能的小,这样setup slack就会处于最小值,如果在此时最坏的情况下都能够满足建立时间按的要求,那么在其他任何情况下,都能够满足要求。

可以看到前面同样是rx_clk_IBUF_inst/I ->rx_clk_IBUF_inst/O和rx_clk_IBUF_BUFG_inst/I ->rx_clk_IBUF_BUFG_inst/O,这两条路径是时钟和数据的共同路径,但是数据到达的路径和时钟的路径所经历这段延时却是不一样的,而时钟的悲观度正是体现在这里,时钟的悲观度的值就是这两者的差值。并且并不是单一路的差值,它是综合整个系统给出的悲观度。

clock uncertainty:这个是时钟的不确定性,这个是芯片所决定的,无法计算。

ODDR(set ddr C D2):这个是最小建立时间,所以是减去。

可以验证用数据所需要到达的时间减去数据实际到达的时间就是前面summary的slack。

这个实验工程是看建立时间的时序,类似的操作可以看保持时间的时序分析。

往期系列博客:

【Xilinx Vivado时序分析/约束系列1】FPGA开发时序分析/约束-寄存器间时序分析

【Xilinx Vivado时序分析/约束系列2】FPGA开发时序分析/约束-建立时间

【Xilinx Vivado时序分析/约束系列3】FPGA开发时序分析/约束-保持时间

 

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

【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操 的相关文章

  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • ADS Via Designer 快速建模举例

    如何快速地对设计中的差分过孔进行建模 是layout前仿真中经常遇到的问题 好在目前主流的仿真软件都提供了独立的过孔建模向导 可以很方便地进行操作 本文以ADS提供的Via Designer向导为例 展示如何快速完成过孔的建模操作 以下图所
  • 548、基于51单片机的比赛计分仿真设计(简易,LCD1602,独立按键)

    毕设帮助 开题指导 技术解答 有偿 见文末 目录 一 设计功能 二 proteus仿真 三 原理图 四 程序源码 五 资料包括 一 设计功能 二 proteus仿真 三 原理图 四 程序源码 五 资料包括
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • 学习区分dB、dBm、dBuV、dBi

    dB 对于分贝的概念 很多朋友最早接触这个概念 是用 分贝 评估声音的大小 声音的大小用分贝 dB 表示 是一种对数单位 用来描述声音的强度或功率比例 如果P是我们需要测试的声压级或声功率级 P0是参考值 通常取为标准听觉阈限的声压级 X
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • C语言是否已经跟不上社会需求?

    今日话题 C语言是否已经跟不上社会需求 一个问题的提出者说 几天前他受到老板的批评 因为他只精通C语言编程 无法满足老板的需求 实际上 C语言在嵌入式行业中仍然具有极高的价值 它高效 可移植 并广泛用于嵌入式系统的开发 然而 嵌入式系统的多
  • 刚入行的嵌入式新人是否值得坚持嵌入式方向?

    今日话题 刚入行的嵌入式新人是否值得坚持嵌入式方向 如果你正在学习C语言或者嵌入式方向 坚持下去是一个明智的选择 嵌入式行业涉及硬件 技术更新相对较慢 但这为你积累宝贵的经验提供了机会 与纯软件相比 具有独特的优势 我提供了一套全面的嵌入式
  • SH367309芯片

    博主 主要纪录自己常用的几种模式 以及自己觉得需要注意的点 具体的请看数据手册 且大部分都是从数据手册中截取 1 烧写模式 VPRO管脚外接EEPROM烧写电压V PRO 且延时10mS SH367309进入烧写模式 关闭充放电MOSFET
  • 【雕爷学编程】Arduino智慧农业之养殖水质监测与控制

    Arduino是一个开放源码的电子原型平台 它可以让你用简单的硬件和软件来创建各种互动的项目 Arduino的核心是一个微控制器板 它可以通过一系列的引脚来连接各种传感器 执行器 显示器等外部设备 Arduino的编程是基于C C 语言的
  • 高速风筒方案中的共膜电感--【其利天下技术】

    我们知道 高速吹风筒的电源采用的是日常我们用的市电 市电是高压交流电源 所以高压电路的噪声是比较大的 为了使产品符合安规要求 我们的电路设计必须要符合安规设计 所以这也是高速吹风筒为什么要加安规电容和共模电感的主要原因 那么什么是共膜电感呢
  • 【Proteus仿真】【Arduino单片机】视力保护仪

    文章目录 一 功能简介 二 软件设计 三 实验现象 联系作者 一 功能简介 本项目使用Proteus8仿真Arduino单片机控制器 使LCD1602液晶 DS18B20温度传感器 按键 蜂鸣器 继电器开关 HC05蓝牙模块等 主要功能 系
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • allegro画PCB如何更新元件的PCB封装

    allegro画PCB如何更新元件的PCB封装 一 更新单个器件的PCB封装 首先菜单栏选择Place gt Update Symbols 如下图 注意此案例是更新了C0805封装 中更新封装 就将上图第二个红色方框中的勾选即可 二 更新某
  • PD SINK协议芯片系列产品介绍对比-ECP5701、FS312A、CH221K、HUSB238、AS225KL

    目录 一 ECP5701 二 FS312A 三 CH221K 四 HUSB238 五 AS225KL 在如今快节奏生活不断蔓延的背景下 人们对各种事情的处理也渐渐地开始要求在保证质量的情况下 不断加快 手机快充就是一个典型的例子 从开始的1
  • MINI-UTDE 10 BASE-T 集成控制器

    MINI UTDE 10 BASE T 集成控制器 MINI UTDE 10 BASE T 拥有多达三个本地I O板和远程I OS总线通信 为用户提供了一系列生产单元功能的单一控制点 包括诸如夹头 反馈器和辅助机器等外围生产设备 支持所有主
  • 如何正确使用RC滤波网络

    众所周知 最有效的滤波电路应靠近噪声源放置 滤波的作用是对噪声电流进行及时有效地阻止和转移 实际设计中 工程师经常使用高的串联阻抗 电阻 电感和铁氧体 阻止电流 并使用低的并联阻抗 电容 转移电流 通常情况下 我们期望滤波器可以对噪声信号衰
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573

随机推荐

  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被
  • Kali搭建DVWA——Web靶场

    博主主站地址 微笑涛声 www cztcms cn 一 DVWA介绍 1 DVWA简介 DVWA是一款基于PHP和MYSQL开发的web靶场练习平台 集成了常见的web漏洞如sql注入 XSS 密码破解等常见漏洞 旨在为安全专业人员测试自己
  • SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device

    解决中标麒麟下SDL无法打开音频设备的问题 root登录 首先就是一定要用root登录 这个可能是权限问题 否则后面实验不能成功 安装ALSA库 首先下载alsa lib https www alsa project org main in
  • [数据结构(C语言)]单链表的定义,实现初始化、创建、插入、增、删、改、查等基本操作

    建议新人收藏使用 首先 让我们回顾一下顺序表的优缺点 1 优点 随机存取 存储空间利用率高 2 缺点 插入 删除效率低 必须按事先估计的最大元素个数分配连续的存储空间 难以临时扩大 采用链式存储结构的线性表称为链表 链表有单链表 循环链表和
  • Stream流将list中对象的属性按照小时进行分组

    需求是这样的 给了一个日期时间区间 一个对象list 要统计这个时间段内每天某个小时段的数据量之和 如图 刚开始思路是把时间区间按每个小时进行拆分 得到这段时间每个小时的开始结束时间跟list对象进行比对后在进行整合计算 发现代码会很臃肿
  • python批量下载csdn文章

    声明 该爬虫只可用于提高自己学习 工作效率 请勿用于非法用途 否则后果自负 功能概述 根据待爬文章url 文章id 批量保存文章到本地 支持将文中图片下载到本地指定文件夹 多线程爬取 1 爬取效果展示 本次示例爬取的链接地址 https b
  • kafka系列——KafkaProducer源码分析

    实例化过程 在KafkaProducer的构造方法中 根据配置项主要完成以下对象或数据结构的实例化 配置项中解析出 clientId 用于跟踪程序运行情况 在有多个KafkProducer时 若没有配置 client id则clientId
  • 通过点击按钮在页面添加图片

    点击添加按钮 在盒子中加入图片 点击图片实现删除图片效果 代码如下
  • ubuntu18安装好没有gcc的真正解决方法

    之前因为一台上同时装了n个系统 导致ubuntu坏了 重装了一下 结果发现没有gcc 奇怪的是本来是有的 百度找了一下 有说用aptitude解决的 我试了一下 使用了第二个推荐方案 结果ubuntu系统完全坏了 想了一下这次安装不正确的过
  • RocketMQ源码(26)—DefaultMQPushConsumer事务消息源码【一万字】

    事务消息是RocketMQ的一大特性 其被用来实现分布式事务 关于RocketMQ的事务消息的相关原理的介绍见这篇博客 RocketMQ的分布式事务机制 事务消息 关于事务消息的基本案例看这里 消息事务样例 本文主要介绍RocketMQ的事
  • 在外远程登录局域网下的象过河ERP管理系统,无需公网IP

    文章目录 概述 1 查看象过河服务端端口 2 内网穿透 3 异地公网连接 4 固定公网地址 4 1 保留一个固定TCP地址 4 2 配置固定TCP地址 5 使用固定地址连接 转发自CSDN远程穿透的文章 公网远程访问公司内网象过河ERP系统
  • R语言读取Excel文件

    因为一个项目需要 原始数据全部是Excel文件 包括 xls和 xlsx格式 并且很多excel数据的格式并不规范 一个个转为csv格式不太现实 所以把所有能了解到的读取excel的方法都试了一遍 做个简单汇总 相关的包 RODBC xls
  • IGBT工作原理及作用

    一 IGBT是什么 IGBT Insulated Gate Bipolar Transistor 绝缘栅双极型晶体管 是由BJT 双极型三极管 和MOS 绝缘栅型场效应管 组成的复合全控型电压驱动式功率半导体器件 兼有MOSFET的高输入阻
  • condition_variable 锁

    std condition variable提供了两种 wait 函数 当前线程调用 wait 后将被阻塞 此时当前线程应该获得了锁 mutex 不妨设获得锁 lck 直到另外某个线程调用 notify 唤醒了当前线程 在线程被阻塞时 该函
  • QML 相互之间通讯 信号 槽

    QML 之间 信号与槽 方式一 对于 QML 中的属性如果其值发生改变 QML 自动会发生相关信号 on
  • 关于nlp-pyltp的基本介绍和使用

    一 下载 ltp 模型 ltp data v3 4 0 pyltp 1 ltp模型下载地址如下 https download csdn net download TFATS 12758993 2 下载pyltp如下 pip install
  • 编译linux内核成vmlinuz,内核编译之vmlinuz vmlinux system.map initrd

    一 vmlinuz vmlinuz是可引导的 压缩的内核 vm 代表 Virtual Memory Linux 支持虚拟内存 不像老的操作系统比如DOS有640KB内存的限制 Linux能够使用硬盘空间作为虚拟内存 因此得名 vm vmli
  • 使用Minitab解决Excel的限制问题

    前两天 当我在做数据转置以期获得更好分析图形的时候 我碰到了传说中excel的限制 如图 在解决这个问题的过程中 我发现了用来做数据分析 比excel更好的工具Minitab 打开minitab 把纪录数据的Excel表以File gt O
  • pageaudit 属性不正确。_浅析script 标签的 async 和 defer 属性

    每日前端夜话 第420篇 正文共 1500 字 预计阅读时间 7 分钟 前端当然要从 HTML 开始 今天来聊聊在 script 标签中加上 async defer 时的功能及差异 都明白的道理 我们都知道 浏览器解析 HTML 是一行一行
  • 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

    目录 建立工程 添加顶层 模块1 模块2 添加约束文件 编辑时钟约束 打开布线设计 代码代表的含义 时序报告 进行时序分析 Summary 包含了汇总的信息量 Source Clock Path 这部分是表示Tclk1的延时细节 Data