文档库 最新最全的文档下载
当前位置:文档库 › Xilinx_SpartanIIE 内部锁相环(DLL)的使用

Xilinx_SpartanIIE 内部锁相环(DLL)的使用

Xilinx_SpartanIIE 内部锁相环(DLL)的使用
Xilinx_SpartanIIE 内部锁相环(DLL)的使用

SpartanIIE 内部锁相环(DLL)的使用

以下是一个实验,讲述如何使用器件内部锁相环(DLL),很有实际意义,所以拿出来,大家一起学习,一起进步!

实验SpartanIIE 内部锁相环(DLL)的使用

一、实验目的

1.进一步熟悉FPGA 软硬件开发环境;

2.了解FPGA 的内部结构;

3.初步掌握DLL 的使用。

二、设计任务

FPGA 中的DLL 是一种很好的资源,特别是较高频率的时候,应用较广。它可以对时钟进行倍频、锁相等操作。通过设计掌握DLL 的各种应用:倍频,分频,锁相,以及移相的操作,编程演示,通过示波器观察和比较波形。下面先对DLL 做一个简单的介绍。

1.概述

XILINX 公司的Spartan-IIE 系列提供四个延迟锁相环(Delay-Locked Loop),分别位于芯片内部的四个脚。这些DLL 可以被用来实现一些电路以完善和简化系统级设计,比如提供零传播延迟,低时钟相位差和高级时钟区域控制等。随着FPGA 尺寸的增加,芯片上时钟的分布质量就变得越来越重要。时钟相位差和时钟延迟严重影响设备的性能,在大的设备中用传统的时钟网络控制时钟相位差和时钟延迟变得十分困难,XILINX 公司的Spartan-IIE 系列的四个延迟锁定环(Delay-Locked Loop)恰好解决了这个问题。每一个DLL 可以驱动两个全局时钟,全局时钟分布网络可以根据不同的负载,将时钟相位差最小化。通过观察一个DLL 输出时钟,它可以在网络中补偿延迟,有效的消除了设备内从外部输入端口到时钟装载的延迟。

除了根据用户的原时钟信号提供零延迟,DLL 还可以提供原时钟信号的若干倍频段。DLL 可以使时钟加倍,二倍频或四倍频。还可以对时钟信号进行分频,1.5,2,2.5,3,4,5,8,16 分频。DLL 还可以提供固定相位差的时钟,如90°、180°、270°,另外,DLL 可以被用作时钟镜像,通过驱动DLL 芯片外的输出,然后反馈,DLL 可以降低多个设备间的时钟相位差。

2.基本原理

如图4-1-1 所示,一个最简单的DLL 包括一个“variable delay line”和“control logic”. “variable delay line”产生一个输入信号CLKIN 延迟了的版本。时钟分布网络在所有内部寄存器时钟和CLKFB脚反馈时钟之间布线。“Control logic”.要检测输入时钟和反馈时钟好来调节延迟线。延迟线可以通过电压控制的延迟或一系列离散延迟成分建立。最适用于Virtex DLL 的性能的方法是使用一个离散的数字延迟线。一个DLL 的工作原理是:在输入时钟和反馈时钟中插入延迟,直到两个时钟上升沿相同,使得他们同步。在输入时钟和反馈时钟边沿在一条直线上后,DLL 锁存。电路直到DLL 锁存之后才开始初始,所

以两个时钟无区别。所以DLL 的输出时钟补偿了时钟信号在网络的分布延迟,有效的消除了源时钟和负载之间的延迟。

图片附件: 1.jpg (2005-9-25 22:39, 17.56 K)

图4-1-2 所示是XILINX 公司一个简化了的DLL 宏符号,BUFGDLL 这个宏使用快速有效的方法在设备内部提供零传播延迟的系统时钟。

图片附件: 2.jpg (2005-9-25 22:39, 27.83 K)

使用BUFGDLL 这个宏,是最简单的由外部时钟产生芯片上的零传播延迟时钟的方法。这个宏使用了IBUFG,CLKDLL,BUFG 来实现最基本的DLL 应用。I 脚提供用户源时钟,DLL 对这个时钟进行操作。对BUFGDLL 输入的源时钟必须在数据表的低频段。时钟输出O 提供已经进行了延迟补偿的时钟。这个输出时钟占空比为1:1,如需要其他占空比,可在属性中对其进行修改。需要注意的是,这个宏符号并不能用于时钟加倍或时钟分频,也不提供RESET , LOCKED 管脚。如果需要这些功能,必须使用下面的CLKDLL.CLKDLL 提供了DLL 完整的功能。当要用DLL 进行复杂应用时,通常使用CLKDLL。

图片附件: 3.jpg (2005-9-25 22:40, 15.08 K)

以下介绍各个管脚:

?源时钟输入----CLKIN: CLKIN 提供用户源时钟,CLKIN 的频率必须在数据表所列范围内。

?反馈时钟输入----CLKFB: DLL需要一个参考信号或反馈信号来提供延迟补偿输出。将DLL 的输出CLK0或CLK2X 连到反馈时钟输入CLKFB端,给DLL 提供必要的反馈。

?RESET—RST:当RST 有效时,LOCKED 信号是源时钟信号无效。RST 高电平有效,必须连在热键或直接接地。

?二倍频输出----CLK2X: CLK2X 自动提供占空比为1:1 的倍频信号。

分频输出----CLKDV:分频信号提供源信号的低频输出。CLKDV_DIVIDE 属性控制分频比,可以为1.5,2,2.5,3,4,5,8 和16。

?一倍信号输出—CLK[0|90|180|270]---CLK0 提供已经进行了延迟补偿的时钟,同时提供三个相移信号输出。

?输出锁存----LOCKED:为了完成锁存,DLL 可能要检测上千个时钟周期。当DLL 完成锁存之后,LOCKED 有效。

DLL 的输出特性如下图所示:

图片附件: 4.jpg (2005-9-25 22:40, 56.3 K)

注意:

DLL 位置限制:

器件的每个脚有一个DLL,使用时要对它进行分配。位置限制LOC 语句控制有哪个DLL 来工作。LOC 属性使用下面的形式:

INST LOC = dll。这里 是0,1,2,3。

例: INST MY_DLL LOC = dll1。

3.DLL 使用的常见问题

输入时钟的最小频率是多少?

由实验知,最小频率取决于所使用的DLL。作为时钟分频,最小频率至少是15MHz,作为时钟倍频,最少为20MHz。

我们从DLL 可以生成什么?

由XILINX 公司的APPLICATION NOTE 可知,DLL 可提供分频或倍频,以及90°、180°、270°相移的时钟信号。

并不推荐级联使用DLL!

