cc2530定时器和捕获比较_【正点原子FPGA连载】第六章定时器IP核-摘自【正点原子】开拓者 Nios II开发指南...

1)实验平台:正点原子开拓者FPGA 开发板

2)摘自《开拓者 Nios II开发指南》关注官方微信号公众号,获取更多资料:正点原子

3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/index.html

http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)

第六章定时器IP核

这一章中,我们将会讲到 Qsys 系统中一个比较重要的 IP 核——Interval Timer。拥有 Avalon

总线接口的 Interval Timer 核是,基于 Avalon 技术(Avalon-based)处理器系统中的一种计时器。

它可被用作系统周期性的时钟源,还具有计时器、“看门狗”等功能。本章包括以下几个部分:

6.1 简介

6.2 实验任务

6.3 硬件设计

6.4 软件设计

6.5 下载验证

简介

Timer 核的结构图如下所示:

图 6.1.1 Interval Timer核结构图

从图中我们可以看出 Timer 核以下的功能:

⚫ 与 6 个 16 位寄存器连接的 Avalon-MM 接口

⚫ 可选的脉冲输出:能被用作周期脉冲产生器

所有的寄存器都是 16 位位宽,这样使得与 16 位以及 32 位的处理器都相兼容。有些寄存

器只有在配置了之后才会存在于硬件中。例如,如果核被配置成固定周期,硬件中则没有周期

寄存器(period registers)。

下面的内容描述了 interval timer 核的基础特性:

⚫ 类似于 Nios II 处理器的 Avalon-MM 主设备可以通过写控制寄存器(control register)

来完成以下任务:

1. 启动和停止定时器

2. 使能/禁止 IRQ

3. 明确累减计数一次或重复性累减计数

⚫ 处理器通过读状态寄存器(status register),能够得知定时器所处的状态

⚫ 处理器可以通过给周期寄存器(period registers)写数值来指定定时器的周期

⚫ 内部计数器累减到 0,然后会从周期寄存器(period registers)获取数值,继续累减计

⚫ 处理器可以通过一些操作来获取当前计数器(counter)的值:先给其中一个捕获寄存

器(snap registers)写数据,然后读捕获寄存器(snap registers)来获得完整的值。

⚫ 当计数器计数到 0 的时候,以下的事件可能会触发:

1. 如果 IRQ 被使能,此时会触发 IRQ

2. 可选的一个时钟周期的脉冲输出

3. 可选的看门狗输出,复位系统

(1) 寄存器相关简介

32 位定时器的寄存器概述表如下图所示:

图 6.1.2 寄存器概述表

表中的(1)指的是保留部分,读它会返回未定义的值。进行写操作要写 0

表中我们可以看出,

Timer 核有 6 个寄存器,接下来我们会对这些寄存器进行详细的讲解。

status 寄存器(状态寄存器)

图 6.1.3 status寄存器概述表

4358dc06b126836413fec79c01e61594.png

bbf8d6e0640cb88fdcc07ba15d5af1a0.png

control 寄存器(控制寄存器)

图 6.1.4 control寄存器概述表

73f8bfbc02a1241bb4b5a1064621f784.png

注:给 START 位以及 STOP 同时写 1 会造成未定义的影响。

period 寄存器(周期寄存器)

所有的 period 寄存器一起存储着周期极大值。发生以下事件时,内部计数器会装载 period

寄存器中存储的值:

⚫ 对任一一个周期寄存器(period registers)进行写操作

⚫ 内部计数器计数到 0

定时器的实际周期要比存储在周期寄存器(period registers)中的值多一个周期,这是因

为计数器认定 0 值也算一个周期。

对任一一个 period 寄存器进行写操作都会使内部定时器停止运行,除非硬件配置中没有

选中 Start/Stop control bits。

Snap 寄存器(捕获寄存器)

主设备可通过对 snap 寄存器进行写操作来获得内部计数器的当前值。当一个写操作发生

后,计数器中的值会被赋值到 snap 寄存器中。无论定时器是否正在运行,获取当前计数器中

的值的操作都会进行。这种操作不会影响到内部计数器的运行状况。

(2)中断操作

当 control 寄存器的 ITO 位置 1,且内部计数器计数到 0 的时候,会触发 IRQ。回应 IRQ 有

