版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第1讲:FPGA基础概念——卓越工程师培养系列——2目录什么是FPGA?应用场景基本结构数据存储及配置方式开发流程HDL语言《医用FPGA开发实用教程》-配套讲义3FPGA(Field-ProgrammableGateArray)又称为现场可编程门阵列,是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物,是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数量有限的缺点。简而言之,FPGA就是一个可以通过编程来改变内部结构的芯片。如果把FPGA比作是许多逻辑门的集合体,对FPGA的编程便可以看做是对数字电路芯片的开发。我们只要设计各个门之间的连接方式,就可以将FPGA芯片变成我们需要的数字电路。1.什么是FPGA?《医用FPGA开发实用教程》-配套讲义4FPGA在通信、数字信号处理、嵌入式、安防监控、工业自动化等很多领域中都有应用,其中,应用最广的是在通信领域,一方面通信领域需要高速的通信协议处理方式,另一方面通信协议随时在修改,非常不适合做成专门的芯片。因此能够灵活改变功能的FPGA就成为了首选,到目前为止FPGA一半以上的应用也是在通信行业。2.应用场景《医用FPGA开发实用教程》-配套讲义5FPGA芯片主要由6部分组成:可编程输入输出单元基本可编程逻辑单元完整的时钟管理模块嵌入式块RAM丰富的布线资源底层嵌入式功能单元3.基本结构《医用FPGA开发实用教程》-配套讲义6可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电器标准与I/O物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整输出驱动电流的大小等。3.基本结构《医用FPGA开发实用教程》-配套讲义3.1可编程输入输出单元(IOB)7
FPGA的基本可编程逻辑单元是由查找表(LUT)和寄存器(Register)组成的,查找表完成纯组合逻辑功能;寄存器则完成同步时序逻辑功能,FPGA内部寄存器可配置为带同步/异步复位和置位、时钟使能的触发器,也可以配置成为锁存器。
一般来说,基本可编程单元的配置是一个寄存器加一个查找表,查找表和寄存器的组合方式不同,是各个FPGA家族之间区别的重要依据,并且查找表本身的结构也可能各不相同。3.基本结构3.2基本可编程逻辑单元(CLB)《医用FPGA开发实用教程》-配套讲义8FPGA可编程的特性决定了只能采用一种可以重复配置的结构来实现数字逻辑,而查找表(LUT)可以很好地满足这一要求,目前主流的FPGA芯片便是基于SRAM工艺的查找表结构。查找表(Look-Up-Table)简称为LUT,其本质上就是一个RAM。目前FPGA内部中多使用4输入的LUT,每一个LUT可以看成一个有4位地址线的RAM。当通过原理图或硬件描述语言设计了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM中。这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查找表操作,通过地址找到对应的RAM中的结果,最后将其输出。3.基本结构3.2.1查找表(LUT)
《医用FPGA开发实用教程》-配套讲义9FPGA器件的时钟信号源一般来自外部,我们通常使用晶体振荡器(简称晶振)产生时钟信号。一些规模较大的FPGA器件内部会有可以对时钟信号进行倍频或分频的专用时钟管理模块,如PLL或DLL。在实际应用中,FPGA器件内部使用的时钟信号往往不只是供给单个寄存器使用,成百上千甚至更多的寄存器很可能共用一个时钟源,那么从时钟源到不同寄存器间的延时也可能存在较大偏差(通常称为时钟网络延时)。为此,FPGA器件内部设计了一些称之为“全局时钟网络”的走线池。通过这种专用时钟网络走线,同一时钟到达不同寄存器的时间差可以被控制到很小的范围内。3.基本结构3.3完整的时钟管理模块《医用FPGA开发实用教程》-配套讲义10大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器(CAM)以及FIFO等常用存储结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。3.基本结构3.4嵌入式块RAM(BRAM)《医用FPGA开发实用教程》-配套讲义11布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别:全局布线资源、长线资源、短线资源及分布式的布线资源。在实际中我们不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。3.基本结构3.5丰富的布线资源《医用FPGA开发实用教程》-配套讲义12底层嵌入功能单元是指通用程度较高的嵌入式功能模块。如能够实现时钟倍频和分频、调整占空比和移相的PLL(PhaseLockedLoop,锁相环)及DLL(DelayLockedLoop)、DSP(DigitalSignalProcessing)、乘法器和CPU等。3.基本结构3.6底层嵌入式功能单元《医用FPGA开发实用教程》-配套讲义134.数据存储及配置方式《医用FPGA开发实用教程》-配套讲义4.1数据存储在FPGA内部存在着存储单元片内RAM块,数据是存放在RAM中并由其来设置工作状态的,若想要FPGA进行工作,就需要对片内RAM进行编程。目前,主流的FPGA都是基于SRAM工艺的,由于SRAM掉电就会丢失内部数据,因此往往都会外接一个能够掉电保存数据的片外存储器以保存程序。这样一来,上电时FPGA便将外部存储器中的数据读入片内RAM以完成配置,对FPGA编程完成后便进入工作状态;掉电后FPGA内部SRAM中存储的数据丢失,逻辑清零。以这种方式配置FPGA不仅能反复使用,还无需重复的手动配置。完成一次主动配置之后每次上电便会自动的实现FPGA的内部编程。144.数据存储及配置方式《医用FPGA开发实用教程》-配套讲义4.2配置方式通过不同的配置模式,FPGA便会有不同的编程方式,使用最为广泛的则是串行配置模式,以下为常用的几种配置模式:并行模式:通过并行PROM、Flash配置FPGA主从模式:使用一片PROM配置多片FPGA串行模式:串行PROM配置FPGA外设模式:将FPGA作为微处理器的外设,由微处理器对其编程155.开发流程
FPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。原理图和HDL(Hardwaredescriptionlanguage,硬件描述语言)是两种最常用的数字硬件电路描述方法。其中,运用HDL设计方法具有更好的移植性、通用性以及利于模块划分的特点,在工作学习中被广泛使用。典型FPGA的开发流程一般先通过系统功能设计,然后通过VHDL/VerilogHDL硬件描述语言进行RTL级HDL设计,然后进行RTL级仿真、综合、门级仿真、布局布线和时序仿真等步骤,最后生成下载配置文件,下载到FPGA中进行板级调试。《医用FPGA开发实用教程》-配套讲义166.HDL语言HDL(HardwareDescripTIonLanguage)语言又称为硬件描述语言,是一种用文本的方式把硬件电路描述出来的语言。目前最主要的硬件描述语言是VHDL和VerilogHDL。VHDL发展的较早,语法严格,而VerilogHDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由。我们在阅读HDL程序的时候,在脑子里应该能反映出一个完整的硬件电路结构。也就是说,我们在编写HDL语言之前,就要对需要实现的电路有清晰的概念。所以HDL语言只是一个描述我们头脑中具体电路的工具,掌握FPGA的根本不是语言而是逻辑电路的设计。《医用FPGA开发实用教程》-配套讲义17谢谢观看!《医用FPGA开发实用教程》-配套讲义18第2讲:FPGA开发平台和工具——卓越工程师培养系列——19目录XC6SLX16芯片介绍FPGA高级开发系统可以开展的部分实验FPGA开发工具的安装与配置《医用FPGA开发实用教程》-配套讲义201.XC6SLX16芯片介绍《医用FPGA开发实用教程》-配套讲义XC6SLX16是赛灵思(Xilinx)Spartan-6系列的一种低成本、低功耗的FPGA芯片,芯片引脚总数为324个,可用I/O数量为232个,内部提供了14579个逻辑单元,136KB的分布式RAM,576KB的内嵌式块RAM,最大工作频率可达1080MHz。212.FPGA高级开发系统《医用FPGA开发实用教程》-配套讲义FPGA高级开发系统上的核心板通过两个连接器将148个可用I/O引出给平台上的外设使用,剩下的用于核心板上的外扩SRAM、用户配置FLASH及JTAG下载等。22FPGA高级开发系统可以开展的实验非常丰富,这里仅列出具有代表性的17个实验。3.可以开展的部分实验《医用FPGA开发实用教程》-配套讲义序号实验名称序号实验名称1分频器实验10SHT20温湿度测量实验2流水灯实验11DAC实验3独立按键去抖实验12ADC实验4七段数码管显示实验13体温测量与显示实验5矩阵键盘扫描实验14呼吸监测与显示实验6OLED显示实验15心电监测与显示实验7串口通信实验16血氧监测与显示实验8读写外部EEPROM实验17血压测量与显示实验9读写外部FLASH实验234.FPGA开发工具的安装与配置《医用FPGA开发实用教程》-配套讲义ISE14.7的安装与配置Synplify的安装与配置下载器驱动的安装24谢谢观看!《医用FPGA开发实用教程》-配套讲义25第3讲:VHDL语法基础——卓越工程师培养系列——26目录VHDL基本结构数据类型常量与变量信号元件常用语句运算符《医用FPGA开发实用教程》-配套讲义271.VHDL基本结构《医用FPGA开发实用教程》-配套讲义1.1库声明
库(library)的建立和使用有利于设计重用和代码共享,同时可以使代码结构更加清晰,在VHDL设计中有3个常用的库:ieee库、std库和work库。在使用一个库之前,首先需要对库进行声明,经过声明后,在设计中就可以调用库中的代码。库语句关键词library指明所使用的库名,use语句指明库中的程序包,声明格式如下:library库名;use库名.程序包名.all;use库名.程序包名.项目名;281.VHDL基本结构《医用FPGA开发实用教程》-配套讲义1.2实体
实体(entity)用来描述电路的所有输入/输出引脚,是VHDL程序经封装后对外的一个通信界面。实体名可以自由命名,用来表示被设计电路芯片的名称,但是必须与VHDL程序的程序文件一致,语法结构如下:entity实体名isport(
引脚名:in信号类型;
引脚名:inout信号类型;
引脚名:out信号类型);endentity;291.VHDL基本结构《医用FPGA开发实用教程》-配套讲义1.3结构体
结构体(architecture)实现了具体的功能,描述了该基本设计单元的行为、元件和内部的连接关系,其中,“声明语句”用来说明和定义数据对象、数据类型、元件声明等。“声明语句”并非是必需的,但“功能描述语句”必须在结构体中给出相应的电路功能描述。语法结构如下:architecturertlof结构体名is
声明语句begin
功能描述语句endrtl;301.VHDL基本结构《医用FPGA开发实用教程》-配套讲义1.4VHDL基本结构实例libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityledis
port(
led_o:outstd_logic_vector(3downto0)--led输出,共4位
);endentity;architecturertlofledisbegin
led_o<=“1111”;endrtl;31
std_logic和std_logic_vector是ieee1164标准中引入的8逻辑值系统。不同于只能取0或1的bit和bit_vector类型,它既可以取‘0’,‘1’,还可以取不定态和高阻态等共8种不同的值。2.数据类型2.1std_logic和std_logic_vector《医用FPGA开发实用教程》-配套讲义值描述X“强”不确定值(综合后为不确定值)0“强”0(综合后为0)1“强”1(综合后为1)Z高阻态(综合后为三态缓冲器)W“弱”不确定值L“弱”0H“弱”1-不可能出现的情况电平高低:1>H>L>032integer是32位的整数,取值范围从-2^31到2^31,通过关键字range…to可以定义一个integer类型变量或信号的取值范围。2.数据类型2.2integer《医用FPGA开发实用教程》-配套讲义character是字符型数据,可以是单个或者一串ASCII字符。2.3character33
常量的定义和设置主要是为了使程序更容易阅读和修改,在程序中,常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在程序中就不能再改变,具有全局意义。常量定义的格式如下:3.常量与变量3.1常量
《医用FPGA开发实用教程》-配套讲义constant常量名:数据类型:=表达式;
例如某实验中定义了常量LED0_ON的数据类型为std_logic_vector,它等于0001。constantLED0_ON:std_logic_vector(3downto0):="0001";34
在VHDL语法规则中,变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它作出定义的当前结构。变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时行为。变量的主要作用是在进程中作为临时的数据存储单元。变量定义的格式如下:3.常量与变量3.2变量
《医用FPGA开发实用教程》-配套讲义variable变量名:数据类型:=初始值;
例如以下两句表述分别定义了变量a的取值范围为0~15的整数型变量;变量b为标准位类型的变量,初始值为1。variablea:integerrange0to15;variableb:std_logic:='1';35信号(signal)是指电路内部硬件连接的抽象,同时可以作为设计实体中并行语句模块间的信息交流通道,在综合过程中是硬件电路的线路。信号是全局的,可以定义在结构体,实体,程序包中。信号定义的格式如下:
4.信号《医用FPGA开发实用教程》-配套讲义signal信号名:数据类型:=初始值;
信号初始值的设置不是必需的,初始值的设置仅在VHDL的行为仿真中有效,例如定义1Hz时钟信号和计数信号,并且计数信号的初始值为00。signals_clk_1hz:std_logic;--1Hz时钟信号signals_cnt
:std_logic_vector(1downto0):="00";--计数信号,2位36
一个元件(component)是一段结构完整的程序文件(包括库声明、实体和结构体),如果将这些程序声明为component,就可以被其他电路调用(实例化),从而使程序具有层次化结构。调用一个元件之前,要在结构体的声明部分对该元件进行声明,元件声明语法格式如下:5.元件5.1元件声明《医用FPGA开发实用教程》-配套讲义component元件名isport(
引脚名表);endcomponent;37元件例化就是将预先设计好的设计实体定义为一个元件后,利用映射语句将此元件与调用该元件的设计实体中指定端口或信号相关联(用“=>”实现),从而进行层次化设计。元件的例化是在结构体的功能描述部分实现的,语法格式如下:5.元件5.2元件例化《医用FPGA开发实用教程》-配套讲义例化名:元件名
portmap(
信号关联式1,
信号关联式2,
……
信号关联式n);386.常用语句6.1直接赋值语句《医用FPGA开发实用教程》-配套讲义
直接赋值语句常用于信号的赋值,语法格式如下:信号名<=表达式;
例如计数信号s_cnt执行加1操作后再赋给s_cnt,赋值语句如下所示:s_cnt<=s_cnt+'1';396.常用语句6.2process语句《医用FPGA开发实用教程》-配套讲义VHDL的process语句几乎在所有的时序逻辑设计中都会使用,一旦process括号内敏感信号的动作条件满足,则process语句将会启动并顺序执行。Process语句格式如下,其中,变量声明部分不是必需的:process(敏感表)
变量声明begin
顺序语句(详细电路设计)endprocess;406.常用语句6.3when…else语句《医用FPGA开发实用教程》-配套讲义when...else语句在满足“条件1”时,目标信号取“值1”,否则判断是否满足“条件2”,如果满足,则目标信号取“值2”,否则继续判断,依次类推。when...else语句的表达格式如下:目标变量<=
值1when条件1else
值2when条件2else
值3when条件3else
…
值n;416.常用语句6.4if…else语句《医用FPGA开发实用教程》-配套讲义if...else语句首先判断表达式1的条件是否满足,若满足则执行逻辑电路1,否则判断表达式2的条件是否满足,若满足则执行逻辑电路2,否则继续判断,依次类推,基本语法如下:if表达式1then
逻辑电路1elsif表达式2then
逻辑电路2
…else
逻辑电路nendif;426.常用语句6.5case语句《医用FPGA开发实用教程》-配套讲义case语句根据表达式(或信号)的取值来执行相应的逻辑电路,语法格式如下:case表达式is
when表达式取值1=>
逻辑电路1
when表达式取值2=>
逻辑电路2
…
whenothers=>
逻辑电路nendcase;437.运算符7.1赋值运算符《医用FPGA开发实用教程》-配套讲义
赋值运算符用来给信号、变量和常量赋值,描述如下表所示:赋值运算符描述<=用于对信号赋值:=用于对变量、常量和参数传递赋值,也可用于赋初始值=>给矢量中的某些位赋值,或对某些位之外的其他位(常用others表示)赋值447.运算符7.2逻辑运算符《医用FPGA开发实用教程》-配套讲义
逻辑运算符用来执行逻辑运算操作。操作数必须是bit、std_logic或std_ulogic类型的数据(或是这些数据类型的扩展,即bit_vector、std_logic_vector或std_ulogic_vector)。VHDL的逻辑运算符如表所示,它们的优先级是从上到下递减的。逻辑运算符描述NOT取反AND与OR或NAND与非NOR或非XOR异或XNOR同或457.运算符7.3算术运算符《医用FPGA开发实用教程》-配套讲义算术运算符描述+加,A+B-减,A-B*乘,A*B/除,A/B**指数运算,ABMOD取模REM取余ABS取绝对值467.运算符7.4关系运算符《医用FPGA开发实用教程》-配套讲义
关系运算符用来对两个操作数进行比较运算,关系运算符左右两边操作数的数据类型必须相同。VHDL有6种关系运算符,如表所示。逻辑运算符描述=等于/=不等于<小于>大于<=小于等于>=大于等于477.运算符7.5并置运算符《医用FPGA开发实用教程》-配套讲义
并置运算符用于位的拼接,其操作数可以是支持逻辑运算的任何数据类型。并置运算符有两种:&和(,,,)并置运算符描述&c<=a&b;(,,,)b<=('1','1','0',a,'0','0','0','0');48谢谢观看!《医用FPGA开发实用教程》-配套讲义49第4讲:实验1分频器实验——卓越工程师培养系列——50目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义51
设计一个分频器,对50MHz的系统时钟进行分频,输出一个占空比为50%、频率为1Hz的方波信号,并将该方波信号约束到FPGA高级开发系统上编号为LED0的发光二极管,达到该发光二极管500ms更改一次状态,除此之外,该分频器还可以通过编号为RESET的按键进行低电平复位。1.实验内容《医用FPGA开发实用教程》-配套讲义52
分频器实验涉及的硬件电路包括一个位于FPGA高级开发系统上的LED0以及与LED0串联的限流电阻,LED0通过电阻连接到芯片的G14引脚,除此之外,还包括系统时钟引脚和系统复位引脚,其中,系统时钟引脚连接50MHz时钟模块,是芯片的时钟源,系统复位引脚连接RESET按键,低电平复位,G14为高电平时,LED0点亮,G14为低电平时,LED0熄灭。2.实验原理2.1LED电路原理图《医用FPGA开发实用教程》-配套讲义53
分频就是对较高频率的信号进行处理,得到较低频率的信号。一个高频信号的频率降低为原来的1/N,就叫N分频。例如,将50MHz的信号经过2分频得到25MHz的信号,经过5分频得到10MHz的信号,经过10分频得到5MHz的信号。2.实验原理2.2时钟的分频《医用FPGA开发实用教程》-配套讲义54
本实验LED0每500ms更改一次状态,闪烁频率为1Hz,而我们的系统时钟频率为50MHz,因此,1Hz时钟的分频数为50MHz/1Hz=50000000。通过定义一个计数器s_cnt,对50MHz时钟进行计数,在每个时钟上升沿,s_cnt执行一次加1操作,当s_cnt在0和24999999之间时,clk_o输出低电平,当s_cnt在25000000和49999999之间时,clk_o输出高电平,并在49999999之后的下一个时钟上升沿将s_cnt清零重新开始计数。2.实验原理2.31Hz分频原理《医用FPGA开发实用教程》-配套讲义55CNT_MAX和CNT_HALF为常量,其中CNT_MAX可以调节输出时钟的频率,CNT_HALF可以调节输出时钟的占空比。本实验中CNT_MAX为49999999,CNT_HALF为24999999。2.实验原理2.4内部电路图《医用FPGA开发实用教程》-配套讲义563.实验步骤步骤1:ISE软件标准化设置步骤2:新建工程步骤3:新建VHDL源文件步骤4:检查VHDL源文件语法步骤5:通过Synplify综合工程步骤6:新建VHDL测试文件并检查语法步骤7:仿真工程步骤8:新建引脚约束文件步骤9:生成并下载.bit和.mcs文件步骤10:板级验证《医用FPGA开发实用教程》-配套讲义574.本章任务
学习完本章后,严格按照实验步骤,进行ISE软件标准化设置、创建FPGA工程、新建VHDL源文件、VHDL测试文件、引脚约束文件,并最终生成.bit和.mcs文件,将其分别下载到FPGA高级开发系统,查看运行结果。《医用FPGA开发实用教程》-配套讲义58谢谢观看!《医用FPGA开发实用教程》-配套讲义59第5讲:实验2流水灯实验——卓越工程师培养系列——60目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义611.实验内容《医用FPGA开发实用教程》-配套讲义通过学习模块化设计思想,以及分频器和计数器工作原理,基于FPGA高级开发系统设计一个流水灯模块,使编号为LED0~LED7的8个发光二极管依次点亮、熄灭,形成流水状,具体来说,就是先让最右端的LED点亮,等待1s后熄灭,再让第二个LED点亮,等待1s后熄灭,如此类推,当最左端的LED熄灭后,再点亮最右端的LED,形成循环,现象如流水状。
622.实验原理2.1LED电路原理图《医用FPGA开发实用教程》-配套讲义
流水灯实验涉及的硬件包括8个位于FPGA高级开发系统上的LED0~LED7,这四个LED分别连接到芯片的G14、F16、H15、G16、H14、H16、J13和J16。此外,还包括系统时钟引脚和系统复位引脚632.实验原理2.2流水灯工作原理《医用FPGA开发实用教程》-配套讲义
以4位的流水灯为例,其工作原理就是LED0~LED3依次点亮、熄灭,形成流水状。具体来说,就是从T1时刻开始,先让最右端的LED0点亮,等待一段时间,即在T2时刻LED0熄灭、LED1点亮,等待一段时间,即在T3时刻LED1熄灭、LED2点亮,依次类推,当最左端的LED3熄灭后,再点亮最右端的LED0,形成循环,现象如流水状,如右图所示。注意,一般流水灯两个相邻状态之间的时间间隔是固定的。642.实验原理2.3内部电路图《医用FPGA开发实用教程》-配套讲义分频模块clk_gen_1hz用于将50MHz的系统时钟分频为1Hz的内部时钟,计数器s_cnt按照“000→001→010→011→100→101→110→111→000”的顺序循环计数。led_o[7:0]根据s_cnt输出流水灯的不同状态值,复位引脚rst_n_i用于对整个系统进行异步复位,当rst_n_i为0时,计数器s_cnt被清零。653.实验步骤步骤1:复制工程文件夹并导入VHDL源文件步骤2:完善led.vhd文件步骤3:新建VHDL测试文件并仿真工程步骤4:导入并完善引脚约束文件步骤5:板级验证《医用FPGA开发实用教程》-配套讲义664.本章任务《医用FPGA开发实用教程》-配套讲义基于FPGA高级开发系统,通过VHDL语言实现LED编码计数功能。假设LED熄灭为0,点亮为1,通过四个LED实现编码计数功能,初始状态为LED3~LED0均熄灭(0000),第二状态为LED3~LED1熄灭、LED0点亮(0001),第三状态为LED3、LED2、LED0熄灭、LED1点亮(0010),第四状态为LED3、LED2熄灭、LED0、LED1点亮(0011),…,第十五状态为LED3~LED1点亮、LED0熄灭(1110),第十六状态为LED3~LED0均点亮(1111),按照“初始状态→第二状态→第三状态→…→第十六状态→初始状态”循环执行,两个相邻状态之间的间隔为500ms。67谢谢观看!《医用FPGA开发实用教程》-配套讲义68第6讲:实验3
独立按键去抖实验——卓越工程师培养系列——69目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义701.实验内容《医用FPGA开发实用教程》-配套讲义通过学习FPGA高级开发系统上的独立按键电路原理图、按键去抖原理和状态机设计,基于FPGA高级开发系统设计一个按键控制LED计数顶层模块,按下按键KEY1,控制编号为LED0~LED3的四个发光二极管依次按照“0000→0001→0010→…→1111→0000”的顺序循环执行,这里假设LED熄灭为0,点亮为1。
712.实验原理2.1独立按键电路原理图《医用FPGA开发实用教程》-配套讲义独立按键实验涉及的硬件包括LED0~LED3,这四个LED分别连接到芯片的G14、F16、H15和G16,还包括一个独立按键KEY1,KEY1连接到芯片的G13,此外,还包括系统时钟引脚和系统复位引脚。722.实验原理2.2
独立按键的抖动《医用FPGA开发实用教程》-配套讲义机械式开关在按下的瞬间会在接触点出现电平来回弹跳的现象。在按键松开时,也会出现类似的情况,这种情况被称为抖动。抖动时间的长短和按键的机械特性有关,一般为5~10ms,通常人按下按键持续的时间大于100ms。因此独立按键去抖可以基于两个时间的差异,取一个中间值(例如20ms)作为界限,持续时间小于20ms的信号视为抖动脉冲,大于20ms的信号视为按键按下。732.实验原理2.3
按键去抖原理《医用FPGA开发实用教程》-配套讲义本实验的按键去抖是通过每1ms检测一次连接到按键的引脚电平,连续检测到20次低电平,即低电平持续时间超过20ms,表示识别到按键按下。同理,按键按下后,如果连续检测到20次高电平,即高电平持续时间超过20ms,表示识别到按键松开。742.实验原理2.4
状态机《医用FPGA开发实用教程》-配套讲义状态机的全称是有限状态机(FSM,FiniteStateMachine),由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。状态机由三部分组成,分别是产生下一状态的组合逻辑电路、时序逻辑电路和产生输出的组合逻辑电路。如果状态机的输出信号output仅仅由当前状态决定,则这种状态机称为摩尔型状态机;如果状态机的输出信号output不仅与电路当前状态curr_state有关,还与当前的输入input有关,则这种状态机称为米里型状态机。摩尔型状态机原理图米里型状态机原理图752.实验原理2.4状态机《医用FPGA开发实用教程》-配套讲义状态机的使用可归纳为4个要素,分别是现态、条件、动作以及次态。现态:是指当前所处的状态条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。动作:指条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,将会转变成新的“现态”。
在VHDL中,状态机的描述方法一般有一段式、二段式以及三段式三种,其最大的区别在于一共使用了几个进程对状态机进行描述,例如在二段式状态机中,分别使用了两个进程,一个采用时序逻辑描述状态的转移,一个采用组合逻辑判断状态转移条件,描述状态的转移规律。762.实验原理2.5去抖处理状态机《医用FPGA开发实用教程》-配套讲义772.实验原理2.6内部电路图《医用FPGA开发实用教程》-配套讲义u_clk_gen_1khz为1kHz分频时钟。u_clr_jitter模块用于对原始的按键输入btn_i进行去抖处理。s_cnt按照“0000→0001→0010→0011→…→1111→0000”的顺序循环计数,led_o根据s_cnt输出不同状态值。rst_n_i用于对整个系统进行异步复位。783.实验步骤步骤1:复制工程文件夹并导入VHDL源文件步骤2:完善clr_jitter_with_fsm.vhd文件步骤3:导入VHDL测试文件并仿真工程步骤4:导入并完善btn_led_cnt.vhd文件步骤5:导入并完善引脚约束文件步骤6:板级验证《医用FPGA开发实用教程》-配套讲义794.本章任务《医用FPGA开发实用教程》-配套讲义本实验是基于按键的前沿,即按键按下时,控制LED计数,尝试在按键的后沿,即按键松开时,控制LED计数。80谢谢观看!《医用FPGA开发实用教程》-配套讲义81第7讲:实验4七段数码管显示实验——卓越工程师培养系列——82目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义831.实验内容《医用FPGA开发实用教程》-配套讲义
通过学习七段数码管显示模块的电路原理图、七段数码管显示原理和七段数码管实验内部电路图,基于FPGA高级开发系统,编写七段数码管显示驱动,在数码管上显示数字1~8。
842.实验原理2.1
七段数码管《医用FPGA开发实用教程》-配套讲义七段数码管的引脚定义如下图左所示。由8个发光二极管组成,分别由字母a、b、c、d、e、f、g、dp表示。当数码管特定的段对应的发光二极管加上电压后,这些特定的段就会被点亮,形成眼睛看到的相应数码管字样。
七段数码管内部电路有两种连接方式:共阳型和共阴型。共阳型共阴型852.实验原理2.24位共阳型七段数码管
《医用FPGA开发实用教程》-配套讲义862.实验原理2.3电路原理图
《医用FPGA开发实用教程》-配套讲义872.实验原理2.4显示原理《医用FPGA开发实用教程》-配套讲义本章实验采用的是动态扫描的显示方法,在动态扫描过程中,每一个数码管的点亮时间间隔非常短(大约20ms),由于人的视觉暂留现象及发光二极管的余晖效应,尽管实际上数码管大约每20ms闪烁一次,给人的感觉却是稳定的显示,不会有闪烁感。
88400Hz分频模块u_clk_gen_400hz用于将50MHz的系统时钟分频为400Hz的内部时钟,作为移位模块u_shift的时钟输入,u_shift用于进行七段数码管的动态扫描,与位选输出seg7_sel_o相连,显示模块u_seg7_disp则用于七段数码管的显示。2.实验原理2.5内部电路图《医用FPGA开发实用教程》-配套讲义89u_shift包含一个寄存器s_shift,s_shift的初始值为10000000,在clk_400hz_i的上升沿,s_shift执行循环右移操作,s_shift与shift_o相连接,因此,该模块的功能是使shift_o按照“10000000→01000000→00100000→00010000→00001000→00000100→00000010→00000001→10000000”的顺序循环输出一个扫描信号,时间间隔为2.5ms。2.实验原理2.6.1u_shift《医用FPGA开发实用教程》-配套讲义90u_seg7_disp模块的功能是根据扫描信号值,在seg7_decode_o输出对应位七段数码管的显示值。例如,当shift_i为10000000时,最左端七段数码管的位选引脚SEL7使能,此时数据引脚SELDP~SELA输出11111001,在数码管上显示1。2.实验原理2.6.2u_seg7_disp《医用FPGA开发实用教程》-配套讲义913.实验步骤步骤1:复制工程文件夹并添加VHDL文件步骤2:完善shift.vhd文件步骤3:完善seg7_disp.vhd文件步骤4:完善seg7.vhd文件步骤5:仿真工程步骤6:板级验证《医用FPGA开发实用教程》-配套讲义924.本章任务
在本实验的基础上增加时钟模块,在七段数码管上动态显示时间,如下图所示。《医用FPGA开发实用教程》-配套讲义93谢谢观看!《医用FPGA开发实用教程》-配套讲义94第8讲:实验5矩阵键盘扫描实验——卓越工程师培养系列——95目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义96通过学习矩阵键盘扫描实验电路原理图、矩阵键盘扫描原理、双寄存器边沿检测电路,以及矩阵键盘实验内部电路图,基于FPGA高级开发系统,通过矩阵键盘控制编号为LED0LED3的四个蓝色发光二极管,当依次按下矩阵键盘上的K0、K1、K2、…、KF时,LED3~LED0对应显示0000、0001、0010、…、1111,其中,LED熄灭为0,点亮为1。1.实验内容《医用FPGA开发实用教程》-配套讲义972.实验原理2.1矩阵键盘电路原理图《医用FPGA开发实用教程》-配套讲义矩阵键盘共有4个行线ROW3~ROW0和4个列线COL3~COL0,在行与列的交叉点上就是按键。在矩阵键盘中,同一列上的按键,左侧引脚串联后,一端连接到3.3V电源,另外一端连接到芯片的引脚。982.实验原理2.2矩阵键盘的扫描《医用FPGA开发实用教程》-配套讲义
通过FPGA控制ROW3~ROW0按照“0111→1110→1101→1011→0111”的顺序循环输出一个行扫描信号,并读取COL3~COL0的电平。在ROW3~ROW0为0111时,如果按键0按下,则FPGA读取到的COL3~COL0电平为0111。将ROW3~ROW0与COL3~COL0拼接之后,译码得出的值就对应按键0,只要行扫描循环周期小于一次按键所需时间,就能准确检测到每次按键的按下。99按键按下的持续时间往往很长,相当于一个电平信号,而不是一个脉冲信号,通过边沿检测电路可以将其处理成单时钟周期宽度的脉冲信号。
常用的有双寄存器下降沿和上升沿检测电路两种。2.实验原理2.3双寄存器边沿检测电路《医用FPGA开发实用教程》-配套讲义双寄存器下降沿检测电路双寄存器上升沿检测电路1002.实验原理2.4内部电路图《医用FPGA开发实用教程》-配套讲义1012.实验原理2.4.1u_row_scan《医用FPGA开发实用教程》-配套讲义u_row_scan模块包含一个寄存器s_row,s_row的初始值为0111,在clk_i的上升沿,s_row执行循环左移操作,s_row与row_o相连接,因此,该模块的功能是通过row_o按照“0111→1110→1101→1011→0111”的顺序循环输出一个行扫描信号。1022.实验原理2.4.2u_colx_clr_jitter《医用FPGA开发实用教程》-配套讲义本章实验内部电路图包含的四个按键去抖模块均属于下降沿检测电路。由于与门之后有个非门,因此,经过去抖处理之后的btn_o是一个反相脉冲,而且,btn_o的下降沿在btn_i下降沿的基础上延时了一个时钟周期。1032.实验原理2.4.3u_row_delay《医用FPGA开发实用教程》-配套讲义u_row_delay模块包含一个寄存器row_reg_o,目的是将row_i延时一个时钟周期。使行扫描信号s_row_reg和列输入的延时信号s_col保持一致,保证矩阵键盘译码正确。1042.实验原理2.4.4u_combine_row_col《医用FPGA开发实用教程》-配套讲义
u_combine_row_col模块的作用是将row_i与col_i拼接成一个8位行列编码值,其中,row_i位于高4位,col_i位于低4位。1052.实验原理2.4.5u_decoder《医用FPGA开发实用教程》-配套讲义
u_decoder的功能是根据8位行列编码值,在led_o输出对应的按键值。此外,u_decoder模块中需要一个寄存器led_o,只有在编码值有效时,led_o才可能发生变化,在编码值无效时,led_o保持不变。1063.实验步骤步骤1:复制工程文件夹并导入VHDL源文件步骤2:完善row_scan.vhd文件步骤3:完善clr_jitter_with_reg.vhd文件步骤4:完善row_delay.vhd文件步骤5:完善combine_row_col.vhd文件步骤6:完善decoder.vhd文件步骤7:完善key4x4.vhd文件步骤8:板级验证《医用FPGA开发实用教程》-配套讲义1074.本章任务《医用FPGA开发实用教程》-配套讲义在本实验的基础上,将四个发光二极管用FPGA高级开发系统上的最右侧七段数码管替换,即依次按下矩阵键盘上的K0、K1、K2、…、KF时,七段数码管对应显示0、1、2、…、F。108谢谢观看!《医用FPGA开发实用教程》-配套讲义109第9讲:实验6OLED显示实验——卓越工程师培养系列——110目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义1111.实验内容《医用FPGA开发实用教程》-配套讲义通过学习FPGA高级开发系统上的OLED模块原理图、OLED显示原理以及SSD1306工作原理,基于FPGA高级开发系统,编写OLED驱动。
1122.实验原理2.1OLED电路原理图《医用FPGA开发实用教程》-配套讲义将OLED显示模块插在FPGA高级开发系统上的OLED显示屏接口(J503),即可通过FPGA高级开发系统在OLED屏上显示信息。1132.实验原理2.2OLED通信模式《医用FPGA开发实用教程》-配套讲义OLED模块支持的SPI通信模式需要4根信号线和1根复位控制线,分别是片选信号CS、数据/命令控制信号D/C、串行时钟线SCK、串行数据线DIN以及复位引脚RES。在SPI通信模式下,每个数据长度均为8位,在SCK的上升沿,数据从DIN移入到SSD1306,并且是高位在前,D/C线用作数据/命令控制,SPI通信模式下,写操作时序如下图所示。1142.实验原理2.3
SSD1306的显存《医用FPGA开发实用教程》-配套讲义1152.实验原理2.4SSD1306常用命令《医用FPGA开发实用教程》-配套讲义1162.实验原理2.5字模选项《医用FPGA开发实用教程》-配套讲义本实验的字模选项为“16×16字体顺向逐列式(阴码)”,以右图所示的问号为例,逐列式表示按照列进行取模,左上角的8个格子为第一个字节,高位在前,即0x00,左下角的8个格子为第二个字节,即0x00,以此类推。1172.实验原理2.6OLED显示流程《医用FPGA开发实用教程》-配套讲义OLED显示模块显示流程如右图所示,首先将OLED的页设置为空页,共8页,其次,设置OLED每行待显示的字符,共4行,然后将oled_res_o拉低1ms之后再将oled_res_o拉高,对SSD1306进行复位,接着,写30条初始化指令,写指令完成后写地址,然后再写一页数据,一页数据写完后再回到写地址,直到所有地址和数据写完后就完成了OLED的显示。1183.实验步骤步骤1:复制工程文件夹并导入VHDL源文件步骤2:完善OLED.vhd的引用库步骤3:完善OLED.vhd结构体的声明步骤4:完善OLED.vhd结构体的功能描述步骤5:仿真测试步骤6:板级验证《医用FPGA开发实用教程》-配套讲义1194.本章任务
在本实验的基础上,增加OLED的电子钟显示模块,第一行显示实验名称,第二行显示实验日期,第三行动态显示电子钟时间,初始时间为“23-59-50”,第四行则显示实验作者名字缩写,效果如下图所示。《医用FPGA开发实用教程》-配套讲义120谢谢观看!《医用FPGA开发实用教程》-配套讲义121第10讲:实验7串口通信实验——卓越工程师培养系列——122目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义123
基于FPGA高级开发系统设计一个串口通信实验,计算机上的串口助手向FPGA高级开发系统发送数据,待FPGA高级开发系统收到之后会向计算机发送收到的数据,并在计算机上通过串口助手显示。比如,计算机通过串口助手向FPGA高级开发系统发送“123456”,FPGA高级开发系统收到之后,向计算机发送相同的数据,在串口助手上显示“123456”。
1.实验内容《医用FPGA开发实用教程》-配套讲义1242.实验原理2.1UART电路原理图《医用FPGA开发实用教程》-配套讲义FPGA高级开发系统上芯片的D17引脚连接CH330N芯片的RXD引脚,作为UART_TX端口,C18引脚连接CH330N芯片的TXD引脚,作为UART_RX端口。然后将UART信号经由FPGA高级开发系统上的USB转UART模块转换为USB信号(D+和D-),这样,通过USB连接线,即可实现计算机与系统之间的通信。1252.实验原理2.2UART物理层《医用FPGA开发实用教程》-配套讲义UART是异步串行全双工通信,因此UART通信没有时钟线,由两根数据线实现双向同时传输,收发数据只能一位一位地在各自数据线上传输。数据线是高低逻辑电平传输,因此还必须有参照的地线,最简单的UART接口由发送数据线TXD、接收数据线RXD和GND共三根线组成。两个UART设备的连接如下图所示。1262.实验原理2.3UART数据格式《医用FPGA开发实用教程》-配套讲义UART数据在物理层上是以帧为单位进行传输的。UART的一帧数据由起始位、数据位、校验位、停止位和空闲位组成,如下图所示。需要说明的是,一个完整的UART数据帧必须有起始位、数据位和停止位,但是不一定有校验位和空闲位。1272.实验原理2.4UART传输速率《医用FPGA开发实用教程》-配套讲义UART传输速率用比特率来表示。比特率是每秒传输的二进制位数,单位为bps(bitpersecond)。在实际应用中,常用的UART传输速率有1200、2400、4800、9600、19200、38400、57600和115200。如果数据位为8位,校验为奇校验,停止位为1位,波特率为115200,计算每2ms最多可以发送多少个字节数据。首先,通过计算可知一帧数据有11位(1位起始位+8位数据位+1位校验位+1位停止位),其次,波特率为115200,即每秒传输115200bit,那每ms可以传输115.2bit,由于每帧数据有11位,那每ms就可以传输10个字节数据,2ms就可以传输20字节数据。1282.实验原理2.5UART通信《医用FPGA开发实用教程》-配套讲义
假设UART波特率为115200,数据位为8位,无奇偶校验位,停止位为1位。第1步,获取UART原始波形数据;
第2步,按照波特率进行中值采样;
第3步,确定起始位、数据位和停止位,。1292.实验原理2.6串口发送状态机《医用FPGA开发实用教程》-配套讲义1302.实验原理2.7串口接收状态机《医用FPGA开发实用教程》-配套讲义1312.实验原理2.8UART内部电路图《医用FPGA开发实用教程》-配套讲义u_uart_rec模块用于从uart_rx_i接收数据,并通过rx_data_o将数据并行输出到u_uart_fifo中缓存,同时产生一个并行数据写脉冲rx_wr_en_o;u_uart_fifo模块用于进行数据的缓存;u_uart_trans模块用于从u_uart_fifo中读取并行数据tx_data_i,将其通过tx_o发送出去,同时产生一个并行数据读脉冲tx_rd_en_o。1322.实验原理2.9u_uart_rec时序图《医用FPGA开发实用教程》-配套讲义假设串口接收端收到的一帧数据为0110101001,无校验。1332.实验原理2.10u_uart_trans时序图《医用FPGA开发实用教程》-配套讲义假设串口要发送的数据为11010100,无校验。1343.实验步骤步骤1:复制工程文件夹并添加VHDL文件步骤2:完善uart_trans.vhd文件步骤3:添加uart_fifo步骤4:完善uart_rec.vhd文件步骤5:完善uart.vhd文件步骤6:仿真工程步骤7:安装CH340驱动步骤8:板及验证《医用FPGA开发实用教程》-配套讲义1354.本章任务
在本实验的基础上增加数据处理模块,如果接收到的数据对应的Ascii码是十六进制数的0
F,则进行加1(F加1后清零)处理后再将数据发送出去,其余字符则不作处理,例如接收到的数据对应的字符是1,则发送字符2的数据,接收到的数据对应的字符是B,则发送字符C的数据,接收到的数据对应的字符是Z,则发送的还是字符Z的数据。《医用FPGA开发实用教程》-配套讲义136谢谢观看!《医用FPGA开发实用教程》-配套讲义137第11讲:实验8外部EEPROM实验——卓越工程师培养系列——138目录实验内容实验原理实验步骤本章任务《医用FPGA开发实用教程》-配套讲义1391.实验内容《医用FPGA开发实用教程》-配套讲义基于FPGA高级开发系统设计一个读写外部EEPROM实验,可通过按独立按键KEY1,FPGA芯片向EEPROM写入数据76543210,按KEY2,可以向EEPROM写入数据89ABCDEF,按KEY3,则从EEPROM中读取最后一次写入的数据,读写的数据都可通过串口,在串口助手上显示。
1402.实验原理2.1EEPROM电路原理图《医用FPGA开发实用教程》-配套讲义
FPGA芯片的E7引脚连接AT24C02芯片的SCL引脚,为时钟引脚,C7引脚连接SDA引脚,为数据引脚。A0A1A2引脚接GND,表示IIC器件的片选地址为000;WP是写保护引脚,在FPGA高级开发系统上,WP引脚接到GND,这样存储器可读可写;另外还包括3个独立按键KEY1~KEY3和串口发送引脚CH330_TX。1412.实验原理2.2
IIC协议《医用FPGA开发实用教程》-配套讲义IIC总线(IICbus,Inter-ICbus)是一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。IIC总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。每个接到IIC总线上的器件都有唯一的地址。1422.实验原理2.3IIC总线整体时序《医用FPGA开发实用教程》-配套讲义在SCL为高电平期间,SDA由高向低电平的变化表示起始信号;SCL为高电平期间,SDA由低向高电平的变化表示停止信号。在进行数据传输时,SCL为高电平期间,SDA上的数据必须保持稳定,只有在SCL为低电平期间,SDA上的数据才允许变化。1432.实验原理2.4IIC器件地址《医用FPGA开发实用教程》-配套讲义AT24C02一共有七位地址码,前四位已经固定为1010,后三位是片选地址,分别是A2、A1、A0,片选地址由硬件连接决定。图左片选地址引脚A2、A1、A0都连接到GND,则片选地址为000,该器件地址为1010000;同理图右地址为1010111。
1442.实验原理2.5控制命令的数据格式《医用FPGA开发实用教程》-配套讲义
IIC协议的控制命令包含7位从机器件地址码和1位读/写(R/W)操作位,其中,S是起始位,ACK是从机应答。IIC协议在传输数据时,主机首先向总线发出控制命令(1010A2A1A0R/W),以此来选择需要控制的从机,传输过程按照从高位到低位的顺序传输,控制字节的最低位为R/W(读/写)操作位,当R/W位为0时表示主机对从机进行写操作,当为1时表示主机对从机进行读操作。传输完控制命令后则等待目标从机发送响应应答。1452.实验原理2.6单字节写时序《医用FPGA开发实用教程》-配套讲义
在字节写模式下,主机发送起始命令和控制字节信息,在从机响应应答信号后,主机发送要写入数据的地址,主机在收到从机的应答信号后,再传输待写入的数据,从机响应应答后信号后,主机产生停止位,终止传输。1462.实验原理2.7页写时序《医用FPGA开发实用教程》-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 30273-2013信息安全技术 信息系统安全保障通 用评估指南》
- 2026年中学物理力学试题及答案
- 深度解析(2026)《GBT 29781-2013电动汽车充电站通 用要求》
- 深度解析(2026)《GBT 29844-2013用于先进集成电路光刻工艺综合评估的图形规范》
- 《GBT 8170-2008数值修约规则与极限数值的表示和判定》(2026年)合规红线与避坑实操手册
- 《DLT 1203-2013火力发电厂水汽中氯离子含量测定方法 硫氰酸汞分光光度法》(2026年)合规红线与避坑实操手册
- 2026年生物识别门禁系统开发协议
- 浙江省温州市瓯海、乐清、苍南、永嘉2025年九年级二模英语(含答案)
- 2025北京育才中学高三(上)期中化学试题及答案
- 2025北京朝阳区高三(上)期中数学试题及答案
- 2026年机电维修电工考试试题及答案
- 对外投资合作国别(地区)指南 2025 秘鲁
- 义务教育均衡发展质量监测八年级综合试卷测试题
- 2026年检察院聘用制书记员招聘笔试试题(含答案)
- 2025年护理质控工作总结及2026年工作计划汇报
- 2025年宁夏事业单位招聘考试(面试)细选试题及试题答案解析
- 2025年微生物检验技术真题卷
- 2024年江苏省苏州市中考化学真题(解析版)
- GB/T 46585-2025建筑用绝热制品试件线性尺寸的测量
- 医药信息咨询公司管理制度
- AI助力城市轨道交通的多专业综合智能维护
评论
0/150
提交评论