由于DLL 对最低输入时钟频率有限制,所以多次倍频会产生高频信号,很可能导致执行工具失败。BUFG 是什么?

BUFG 是与时钟分布网络相联的全局时钟缓冲器。

如果需要发送三个时钟信号,出现:

ERROR:“ Place:1727 - Xilinx requires using

locate constraints to preplace such connected

GCLK/GCLKIO/DLL components.”

这种情况,你的UCF 文件必须清晰必须标明他们的位置。例如:

INST dll0 LOC = DLL0;

INST bg0 LOC = GCLKBUF0;

INST bg1 LOC = GCLKBUF1;

INST bg2 LOC = GCLKBUF2;

其中dll0 时你的DLL 实例的名字,bg0,bg1,bg2 时你的BUFG 实例的名字。

IBUFG 是什么?

IBUFG 是与时钟管脚相连的出入时钟缓冲器。

当DLL 锁存之后,为什么我们不能用DLLLOCK 信号RESET 系统?

因为DLL 锁存之后,DLL LOCK 信号并不能保证随时都能插入LOCK 信号。

DLL 还有其他的频率限制吗?这些频率限制

是怎样发现的?

这些限制是在仿真和硬件调试中发现的对时间仿真:i/p 频率〉=25 MHz.

对硬件调试:

时钟倍频i/p freq >= 20 MHz

时钟分频i/p freq >= 15 MHz

三、设计实现

DLL 可以实现倍频,分频,锁相,以及移相等操作,下面分别介绍这些操作的设计实现。

1.锁相

DLL 的锁相用法就是DLL 的标准用法,其原理图如下所示:

图片附件: 5.jpg (2005-9-25 22:40, 18.83 K)

【DLL 标准用法源程序】

dll_standard.v

/**********************************************

模块名称dll_standard()

模块功能锁相

输入输出

CLKIN:输入时钟

RESET:复位信号

CLK0:输出时钟

LOCKED:输出锁存信号

**********************************************/ module dll_standard (CLKIN, RESET, CLK0, LOCKED);

input CLKIN, RESET;

output CLK0, LOCKED;

wire CLKIN_w, RESET_w, CLK0_dll, LOCKED_dll;

IBUFG clkpad (.I(CLKIN), .O(CLKIN_w));

IBUF rstpad (.I(RESET), .O(RESET_w));

CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w), .CLK0(CLK0_dll), .CLK90(), .CLK180(), .CLK270(),

.CLK2X(), .CLKDV(), .LOCKED(LOCKED_dll));

BUFG clkg (.I(CLK0_dll), .O(CLK0));

OBUF lckpad (.I(LOCKED_dll), .O(LOCKED));

Endmodule

dll_standard.ucf

NET "CLKIN" LOC = "p80";

NET "CLK0" LOC = "p205";

NET "LOCKED" LOC = "p147";

NET "RESET" LOC="P3";

INST dll LOC=DLL0;

INST clkg LOC =GCLKBUF0;

2.移相

移相用法的原理图与倍频用法的原理图很类似,只用把CLK2X 输出端的输出缓存移到CLK90、CLK180 或者CLK270 端即可。这里给出的例子中输出时钟是移相

90°。

【DLL 移相用法源程序】

dll_phaseshift.v

/**********************************************

模块名称dll_phaseshift()

模块功能移相

输入输出

CLKIN:输入时钟

RESET:复位信号

CLK90:输出时钟

LOCKED:输出锁存信号

**********************************************/

module dll_phaseshift(CLKIN, RESET, CLK0, CLK90, LOCKED);

input CLKIN, RESET;

output CLK0, CLK90, LOCKED;

wire CLKIN_w, RESET_w, CLK0_dll, CLK90_dll, LOCKED_dll;

IBUFG clkpad (.I(CLKIN), .O(CLKIN_w));

IBUF rstpad (.I(RESET), .O(RESET_w));

CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w),

.CLK0(CLK0_dll), .CLK90(CLK90_dll), .CLK180(), .CLK270(),

.CLK2X(), .CLKDV(), .LOCKED(LOCKED_dll));

BUFG clkg (.I(CLK0_dll), .O(CLK0));

BUFG clk90g (.I(CLK90_dll), .O(CLK90));

OBUF lckpad (.I(LOCKED_dll), .O(LOCKED));

endmodule

dll_phaseshift.ucf

NET "CLKIN" LOC = "p80";

NET "CLK0" LOC = "p201";

NET "CLK90" LOC = "p205";

NET "LOCKED" LOC = "p145";

NET "RESET" LOC="P3";

INST dll LOC=DLL0;

INST clkg LOC = GCLKBUF0;

INST clk90g LOC = GCLKBUF1;

3.倍频

通过使用DLL 可以使源信号为50M 工作在100M。这一技术可以简化设计板的设计,因为板子上的时钟路径不用考虑高频信号。时钟加倍也提供了时域相乘的另一选择,每个时钟周期使用同一电路两次,比画两个相同电路少占面积。二倍频电路原理图如下图所示:

图片附件: 6.jpg (2005-9-25 22:40, 20.48 K)

【DLL 二倍频用法源程序】

dll_freq_mul.v

/**********************************************

模块名称dll_freq_mul()

模块功能二倍频

输入输出

CLKIN:输入时钟

RESET:复位信号

CLK2X:输出时钟

LOCKED:输出锁存信号

**********************************************/ module dll_standard (CLKIN, RESET, CLK0, CLK2X, LOCKED); input CLKIN, RESET;

output CLK0, CLK2X, LOCKED;

wire CLKIN_w, RESET_w, CLK0_dll, CLK2X_dll, LOCKED_dll; IBUFG clkpad (.I(CLKIN), .O(CLKIN_w));

IBUF rstpad (.I(RESET), .O(RESET_w));

CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w), .CLK0(CLK0_dll), .CLK90(), .CLK180(), .CLK270(),

.CLK2X(CLK2X_dll), .CLKDV(), .LOCKED(LOCKED_dll)); BUFG clkg (.I(CLK0_dll), .O(CLK0));

BUFG clk2xg (.I(CLK2X_dll), .O(CLK2X));

OBUF lckpad (.I(LOCKED_dll), .O(LOCKED));

endmodule

dll_freq_mul.ucf

NET "CLKIN" LOC = "p80";

NET "CLK0" LOC = "p201";

NET "CLK2X" LOC = "p205";

NET "LOCKED" LOC = "p145";

NET "RESET" LOC="P3";

INST dll LOC=DLL0;

INST clkg LOC = GCLKBUF0;

INST clk2xg LOC = GCLKBUF1;

通过将两个时钟加倍的DLL 串联,可以得到四倍后的时钟。其原理图如下所示:

图片附件: 7.jpg (2005-9-25 22:41, 45.37 K)