两种操作:

⚫ 清除 status 的 TO 位

⚫ 清除 control 寄存器的 ITO 位来禁止中断

没有回应 IRQ 会产生未定义的结果。

(3)硬件配置内容

如图为 Timer 核的配置界面:

08196a9a872a65ce1cfc463fd5ffa601.png

图 6.1.5 Timer核配置界面

图中红框中的选项能影响到 interval timer 核的硬件结构。比较便利的是,预先配置列表提

供了几个预定义的硬件配置,例如:

⚫ Simple periodic interrupt(简单周期中断)——这个配置对于只需要周期性地触发 IRQ

的系统,是十分有用的。周期是固定的,定时器无法被停止。但是 IRQ 是可以被禁止

的。

⚫ Full-featured(全功能)——这个配置对于这样的嵌入式处理器系统是十分有用的:要

求定时器能被处理器启动或停止,但能禁止 IRQ。

⚫ Watchdog(看门狗)——这个配置对于这种系统是比较便利的:需要“看门狗”定时

器去复位停止响应的系统

在选择其中的一个选项的时候,需要先双击该选项,然后点 Apply。接下来我们来讲解其

他的配置项目。

1.Timeout Period(超时周期)

超时周期决定了周期寄存器(period registers)的初始值。当没有选中 Fixed period(固定

周期)选项的时候,处理器可以通过给周期寄存器(period registers)赋值来改变周期的值(在

软件中)。如果选中了 Fixed period(固定周期)选项,那么周期是固定的,且无法在软件中更

改。超时周期(Timeout Period)是定时器频率(Timer Frequency)的整数倍。定时器频率固定

为系统时钟的频率。定时器频率设置的单位可以是μs (microseconds), ms (milliseconds), seconds ,

或者 clocks(系统时钟周期个数)。

⚫ Period:定时器周期,没有选中 Fixed period 选项的话,可以在软件中修改。若软件中

没有修改操作,period 中的值就会作为超时周期(Timeout Period)

⚫ Units:周期的单位,可以是μs、ms、seconds、clocks。

2. Counter Size(计数器大小)

Counter Size 设置决定了定时器的位宽,它可以设置成 32 位或 64 位。一个 32 位的定时器

拥有 2 个 16 位的 period registers(周期寄存器)。64 位的定时器拥有 4 个 16 位的 period

registers(周期寄存器)。

3. Registers(寄存器)

⚫ No Start/Stop control bits:没有选中该选项时,主设备可以通过写 control 寄存器中的

START 和 STOP 位来启动或者停止定时器。当选中该选项后,定时器会一直运行。当

硬件中使能了“watchdog”功能后,无论 No Start/Stop control bits 选项如何,control

寄存器中 START 位有效。

⚫ Fixed period:选中该选项后,就无法在软件中更改定时器周期,且定时器周期为

Timeout Period 处设置的结果;若没有选中该选项,可以通过在软件中给 period registers

赋值来更改定时器周期(timeout Period)

⚫ Readable snapshot:选中该选项后,主设备可以读取当前的计数值。没有选中该选项

时,硬件中将不会存在 snap 寄存器,且读 snap 寄存器会返回未定义的值。在这种配

置下,计数器(counter)的状态只能通过 status 寄存器或 IRQ 信号之类的来观测

4. Output signals(输出信号)

⚫ System reset on timeout(watchdog):这个选项被选中后,核的 Avalon-MM 从端口会

包含 resetrequest(复位请求)信号。当定时器计数到 0 时,resetrequest 信号会持续一个

时钟周期的高电平,因此使得系统复位。在复位的时候,内部定时器是停止的。写 control

寄存器的 START 位会启动定时器。

没有选中该选项的时候,resetrequest(复位请求)信号不会被产生。

⚫ Timeout pulse(1 clock wide):选中这个选项后,当定时器计数到 0 时,会输出

timeout_pulse 信号高电平一个周期。没有选中该选项的时候,timeout_pulse 信号不会被产

生。

实验任务

本节实验任务是:在 Qsys 系统中通过使用官方 Interval Timer IP 核实现定时器的功能,并

使蜂鸣器周期性地发声。

硬件设计

创建 Quartus II 工程

首先要创建 Quartus II 工程,这里不再赘述。

创建 Qsys 系统