【DLL 四倍频用法源程序】

dll_freq4x.v

/**********************************************

模块名称dll_freq4x()

模块功能四倍频

输入输出

CLKIN:输入时钟

RESET:复位信号

CLK2X:二倍频时钟输出

CLK4X:四倍频时钟输出

LOCKED: 输出锁存信号

**********************************************/ module dll_standard (CLKIN, RESET, CLK2X, CLK4X, LOCKED); input CLKIN, RESET;

output CLK2X, CLK4X, LOCKED;

wire CLKIN_w, RESET_w, CLK2X_dll, CLK4X_dll, LOCKED2X;

wire LOCKED2X_delay, RESET4X;

wire logic1;

assign logic1 = 1'b1;

IBUFG clkpad (.I(CLKIN), .O(CLKIN_w));

IBUF rstpad (.I(RESET), .O(RESET_w));

CLKDLL dll2x (.CLKIN(CLKIN_w), .CLKFB(CLK2X), .RST(RESET_w), .CLK0(), .CLK90(), .CLK180(), .CLK270(),

.CLK2X(CLK2X_dll), .CLKDV(), .LOCKED(LOCKED2X));

BUFG clk2xg (.I(CLK2X_dll), .O(CLK2X));

SRL16 rstsrl (.D(LOCKED2X), .CLK(CLK2X), .Q(LOCKED2X_delay), .A3(logic1), .A2(logic1), .A1(logic1), .A0(logic1));

assign RESET4X = !LOCKED2X_delay;

CLKDLL dll4x (.CLKIN(CLK2X), .CLKFB(CLK4X), .RST(RESET4X),

.CLK0(), .CLK90(), .CLK180(), .CLK270(),

.CLK2X(CLK4X_dll), .CLKDV(), .LOCKED(LOCKED_dll));

BUFG clk4xg (.I(CLK4X_dll), .O(CLK4X));

OBUF lckpad (.I(LOCKED_dll), .O(LOCKED));

endmodule

dll_freq4x.ucf

NET "CLKIN" LOC = "P80";

NET "CLK2X" LOC = "P201";

NET "CLK4X" LOC = "P205";

NET "LOCKED" LOC = "P147";

NET "RESET" LOC = "P3";

INST dll2X LOC = DLL0;

INST dll4X LOC = DLL1;

4.分频

移相用法的原理图与倍频用法的原理图很类似,只用把CLK2X 输出端的输出缓存移到CLKDV 端即可。CLKDV_DIVIDE 属性控制分频比,可以为1.5,2,2.5,3,4,5,8 和16,其默认值是2。

【DLL 分频用法源程序】

dll_freq_div.v

/**********************************************

模块名称dll_freq_div()

模块功能分频

输入输出

CLKIN:输入时钟

RESET:复位信号

CLK2X:输出时钟

LOCKED:输出锁存信号

**********************************************/

module dll_freq_div(CLKIN, RESET, CLK0, CLKDV, LOCKED);

input CLKIN, RESET;

output CLK0, CLKDV, LOCKED;

wire CLKIN_w, RESET_w, CLK0_dll, CLKDV_dll, LOCKED_dll;

IBUFG clkpad (.I(CLKIN), .O(CLKIN_w));

IBUF rstpad (.I(RESET), .O(RESET_w));

CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w),

.CLK0(CLK0_dll), .CLK90(), .CLK180(), .CLK270(),

.CLK2X(), .CLKDV(CLKDV_dll), .LOCKED(LOCKED_dll));

BUFG clkg (.I(CLK0_dll), .O(CLK0));

BUFG clkdvg (.I(CLKDV_dll), .O(CLKDV));

OBUF lckpad (.I(LOCKED_dll), .O(LOCKED));

endmodule

dll_freq_div.ucf

NET "CLKIN" LOC = "p80";

NET "CLK0" LOC = "p201";

NET "CLKDV" LOC = "p205";

NET "LOCKED" LOC = "p145";

NET "RESET" LOC="P3";

INST dll LOC=DLL0;

INST clkg LOC = GCLKBUF0;

INST clkdvg LOC = GCLKBUF1;

四、实验仪器及设备

1.EITS2003 实验平台一块

2.并口DB25 线一条

3.带WebPack+ModelSim 开发平台PC 机一台

4.交流9V 电源一只

5.双踪示波器一台

五、实验内容及步骤

以DLL 的锁相使用为例:

1.在Xilinx WebPack 平台下,建立项目DLL,写源程序dll_standard.v;

2.进行逻辑综合验证;

3.按源程序输入dll_standard.ucf,注意要与dll_standard 模块进行关联; 4.执行Implement Design;

5.执行Generate Programmming File;

6.使用iMPACT 工具进行下载;

7.观察结果。

图片附件: 8.jpg (2005-9-25 22:41, 136.38 K)

图片附件: 9.jpg (2005-9-25 22:42, 167.2 K)

图片附件: 10.jpg (2005-9-25 22:42, 164.49 K)

六、使用示波器观察波形

1.锁相

示波器测P80:

FRE=50.06MHz PERIOD=20.05ns DUTY=51.2% RISETIME=4.9ns FALLTIME=5.2ns

示波器测P205:

FRE=50.00MHz PERIOD=20.02ns DUTY=49.6%

RISETIME=5.2ns FALLTIME=4.9ns

2.倍频

二倍频:

示波器测P205,结果如下:

FRE=101.0MHz PERIOD=9.900ns DUTY=50.5%

RISETIME=2.950ns FALLTIME=3.000ns

四倍频:

示波器测P205,结果如下:

FRE=200.0MHz PERIOD=5.000ns DUTY=47.5%

RISETIME=1.000ns FALLTIME=1.450ns

七、练习与思考

1.为什么CLKDLL 的输入输出都要加上缓存?

2.试编写16 倍频时钟的源程序。

3.CLKDLL 用作分频时,CLKDV_DIVIDE 属性控制分频比,其默认值为2,即输出时钟是二分频。如何改变参数CLKDV_DIVIDE 的值,使得输出时钟获得不同的分频?

LabVIEW调用动态链接库dll

/DE9,(:) W ??GOO &/1 ??- &/1 &DOO /LEUDU\ )XQFWLRQ 1RGH ?? ? ?? ?? ) - ) ? ) ? /LEUDU\ QDPH RU SDWK '// <+? "+? '// ??? γ I+? -/ '// ?? ?? ?) -- '// 9, ??p '//? ??p /DE9,(: ? W ??'// 1 6SHFLI\ SDWK RQ GLDJUDP - ? - - -- - /LEUDU QDPH RU SDWK ??? ?v? - # ) &/1 ?? ??? ǎ ? ? '// +? - ?9, ? '// ??p ?- ? ? - '//? ?1J ??p )XQFWLRQ QDPH c ) /DE9,(: 1'//?? . ′ ? ?- γ 7KUHDG ǎ?t ? /- ) ? J? ) ?# /DE9,(: ?? ? W -?? ? &DOOLQJ FRQYHQWLRQ ǎ ) ) ?t -/ ?t VWGFDOO < & FDOO ? ) Z ǎ VWGFDOO ) #** & FDOO ) # - ?? ) $ ? /DE9,(: ? ? t ? ? ) 8 /DE9,(: ) '// ? G? # - ?? ? :LQGRZV $3, ?? . VWGFDOO O& ? ? & FDOO 8 ? ń?BBVWGFDOO - ? p ?? VWGFDOO

?? ? ?? - . ? )? ? ǎ('//?? . ) ? -. ) ?t ?? ? ??? ? 8 (5HVHUYH - - ) ?)? ? ) - '// - ) G ) - ( ? ? ? ?> ? 8 ? ? -- '// ? " ? b) 8QUHVHUYH ? t ) $ERUW ? t 9, ? " ) 8 $ERUW ? 9,?? # ? - ? -/ ) ? '// # ??t ?? ? ? ? 3URWRW\SH IRU WKHVH SURFHGXUHV ? ? 8 ?? '// ( /DE9,(: ?? ? - )

安全培训考核合格证书式样及说明

附件1 安全培训考核合格证书式样及说明一、安全培训考核合格证书式样 安全培训考核合格证书 单位名称 员工姓名 证书编号 所属县市区 德州市安全生产监督管理局 (封皮)

姓名:性别: 彩色照片出生日期: 文化程度: 身份证号: 工作单位: 现任岗位: 证书编号: 培训考核单位:(盖章) 发证日期: (第二页)

取证及岗前培训考核记录 序培训内容学成培训日期考核日期 每年再培训考核记录 序培训内容学成培训日期考核日期 注:取证培训考核记录是指员工第一次取得本证时的培训考核记录;岗前培训考核记录是指新录用、轮岗换岗、“四新”等人员的上岗前培训考核记录;每年再培训考核记录是 (第三页)

说明 一、本证书为德州市安全生产监督管理局设计、各县(市、区)安全生产监督管理局监制,由危险化学品生产经营单位制发。 二、除主要负责人、安全生产管理人员和特种作业人员以外的其他作业人员(包括其他负责人、其他管理人员、技术人员和各岗位的工人以及临时聘用的人员)必须通过安全培训,并经考核合格,取得本证书。 三、本证书各栏目内容的填写要真实、完整,盖章后有效,不得擅自涂改。 四、安监部门监督检查时,应向安监部门出示,作为“全员培训考核、持证上岗”的依据。 (第四页)

二、安全培训考核合格证书说明 1.证书格式:尺寸大小为115mm×165mm,封皮颜色为绿色。 2.证书编号规则:共12位号码。 第1-4位为发证年份。 第5、6 行政区域代码 德城区01 陵城区02 禹城市03 乐陵市04 宁津县05 齐河县06 临邑县07 平原县08 武城县09 夏津县10 庆云县11 经济技术开发区12 运河经济开发区13 第7位为单位类型。其中,1代表危化品生产企业;2代表危化品储存企业;3代表危化品使用企业;4代表危化品经营企业。

C C++动态链接库的创建与调用

C/C++中动态链接库的创建和调用 1.动态链接库的创建步骤: 创建Non-MFC DLL动态链接库 1.打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2.新建一个.h文件DllDemo.h 并添加如下代码: #ifdef DllDemo_EXPORTS #define DllAPI _declspec(dllexport) #else #define DllAPI _declspec(dllimport) extern “C” // 原样编译 { DllAPI int _stdcall Max(int a,int b); //_stdcall使非C/C++语言内能够调用API } #endif 3.新建一个.cpp文件,并添加如下代码 #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; } 4.编译程序生成动态链接库 1.2 用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程中的DllDemo.h文件。 2、在DllDemo.cpp文件头,删除#include DllDemo.h语句。 3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句: LIBRARY MyDll EXPORTS Max@1 4、编译程序生成动态连接库。 2.动态链接库的调用步骤 2.1 隐式调用 1.建立DllCnsTest工程 2.将文件DllDemo.dll、DllDemo.lib拷贝到DllCnsTest工程所在的目录 3.在DllCnsTest中添加如下语句: #define DllAPI _declspec(dllimport) #pragma comment(lib,”DllDemo.lib”) extern “C” { DllAPI int _stdcall Max(int a,int b);

锁相环原理及应用

锁相电路(PLL)及其应用 自动相位控制(APC)电路,也称为锁相环路(PLL),它能使受控振荡器的频率和相位均与输入参考信号保持同步,称为相位锁定,简称锁相。它是一个以相位误差为控制对象的反馈控制系统,是将参考信号与受控振荡器输出信号之间的相位进行比较,产生相位误差电压来调整受控振荡器输出信号的相位,从而使受控振荡器输出频率与参考信号频率相一致。在两者频率相同而相位并不完全相同的情况下,两个信号之间的相位差能稳定在一个很小的围。 目前,锁相环路在滤波、频率综合、调制与解调、信号检测等许多技术领域获得了广泛的应用,在模拟与数字通信系统中已成为不可缺少的基本部件。 一、锁相环路的基本工作原理 1.锁相环路的基本组成 锁相环路主要由鉴频器(PD)、环路滤波器(LF)和压控振荡器(VCO)三部分所组成,其基本组成框图如图3-5-16所示。 图1 锁相环路的基本组成框图 将图3-5-16的锁相环路与图1的自动频率控制(AFC)电路相比较,可以看出两种反馈控制的结构基本相似,它们都有低通滤波器和压控振荡器,而两者之间不同之处在于:在AFC环路中,用鉴频器作为比较部件,直接利用参考信号的频率与输出信号频率的频率误差获取控制电压实现控制。因此,AFC系统中必定存在频率差值,没有频率差值就失去了控制信号。所以AFC系统是一个有频差系统,剩余频差的大小取决于AFC系统的性能。 在锁相环路(PLL)系统中,用鉴相器作为比较部件,用输出信号与基准信号两者的相位进行比较。当两者的频率相同、相位不同时,鉴相器将输出误差信号,经环路滤波器输出

控制信号去控制VCO ,使其输出信号的频率与参考信号一致,而相位则相差一个预定值。因此,锁相环路是一个无频差系统,能使VCO 的频率与基准频率完全相等,但二者间存在恒定相位差(稳态相位差),此稳态相位差经鉴相器转变为直流误差信号,通过低通滤波器去控制VCO ,使0f 与r f 同步。 2.锁相环路的捕捉与跟踪过程 当锁相环路刚开始工作时,其起始时一般都处于失锁状态,由于输入到鉴相器的二路信号之间存在着相位差,鉴相器将输出误差电压来改变压控振荡器的振荡频率,使之与基准信号相一致。锁相环由失锁到锁定的过程,人们称为捕捉过程。系统能捕捉的最大频率围或最大固有频带称为捕捉带或捕捉围。 当锁相环路锁定后,由于某些原因引起输入信号或压控振荡器频率发生变化,环路可以通过自身的反馈迅速进行调节。结果是VCO 的输出频率、相位又被锁定在基准信号参数上,从而又维持了环路的锁定。这个过程人们称为环路的跟踪过程。系统能保持跟踪的最大频率围或最大固有频带称为同步带或同步围,或称锁定围。 捕捉过程与跟踪过程是锁相环路的两种不同的自动调节过程。 由此可见,自动频率控制(AFC )电路,在锁定状态下,存在着固定频差。而锁相环路控制(PLL )电路,在锁定状态下,则存在着固定相位差。虽然锁相环存在着相位差,但它和基准信号之间不存在频差,即输出频率等于输入频率.这也表明,通过锁相环来进行频率控制,可以实现无误差的频率跟踪.其效果远远优于自动频率控制电路. 3.锁相环路的基本部件 1)鉴相器(PD —Phase Detector ) 鉴相器是锁相环路中的一个关键单元电路,它负责将两路输入信号进行相位比较,将比较结果从输出端送出。 鉴相器的电路类型很多,最常用的有以下三种电路. (1)模拟乘法器鉴相器,这种鉴相器常常用于鉴相器的两路输入信号均为正弦波的锁相环电路中。 (2)异或门鉴相器,这种鉴相器适合两路输入信号均为方波信号的锁相环电路中,所以异或门鉴相器常常应用于数字电路锁相环路中。 (3)边沿触发型数字鉴相器,这种鉴相器也属于数字电路型鉴相器,对输入信号要求不严,可以是方波,也可以是矩形脉冲波.这种电路常用于高频数字锁相环路中。 图2 是异或门鉴相器的鉴相波形与鉴相特性曲线。