实验中要用到的 IP 核有:

clk(时钟)、niosII(处理器)、onchip_ram(片内存储)、jtag_uart、

sysid_qsys、PIO 、Interval Timer(定时器)。其中只有 Interval Timer IP 核、需要讲解一下,其

他的 IP 核都是按照以前的配置方法进行设置,本节就讲讲如何配置 Timer IP 核。

从 Library 中选择 Timer IP 核并打开,出现以下界面:

fb3f365e3d286d7555d8283d6687eaf6.png

图 6.3.1 Timer核的配置界面

这里我们使用默认设置,直接点击【Finish】即可。

然后,我们打开 niosII IP 核配置界面,因为这里只用了 onchip_ram IP 核存储代码和指令,

所以需要对相关的设置进行修改。如图 6.3.2 所示,在 Reset Vector 处将 Reset vector memory

处的选项选为 onchip_ram,同时在 Exception Vector 处也将 Exception vector memory 处的选项

选为 onchip_ram。需要注意的是, onchip_ram IP 核添加之后,nios II IP 核的 Reset Vector 和

Exception Vector 选项中才会出现 onchip_ram 选项。

dbef783275bf4987a399eeb87603b867.png

图 6.3.2 nios II IP核设置界面

然后是 PIO IP 核,由于我们只需要和蜂鸣器这一个外部设备进行通信,所以只需要设置一

个位宽为 1 的 PIO IP 核,如下图所示。

ba9694f47ac298533932f6d3a301d1d5.png

图 6.3.3 PIO IP核设置界面

添加完 IP 核后就可以开始连线,大家若是不熟悉怎么连线,可以照着下面完成的 Qsys 系

统界面图连。需要注意的是,要将 PIO IP 核的端口引出来,如图 6.3.4 所示。引出端口的方法

是双击图 6.3.4 中 IP 核的 Export 一栏的红框位置,然后修改名称,按下 Enter 键即可。

然后,点击 System→Assign Base Addresses 让系统自动分配地址,这里最好把 onchip_ram

的地址锁住,这是因为这个 IP 核里存储着指令,最好不要让其地址发生变动。锁住地址的方

法是先点击 IP 核,然后点击右键→Lock Base Address。我们还可以将各个 IP 核的名称修改

一下。最后就是生成系统了,操作可以按照“Hello,World”文档里的进行。

6fa587b4a73a8511b286ff4f51e87ab5.png

图 6.3.4 nios II IP核设置界面

集成 Qsys 系统

这一步依然可以按照“Hello,World”文档里的操作进行。

下面将 Quartus II 工程中的顶层代码贴出来。

1 module top_Timer(

2 input sys_clk ,

3 input sys_rst_n ,

4

5 //蜂鸣器

6 output beep //beep

7 );

8

9 //wire define

10 wire clk_100m; //100mHZ 时钟

11

12 //例化 pll 模块,用以产生

13 pll pll_inst (

14 .inclk0 (sys_clk) ,

15 .c0 (clk_100m)

16 );

17

18 //例化 Qsys 系统

19 Timer u0 (

20 .clk_clk (clk_100m), // clk.clk

21 .reset_reset_n (sys_rst_n), // reset.reset_n

22 .pio_beep_export (beep) // pio_beep.export

23 );

24

25 endmodule

编译和下载

这时,我们便能够进行编译查错了,我们可以通过 Quartus II 软件菜单栏中的【Processing】

→【Start Compilation】来进行编译,也可以通过快捷栏中的快捷键进行编译。

接下来我们就需要进行配置 IO,分配管脚。首先,点击 Quartus II 软件菜单栏中的

【Assignment】→【Device】,然后我们在 Device 界面中找到【Device and Pin Options…】进入

图 6.3.5 所示页面配置 IO。将未使用引脚设置为高阻输入(As input tri-state),这样上电后

FPGA 的所有不使用引脚都将进入高阻抗状态。

6d736e94064940f8eac5891c0a788f22.png

图 6.3.5 未使用引脚设置界面

接下来,将一些 IO 设置成普通 IO,通过双击红框位置,将一个个 Value 的值修改过来。

如图 6.3.6 所示。

7f247d452e09cdd0e82ea70978f32ea0.png

图 6.3.6 IO设置界面