HSE培训中心证书管理制度

HSE培训中心证书管理制度 第一章总则 第一条为进一步推动HSE培训管理工作,加强HSE培训中心(以下简称中心)证书规范化管理,维护中心证书发放的权威性和严肃性,特制定本制度。 第二条本制度适用于经中心认证发放的所有证书,其证书类型主要有培训合格证、资质认定证等。 第二章管理职责 第三条中心职责: (一)中心负责除安监局统一发放的证书之外的培训合格证书的设计、印刷、制作、发放、登记、存档等; (二)中心负责证书使用过程的管理,如:监督、升级、降级、暂停或注销等; (三)中心对伪造、篡改证书等违纪行为提出处理意见,有权撤销证书资格,并追究相关单位及人员的责任。 第四条人员职责: (一)安全环保与技术监督研究院负责培训管理的主管领导负责各类证书的批准签发; (二)中心负责人负责对证书信息进行审核,对证书的使用情况进行监督管理; (三)综合管理岗负责空白证书的印刷、存放和已发放证书的登记归档; (四)培训班班主任负责该班证书的申领、制作、发放、修改、增/补和提供证书归档的信息。 第三章空白证书管理 第五条国家安监总局或四川省安监局统一印制的相关安全管理、特种作业、培训资格证的证书由中心派专人到四川省安监局领取空白证书。

第六条培训中心自行设计制作的相关合格证,报上级主管部门备案后印制,并由专人负责管理。 第七条空白证书应由综合管理岗进行统一管理,并建立账簿锁于保险柜中。领取时,按要求填写《HSE培训空白证书领取登记表》(参见附件1),避免证书遗失。 第三章证书发放程序 第八条中心证书发放按照以下程序管理: (一)申领空白证书 a)在考核成绩发布后5个工作日内,班主任填写《HSE培训中心证书申领审批表》(参见附件2,以下简称审批表); b)审批表后应附上参训学员信息表及考试成绩汇总表(参见附件2-1,2-2); c)审批表及两个附表由中心主任审核通过后,交由安全环保与技术监督研究院负责培训管理的主管领导审核,审核合格后签字批准; d)班主任在空白证书管理人员处领取空白证书,并做好领取登记。 (二)制作证书 a)班主任领取空白证书后15个工作日内,应将证书制作完成; b)证书盖章执行《用章管理制度》。 C)如证书在制作过程中,出现错误需作废的证书应在综合管理岗处加印作废章,统一销毁。 (三)发放证书 班主任负责证书发放,并做好发放记录,按要求填写好《HSE培训中心证书发放记录表》(参见附件3)。 (四)登记存档

VC++动态链接库创建和调用全过程详解

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。

锁相环的基本原理和模型