我们通过 Quartus II 软件菜单栏中的【Assignments】→【Pin Planner】选项分配引脚。需

要说明的是,由于蜂鸣器需要的驱动电流较大,使用默认 8mA 的驱动电流有可能出现蜂鸣器

发声较小的情况,解决方法是将蜂鸣器输出的驱动电流修改成 12mA 或者是 16mA,如图 6.3.7

所示。

f620aace408b6aeb28278358c42e7d76.png

图 6.3.7 引脚分配界面

最后我们再进行一次全编译,成功编译硬件系统后,将产生用于配置 FPGA 的 top_Timer.sof

文件。下面我们就来说明一下将.sof 文件下载到 FPGA 目标器件的步骤。

(1)将下载器一端连接电脑,另一端与开发板上对应端口连接,最后连接电源线并打开

电源开关。开拓者开发板实物图如下所示:

3560edf6f556bfbc9b5f0db1426e60d4.png

图 6.3.8 开发板实物图

接下来我们下载程序。工程打开后通过点击工具栏中的“Programmer”图标打开下载界面,

通过“Add File”按钮选择 top_Timerparoutput_files 目录下的“top_Timer.sof”文件。

开发板电源打开后, 在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当前

的硬件连接为“USB-Blaster[USB-0]”。然后点击“Start”将工程编译完成后得到的 sof 文

件下载到开发板中,如图 6.3.9 所示:

d52311c5c7c503cf751334cd40a21d06.png

图 6.3.9 程序下载完成界面

至此,硬件部分设计完成,下面开始基于 Nios II SBT for Eclipse 的软件部分的设计。

软件设计

我们通过 Quartus II 软件菜单栏中的【Toos】→【Nios II SBT for Eclipse】,来启动 NiosII SBT

for Eclipse 软件。打开 Nios II SBT for Eclipse 软件后,会弹出 Workspace Launcher 页面。我们这

里将工作空间设置为 top_UART qsys 路径下的 software 文件夹,如图 6.4.1 所示。

2d10aee3cc3a58f414903e42b700d2a1.png

图 6.4.1 设置工作空间

设置好工作空间后,我们点击【OK】进入 Nios II SBT for Eclipse 软件主界面中,在该页面

我们通过单击菜单栏中的【File】→【New】→【Nios II Application and BSP from Template】,来

新建工程,如图 6.4.2 所示。

fc0211ee5b0587c6c17c1b254fc33305.png

图 6.4.2 新建Nios II SBT for Eclipse 工程

单击【…】按钮来选择 top_Timerqsyshardware 下的 top_ Timer.sopcinfo 文件,即指向

当前硬件设计系统。Nios II SBT for Eclipse 软件会自动识别 Qsys 系统中 CPU 的名称,所以 CPU

name 一项会自动生成。接下来,要给 Nios II SBT for Eclipse 软件中的工程命名,这里的名称没

有 特 殊 要 求 , 我 们 这 里 名 为 UART 。 然 后 将 工 程 存 放 的 位 置 修 改 为

top_TimerqsyssoftwareTimer。注意不要漏掉了“Timer”,不然生成系统的时候会报错。最

后我们来看下 Project template 窗口,该窗口中陈列的都是已经设计好的软件工程。我们可以

从中选择一个,作为自己的工程的模板来使用。当然也可以选择 Bland Project(空白工程),

就需要自己写所有的代码。这里我们选择的是 Hello World 模板工程,然后我们在它的基础上

进行修改,这样比空白工程更加方便。

设置完工程后,直接点击【Finish】完成工程创建。然后,在 Nios II SBT for Eclipse 软件的

左侧 Project Explorer 窗口中有两个工程:Timer 和 Timer _bsp。其中 UART 是 C/C++应用工程,

而 UART_bsp 是描述 Qsys 系统硬件细节的系统库。打开 UART 工程里的 hello_world.c 文件,

出现如图 6.4.3 所示的图。

84271b8013de2c574d52404e6465be33.png

图 6.4.3 hello_world工程代码图

由代码可知,下载程序到开发板后会在窗口上输出 “Hello from Nios II!”。我们在这里要

验证之前创建的 Qsys 系统是否能正常工作。验证方法是先编译 UART 工程,然后将工程模板程

序下载到开发板上,看是否能正常运行。再次之前,需要先简化代码。方法和“Hello,World”

实验里一样是一样的,大家可以照着操作,这里不再赘述。

优化完代码之后,再编译一次 Timer 工程,会出现以下的界面。这表示编译通过,可以将

程序下载到开发板上了。

45b2ac5fb3b7839f14f495224e8a525b.png

图 6.4.4 编译通过后的console窗口

这时大家点击【Run As】→【Nios II Hardware】,然后点击【Target Connection】标签,然

后在 Target Connection 窗口中点击【Refresh Connections】按钮后。这时软件便会自动识别我

们开发板上的 Qsys 系统,并显示 Qsys 系统的相关信息。我们接着点击【Run】,软件会把 irq.elf

文件下载至开发板中运行起来。更加详细的图和文字描述,可以在“Hello,World”实验的下载

验证部分查看。

这时,若之前创建的 Qsys 系统无误,代码下载完成后在 Nios II console 窗口会显示“Hello

from Nios II!”字符,如下图所示。

91545df9096298cd4872b2dfd8f09ef3.png

图 6.4.5 下载代码后的console窗口

验证完 Qsys 系统是否能正常运行之后,我们就可以开始软件部分的设计了。这时只需要

在当前的代码窗口修改代码就可以了。代码如下所示。

1 #include "system.h" //系统头文件

2 #include "altera_avalon_timer_regs.h" //定时器头文件

3 #include "altera_avalon_pio_regs.h" //PIO 头文件

4 #include "sys/alt_irq.h" //中断头文件

5 #include "unistd.h" //延迟函数头文件

6 #include <stdio.h> //标准的输入输出头文件

7

8 alt_u8 i=0;

9 alt_u32 timer_isr_context; //定义全局变量以储存 isr_context 指针

10 void Timer_initial(void); //定时器中断初始化

11 void Timer_ISR_Interrupt(void* isr_context , alt_u32 id); //定时器中断服务子程序

12

13 int main(void)

14 {

15 alt_u8 beep = 0x0; //初始化让 beep 静音

16 Timer_initial(); //初始化定时器中断

17 printf("stand by n");

18 while(1)

19 {

20 if(i == 1)

21 {

22 IOWR_ALTERA_AVALON_PIO_DATA(PIO_BEEP_BASE, beep);//驱动 beep 的 IO

23 beep = ~beep;

24 i = 0;

25 }

26 }

27 }

28

29 //初始化定时器中断

30 void Timer_initial(void)

31 {

32 //改写 timer_isr_context 指针以匹配 alt_irq_register()函数原型

33 void* isr_context_ptr = (void*) &timer_isr_context;

34 //设置 PERIOD 寄存器

35 //PERIODH | PERIODL = 计数器周期因子 * 系统时钟频率因子 - 1

36 //PERIODH | PERIODL = 1s*100M - 1 = 99999999 = 0x05F5_EOFF

37 IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE, 0x05F5);

38 IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE, 0xE0FF);

39 //设置 CONTROL 寄存器

40 IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE,

41 ALTERA_AVALON_TIMER_CONTROL_START_MSK | //0x4,START = 1,计数器开始运行

42 ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | //0x2,CONT = 1,计数器连续运行直到 STOP 位被置 1

43 ALTERA_AVALON_TIMER_CONTROL_ITO_MSK); //0x1,ITO = 1,产生 IRQ

44 //注册定时器中断

45 alt_ic_isr_register(

46 TIMER_IRQ_INTERRUPT_CONTROLLER_ID, //中断控制器标号,从 system.h 复制

47 TIMER_IRQ, //硬件中断号,从 system.h 复制

48 Timer_ISR_Interrupt, //中断服务子函数

49 isr_context_ptr, //指向与设备驱动实例相关的数据结构体

50 0x0); //flags,保留未用

51 }

52

53 //定时器中断函数

54 void Timer_ISR_Interrupt(void* timer_isr_context, alt_u32 id)

55 {

56 //用户中断代码

57 i = 1;

58 //应答中断,将 STATUS 寄存器清零,ALTERA_AVALON_TIMER_STATUS_TO_MSK=0x1

59 IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,~ALTERA_AVALON_TIMER_STATUS_TO_MSK);

60 }

代码的第 13 行至第 27 行是主函数。主函数中第 16 行代码完成了初始化中断的任务,完