1.锁相环的基本原理和模型 在并网逆变器系统中,控制器的信号需要与电网电压的信号同步,锁相环通过检测电网电压相位与输出信号相位之差,并形成反馈控制系统来消除误差,达到跟踪电网电压相位和频率的目的。一个基本的锁相环结构如图1-1所示,主要包括鉴相器,环路滤波器,压控振荡器三个部分。 图1-1 基本锁相环结构 鉴相器的主要功能是实现锁相环输出与输入的相位差检测;环路滤波器的主要作用应该是建立输入与输出的动态响应特性,滤波作用是其次;压控振荡器所产生的所需要频率和相位信息。 PLL 的每个部分都是非线性的,但是这样不便于分析设计。因此可以用近似的线性特性来表示PLL 的控制模型。 鉴相器传递函数为:)(Xo Xi Kd Vd -= 压控振荡器可以等效为一个积分环节,因此其传递函数为:S Ko 由于可以采用各种类型不同的滤波器(下文将会讲述),这里仅用)(s F 来表示滤波器的传递函数。 综合以上各个传递函数,我们可以得到,PLL 的开环传递函数,闭环传递函数和误差传递函数分别如下: S s F K K s G d o op )()(=,)()()(s F K K S s F K K s G d o d o cl +=,) ()(s F K K S S s H d o += 上述基本的传递函数就是PLL 设计和分析的基础。 2.鉴相器的实现方法 鉴相器的目的是要尽可能的得到准确的相位误差信息。可以使用线电压的过零检测实现,但是由于在电压畸变的情况下,相位信息可能受到严重影响,因此需要进行额外的信号处理,同时要检测出相位信息,至少需要一个周波的时间,动态响应性能可能受到影响。 一般也可以使用乘法鉴相器。通过将压控振荡器的输出与输入相乘,并经过一定的处理得到相位误差信息。 在实际的并网逆变器应用中还可以在在同步旋转坐标系下进行设计,其基本的目的也是要得的相差的数值。同步旋转坐标系下的控制框图和上图类似,在实际使用中,由于pq 理论在电网电压不平衡或者发生畸变使得性能较差,因而较多的使用dq 变换,将采样得到的三相交流电压信号进行变化后与给定的直流参考电压进行比较。上述两种方法都使用了近似,利用在小角度时正弦函数值约等于其角度,因而会带来误差,这个误差是人为近似导致的误差,与我们要得到的相位误差不是一个概念,最终的我们得到相位误差是要形成压控振荡器的输入信号,在次激励下获得我们所需要的频率和相位信息。 2.1乘法鉴相器

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用 一.实验目的 1.熟悉LabVIEW调用动态链接库的过程 2.学会编写用LabVIEW调用WINDOWS的API函数 二.实验器材 1.计算机(带有声卡) 2.LABVIEW8.20软件 三.实验原理 在开发自动测量系统时,经常遇到计算机与仪器的通信问题,涉及仪器控制及数据处理问题,LabVIEW语言在这一领域的应用有着独到的优势。为了在LabVIEW中能够充分利用其他编程语言的优势,LabVIEW提供了外部程序接口能力,包括动态链接库(DLL)、C语言接口(CIN)、ActiveX和Matlab等。 动态链接库是基于Windows程序设计的一个非常重要的组成部分。LabVIEW 开发中使用DLL,可以使代码更简洁,内存资源的使用更经济,而且可以便捷地利用仪器厂商或第三方提供的仪器控制子程序加速开发进程。而windows平台包含有大量的API函数,这些API函数提供了大量在Windows环境下可操作的功能,它们位于Windows系统目录下的多个DLL文件中,因此在LabView中调用API 函数和DLL的方法是一致的。 在LabVIEW中,利用库函数节点可以较容易地实现对DLL的调用,从而提高了程序的开发效率。使用调用库函数节点,可以调用Windows标准的动态连接库,也可以调用用户自己编制的DLL。LabView中动态链接库的调用可在程序框图的函数选板中选取“调用库函数节点”来完成,该节点位于:互连接口->库和可执行程序->调用库函数节点。

将选择好的调用库函数节点图标放在程序框图中,然后通过对它的节点图标进行配置,可以指定DLL模块中与LabVIEW数据交换的相应的驱动函数。 在调用DLL时,首先要找到找到头文件(*.h)或者函数原型声明,确定你需要调用的函数,注意函数的参数是否包含了原始数据类型参数比如int,char, double,等等或者是否包含了复杂数据类型比如clusters。如果函数没有包含复杂数据类型并且你有头文件(*.h),该DLL在数据类型的定义上与LabView一致,那么LabVIEW中一个很好的工具可以帮你简单地导入DLL(并且会帮助你创建DLL的整个库)。你可以在工具—>导入—>共享库(.dll)...中找到该工具,按照向导进行下去。 如果函数不含有复杂数据类型但是没有头文件(*.h),或者由于DLL编写不够规范,在数据类型的定义上与LabView并不完全一致,你需要确定那些在DLL 中被调用的函数的参数,一旦参数被确定,使调用库函数节点中的函数手动调用该函数。这是你需要对调用的函数进行手工配置。 在调用DLL库中函数时,必须知道以下信息:函数返回的数据类型、函数调用的方式、函数的参数及类型、DLL库文件的位置等。右键单击调用库函数图标,在弹出的菜单选项中选择配置...选项,可得到下图所示的配置对话框。

认证培训方案设计设计.doc

实用标准文案 服装设计专业认证培训方案 根据专业职业岗位和职业能力要求,并结合目前的服装艺术设计实习实训基地构建了示范性产学结合、工学结合的认证培训模式。在调研分析专业各职业岗位(群)应具备的知识、能力、素质的基础上,制定科学可行的认证培训目标、计划及方法;认证培训教学大纲; 认证培训环节;专业技能认证培训方案;专业技能教学方法认证培 训方案;认证培训考核方案和认证培训质量管理方案等。其中认证 培训大纲主要突出专业技能培训、专业技能教学法培训等内容。 根据专业认证培训要求,以市场需求为依据,构建项目导向单元能力模块化。构建体现高职教育类型特征的、符合专业技能教学要求的认证培训方案。 一、模块化认证培训方案构成 服装设计专业模块化认证培训方案按职业技能等级分为初、中、 高三个层次。服装设计专业在调研分析专业各职业岗位(群)应具 备的知识、能力、素质的基础上,将实习实训模块设有设计岗位能力 模块(梭织方向、针织方向)、制版岗位能力模块、服装生产管理岗位能力模块、服装营销岗位能力模块、服装品牌设计与企划能力模块、顶岗实习能力模块等7 个项目导向工学模块,每个岗位能力模块认证培训方案(高级)的构成主要包括:学员专业技能培训模块、教师专 业技能教学法培训模块、学员认证培训考核模块和学员认证培训管理

模块四大模块组成。通过认证培训,进一步加强学员职业道德、职业环境以及职业相关法律法规等职业素养;进一步提升和更新学员岗位的 实践操作专业技能;学员通过对相关技能的基础知识和操作考核,获取“服装设计员高级证书” 。整个方案由校企共同组织实施。 服装设计专业学员模块化认证培训方案(高)级如图所示: 学员专业技能培训模块包括设计岗位能力模块(梭织方向)、设计岗位能力模块(针织方向)、制版岗位能力模块、服装生产组织管理能力模块、服装营销岗位能力模块、服装品牌设计与企划模块、顶岗实习能力模块。各模块分别对应相关专业技能,通过校企合作,工学结合,强调“教学做合一”的培训理念,强调“工学结合”的培训过程,强调学员专业技能的培养,提高学员专业技能,从而达到模块化教学的要求。 教师专业技能教学法培训模块包括实践教学法模块和职业素养

VC++ MFC DLL动态链接库编写详解

VC++ MFC DLL动态链接库编写详解(2008-07-10 17:38:40) 标签:it分类:com技术然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型 使用VC++可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DLL 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。 Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。 2、常规DLL 使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。 当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 二、建立DLL 利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL,这里就不多讲了,主要的任务是如何给DLL添加功能,以及在客户程序中利用这个DLL 1、导出类 用向导建立好框架后,就可以添加需要导出类的.cpp .h文件到DLL中来,或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类,在类声明的时候要加“_declspe c(dllexport)”,如:

锁相环的组成和工作原理

锁相环的组成和工作原理 时间:2011-11-23 来源:作者: 关键字:锁相环工作原理 1.锁相环的基本组成 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。 锁相环路是一种反馈控制电路,简称锁相环(PLL)。锁相环的特点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。 因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。 锁相环通常由鉴相器(PD)、环路滤波器(LF)和压控振荡器(VCO)三部分组成,锁相环组成的原理框图如图8-4-1所示。锁相环中的鉴相器又称为相位比较器,它的作用是检测输入信号和输出信号的相位差,并将检测出的相位差信号转换成uD(t)电压信号输出,该信号经低通滤波器滤波后形成压控振荡器的控制电压uC(t),对振荡器输出信号的频率实施控制。 2.锁相环的工作原理 锁相环中的鉴相器通常由模拟乘法器组成,利用模拟乘法器组成的鉴相器电路如图8-4-2所示。 鉴相器的工作原理是:设外界输入的信号电压和压控振荡器输出的信号电压分别为: 式中的ω0为压控振荡器在输入控制电压为零或为直流电压时的振荡角频率,称为电路的固有振荡角频率。则模拟乘法器的输出电压uD为: 用低通滤波器LF将上式中的和频分量滤掉,剩下的差频分量作为压控振荡器的输入控制电压uC(t)。即uC(t)为:

式中的ωi为输入信号的瞬时振荡角频率,θi(t)和θO(t)分别为输入信号和输出信号的瞬时位相,根据相量的关系可得瞬时频率和瞬时位相的关系为: 上式等于零,说明锁相环进入相位锁定的状态,此时输出和输入信号的频率和相位保持恒定不变的状态,uc(t)为恒定值。当上式不等于零时,说明锁相环的相位还未锁定,输入信号和输出信号的频率不等,uc(t)随时间而变。 因压控振荡器的压控特性如图8-4-3所示,该特性说明压控振荡器的振荡频率ωu以ω0为中心,随输入信号电压uc(t)的变化而变化。该特性的表达式 上式说明当uc(t)随时间而变时,压控振荡器的振荡频率ωu也随时间而变,锁相环进入“频率牵引”,自动跟踪捕捉输入信号的频率,使锁相环进入锁定的状态,并保持ω0=ωi的状态不变。 8.4.2锁相环的应用 1.锁相环在调制和解调中的应用 (1)调制和解调的概念 为了实现信息的远距离传输,在发信端通常采用调制的方法对信号进行调制,收信端接收到信号后必须进行解调才能恢复原信号。 所谓的调制就是用携带信息的输入信号ui来控制载波信号uC的参数,使载波信号的某一个参数随输入信号的变化而变化。载波信号的参数有幅度、频率和位相,所以,调制有调幅(AM)、调频(FM)和调相(PM)三种。 调幅波的特点是频率与载波信号的频率相等,幅度随输入信号幅度的变化而变化;调频波的特点是幅度与载波信号的幅度相等,频率随输入信号幅度的变化而变化;调相波的特点是幅度与载波信号的幅度相等,相位随输入信号幅度的变化而变化。调幅波和调频波的示意图如图8-4-4所示。

LabVIEW与外部程序间DLL文件的调用

LabVIEW与外部程序间DLL文件的调用 什么是DLL文件 DLL(动态链接库)文件是Dynamic Link Library的缩写形式,是一种允许程序共享执行特殊任务所必需的代码和其他资源的可执行文件。其多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。Windows提供的DLL文件中包含了允许基于Windows 的程序在Windows环境下操作的许多函数和资源。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。这些函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源,多个应用程序可同时访问内存中单DLL副本的内容。总之,DLL是一个包含可由多个程序同时使用的代码和数据的库。动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。 由于向运行于Windows操作系统下的程序提供代码、数据或函数,程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。在Windows操作系统中,DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用,因此程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多,DLL文件也就会越来越多, 如果当删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。 通过使用DLL,程序可以实现模块化,由相对独立的组件组成。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,可能有一个工资计算程序,税率每年都会更改,当这些更改被隔离到DLL中以后,我们无需重新生成或安装整个程序就可以应用更新。 总的来说,使用DLL文件有以下好处:1、多个应用程序可以共享代码和数据。比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态链接库实现的。2、在钩子程序过滤系统消息时必须使用动态链接库。3、动态链接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作,而且各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态链接库中,供其他成员使用。4、实现应用程序的国际化,往往需要使用动态链接库。使用动态链接库可以将针对某一国家、语言的信息存放在其中。例如,在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态链接库实现的。对于不同的版本,使用不同的动态链接库,常用的一些编程软件均可以编写DLL文件。DLL 不是独立运行的程序,而是某个程序的一个部分,它只能由所属的程序调用,用户不能,也不需要打开它。 LabVIEW调用DLL文件

演练:创建和使用动态链接库 (C++)

Visual C++ 指导教程 演练:创建和使用动态链接库(C++) Visual Studio 2010 其他版本 0(共1)对本文的评价是有帮助评价此主题 我们将创建的第一种类型的库是动态链接库(DLL)。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。 本演练涵盖以下内容: ?创建新的动态链接库(DLL) 项目。 ?向动态链接库添加类。 ?创建引用动态链接库的应用程序。 ?在控制台应用程序中使用类库的功能。 ?运行应用程序。 系统必备 本主题假定您具备C++ 语言的基础知识。如果您是刚开始学习C++,建议您参阅Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从 https://www.wendangku.net/doc/f510983788.html,/fwlink/?LinkId=115303在线获得。 创建新的动态链接库(DLL) 项目 1.从“文件”菜单中,选择“新建”,然后选择“项目…”。 2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。 3.在“模板”窗格中,选择“Win32 控制台应用程序”。 4.为项目选择一个名称,如MathFuncsDll,并将其键入“名称”字段。为解决方案选择一个名 称,如DynamicLibrary,并将其键入“解决方案名称”字段。 5.单击“确定”启动Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中, 单击“下一步”。

6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果 可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。 7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。 8.单击“完成”创建项目。 向动态链接库添加类 1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中选择“头文件(.h)”。为 头文件选择一个名称,如MathFuncsDll.h,并单击“添加”。将显示一个空白文件。 2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代 码应与以下内容类似: 复制 // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, dou ble b); // Returns a * b static __declspec(dllexport) double Multiply(double a, dou ble b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, doubl e b); }; } 3.请注意此代码方法声明中的__declspec(dllexport)修饰符。这些修饰符使DLL 能够导出 该方法以供其他应用程序使用。有关更多信息,请参见dllexport, dllimport。

什么是培训合格证书,培训合格证书有什么用

什么是培训合格证书 1、概念 根据相关规定,在国家职业资格目录清单内的职业(工种),须经职业技能鉴定,取得相应职业资格证书后,凭职业资格证书申请培训补贴。在目录清单内且国家公布 实施职业技能等级认定制度的职业(工种),凭职业技能等级证书享受培训补贴。在 国家职业资格目录清单外且在该地《省职业培训补贴标准目录》内的职业(工种), 由培训机构自行组织开展理论考试和实际操作考核。结业考核结束后 5 个工作日内, 培训机构应向办班审核部门提交结业考核结果,内容包括:考场负责人、考场学员签 到册、考试试卷、考试成绩等。经办班审核部门确后5 个工作日内,培训机构再向相 应就业服务部门提交《职业培训合格证书核发名册》(附件 7)及电子数据,经就业 服务部门备案后上网生成证书编号。《职业培训合格证书》由培训机构自行印制,并 按要求发放。 2、级别 培训合格证一般不分等级。 3、培训合格证书有哪些效用及局限性 3.1培训合格证是劳动者参加职业技能培训,完成相应培训任务并达到合格水平的 证明。 3.2对符合条件的从业人员,按规定落实相关补贴政策。培训合格证书一般按初级标准享受相关补贴政策,部分地方按初级的50%标准享受补贴政策。 3.3 局限性:培训合格证书都是由培训机构考核颁发,没有查询网站,严重缺乏公信力与可信度,同时也缺乏流通性,用人单位不太认可。同时,因职业技能等级证书

与专项职业能力证书将逐步推行,培训合格证书将慢慢萎缩。再则,培训证书一般不分级别,参照初级标准执行补贴政策。 4、鉴定评价实施单位、证书颁发单位暨证书用章及证书查询网站 培训合格证书考核的实施主体是培训机构。证书由省级人社部门提供参考式样,由培训机构自行制作、用章、颁发。人社部门一般没有为培训证书提供查询网站。

(完整版)锁相环工作原理

基本组成和锁相环电路 1、频率合成器电路 频率合成器组成: 频率合成器电路为本机收发电路的频率源,产生接收第一本机信号源和发射电路的发射信号源,发射信号源主要由锁相环和VCO电路直接产生。如图3-4所示。 在现在的移动通信终端中,用于射频前端上下变频的本振源(LO),在射频电路中起着非常重要的作用。本振源通常是由锁相环电路(Phase-Locked Loop)来实现。 2.锁相环: 它广泛应用于广播通信、频率合成、自动控制及时钟同步等技术领域 3.锁相环基本原理: 锁相环包含三个主要的部分:⑴鉴相器(或相位比较器,记为PD或PC):是完成相位比较的单元,用来比较输入信号和基准信号的之间的相位.它的输出电压正比于两个输入信号之相位差.⑵低通滤波器(LPF):是个线性电路,其作用是滤除鉴相器输出电压中的高频分量,起平滑滤波的作用.通常由电阻、电容或电感等组成,有时也包含运算放大器。⑶压控振荡器(VCO):振

荡频率受控制电压控制的振荡器,而振荡频率与控制电压之间成线性关系。在PLL中,压控振荡器实际上是把控制电压转换为相位。 1、压控振荡器的输出经过采集并分频; 2、和基准信号同时输入鉴相器; 3、鉴相器通过比较上述两个信号的频率差,然后输出一个直流脉冲电压; 4、控制VCO,使它的频率改变; 5、这样经过一个很短的时间,VCO 的输出就会稳定于某一期望值。 锁相环电路是一种相位负反馈系统。一个完整的锁相环电路是由晶振、鉴相器、R分频器、N分频器、压控振荡器(VCO)、低通滤波器(LFP)构成,并留有数据控制接口。 锁相环电路的工作原理是:在控制接口对R分频器和N分频器完成参数配置后。晶振产生的参考频率(Fref)经R分频后输入到鉴相器,同时VCO的输出频率(Fout)也经N分频后输入到鉴相器,鉴相器对这两个信号进行相位比较,将比较的相位差以电压或电流的方式输出,并通过LFP滤波,加到VCO的调制端,从而控制VCO的输出频率,使鉴相器两输入端的输入频率相等。 锁相环电路的计算公式见公式: Fout=(N/R)Fref 由公式可见,只要合理设置数值N和R,就可以通过锁相环电路产生所需要的高频信号。 4.锁相环芯片 锁相环的基准频率为13MHz,通过内部固定数字频率分频器生成5KHz或6.25KHz的参考频率。VCO振荡频率通过IC1 内部的可编程分频器分频后,与基准频率进行相位比较,产生误差控制信号,去控制VCO,改变VCO的振荡频率,从而使VCO输出的频率满足要求。如图3-5所示。 N=F VCO/F R N:分频次数 F VCO:VCO振荡频率

LabVIEW编程调用DLL时遇见的问题

LabVIEW编程调用DLL时遇见的问题 对于使用LabVIEW编程的人来说,都知道LabVIEW功能强大,但也会发现似乎缺少某些功能,而像其他编程语言的DLL、ActiveX组件则能提供。 在使用DLL(动态链接库)时,最大的困难就是把函数参数的数据类型映射为相应的LabVIEW中的数据类型。LabVIEW 提示: 未定义符号可能会造成函数和参数无法被识别。如要解决该问题,检查头文件并确定是否必须添加预定义符号。单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")在一次进行串口调试软件的编写过程中,要求使用动态链接库(其实使用VISA同样可以实现),使用导入共享库工具以自动生成配置CLN(Call Library Function)节点,工具在“工具—导入—共享库(.dll)”菜单项下,专门用于将DLL 中函数包装成VI。 下一步下一步点击解析头文件后,依然遇见(如下图) extern UINT Recv(UCHAR *pRecvBytes,UINT unRecvLength);(函数原型) 未定义符号可能会造成函数和参数无法被识别。如要解决该问题,检查头文件并确定是否必须添加预定义符号。单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")

归咎原因就是头文件中的一些类型定义不符合标准C语法,而使解析器无法获得正确的的mPWIN32_COMMAND定义。DLL函数的头文件中可能使用了某个系统定义的数据类型,数据类型的定义在windows.h中,(windows.h是Windows SDK的一个文件,VC等开发环境中常常带有Windows SDK),要正确解析必须得到这些数据类型,也就是找到windows.h 这个头文件,用户须把windows.h文件的全路径加在“包括路径”中。例如Visual C++6.0编译环境中头文件位于安装目录下VC98文件夹下的Include文件中。 而“预处理定义”中,当用户需要写一些宏定义,那么就写在这个位置。 在网络上看到在预处理定义中添加了如下代码 ULONG = unsigned long; VOID = void; LONG = long; UCHAR = unsigned char; PUCHAR = unsigned char*; PULONG = unsigned long*; WINAPI; BOOL = bool; USHORT = unsigned short; PUSHORT = unsigned short*; 点击下一步也不会遇到上述问题,导入工具会帮助你解析出全部导出函数并自动生成VI。

相关文档
相关文档 最新文档