整的初始化中断函数在代码的第 30 行到第 51 行。在初始化中断的时候,需要给 PERIOD 寄存

器赋初值,这是在代码的第 37 行和第 38 行完成的。PERIOD 寄存器初值的计算公式已经包含

在注释中了。然后是使能中断,并设置定时器的运行模式,也就是给 control 寄存器(控制寄

存器)相应的位写 1,这个操作在代码的第 40 行至 43 行完成。接下来在代码的第 45 行至代

码的第 50 行注册定时器中断。在主函数的第 18 行至第 26 行,当 i 等于 1 的时候,将变量 beep

中存储的值输送给 PIO 核的 data 寄存器,并驱动与蜂鸣器相连的引脚,以此来控制蜂鸣器的

状态。然后将 beep 的值取反,并将 i 的值置 0。在定时器的运行过程中,每当计数到 0 的时

候,会触发 IRQ。在中断函数中,首先会将 i 的值置 1,然后给 status 寄存器写 0 来应答 IRQ。

中断函数的这些操作在代码的第 54 行至第 60 行完成。

修改完代码的窗口如下所示:

190916192dc73341a5803d00762b21a8.png

图 6.4.6 修改后的工程代码图

代码修改完成后,大家记得要点一下快捷菜单中的【Save】,或者菜单栏中的【File】→

【Save】,来保存修改后的程序。

下载验证

现在可以编译 Timer 工程了。右键 Timer 工程,点击 build project。稍等片刻,Console 窗

口显示的内容如下图所示,这表示工程编译成功。

23879c1dd8348db4aede4fcc074f6abe.png

图 6.5.1 编译工程后的console窗口图

这时大家右键 Timer 工程,点击【Run As】→【Nios II Hardware】,代码就被下载到开发

板上了。然后大家就能观察到,蜂鸣器会周期性地鸣叫,说明我们本次实验下载验证成功。

altera_ug_fifo.pdf audio_dac_fifo.rar FIFO文应用笔记.pdf FIFO基础知识.doc FPGASoPC软硬件协同设计纵横谈.pdf FPGA的VGA视频输出工程文件// freedev_vga FPGA的VGA视频输出工程文件.rar FreeDev FPGA音频开发环境和平台构建.pdf Nios系统基础上的UItra DMA数据传输模式.doc SD_Card_Audio// Audio_DAC_FIFO_altera的ip核 DE2_SD_Card_Audio sd_audio_aic23.rar SOPC自定义FIFO接口与DMA数据传输.pdf 什么是FIFO.doc 关于fifo的一些概念其quartus IIIP的使用.doc 在NIOS-II 系统AD 数据采集接口的设计与实现.doc 基于Avalon总线的TFT LCD 控制器的设计.doc 基于FPGA+PCI的并行计算平台实现 .doc 基于LPM的高速FIFO的设计.doc 基于NiosII的图像采集和显示的实现.doc 基于SOPC的扭振信号测量系统实现研究.doc 基于嵌入式Linux的 TFT LCD IP及驱动的设计.doc 异步FIFO的VHDL设计.doc 采用FPGA的高速数据采集系统.doc 非IP核相关FIFO设计// FIFO技术在SDH数字交叉连接芯片设计的应用.pdf KPCI-817数据采集卡.pdf PCI-8325光电隔离型模入接口卡技术说明书.doc USB7325高速光电隔离型模入数据采集模块技术说明书.doc 一款低功耗异步FIFO的设计与实现.pdf 一种异步FIFO的设计方法.pdf 关于异步FIFO设计的探讨.pdf 利用FPGA实现异步FIFO设计.doc 基于DSP的高速数据采集与处理系统.pdf 基于FPGA异步FIFO的研究与实现.pdf 基于FPGA的异步FIFO硬件实现.pdf 基于FPGA的异步FIFO设计.pdf 基于FPGA的高速异步FIFO存储器设计.pdf 基于VerilogHDL的异步FIFO设计与实现.pdf 异步FIFO亚稳态问题.doc 异步FIFO结构.pdf 异步FIFO结构及FPGA设计.pdf 怎样对FIFO、RAM读写.doc 读写数据宽度不同的异步FIFO设计.PDF 高速异步FIFO的实现.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值