EDA课程设计-数据缓冲器
- 格式:doc
- 大小:292.00 KB
- 文档页数:22
课程设计任务书
学生姓名:专业班级:电子科学与技术0903班
指导教师:工作单位:信息工程学院
题目: 8×9先进先出(FIFO)缓冲器设计
初始条件:
QuartusⅡ软件、微机、FPGA实验箱
设计任务:
深入研究和掌握FIFO的理论知识。
利用QuartusⅡ软件强大的编译和仿真功能,实现FIFO缓冲器的设计、仿真以及硬件功能实现。
设计一个8×9先进先出(FIFO)缓冲器,要求达到一下功能:
1、8位字深,9位字宽;
2、当读信号ready有效时,FIFO的输出data_out使能,当ready无效时,
FIFO的输出处于高阻态;
3、当写信号write有效时,9位款的寄存器进行写操作;
4、信号rdinc和wrinc被用来作为寄存器读和写指针递增,以指示该位寄
存器的读和写;
5、信号rdptclr和wrptclr复位读写指针指向FIFO的第一个寄存器;
6、data_in是将被载入到一个寄存器的数据;
7、ef、ff分别作为缓冲器空和满的标志(附加)。
时间安排:
第1天课程设计任务布置、选题、查阅资料
第2~5天设计,软件编程、仿真和调试
第6~8天实验室检查仿真结果,验证设计的可行性和正确性
第9~10天设计的硬件调试
第11天机房检查设计成果,提交设计说明书及答辩
指导教师签名:年月日系主任(或责任教师)签名:年月日
摘要 (1)
ABSTRACT (2)
1 绪论 (1)
2 QUARTUS II的使用 (1)
2.1 新建工程 (1)
2.2 程序编写 (1)
2.3 仿真 (1)
2.4 硬件调试 (2)
3 FIFO缓冲器原理 (3)
3.1 FIFO缓冲器的结构 (3)
3.2 FIFO的一些重要参数 (3)
3.3 FIFO的分类 (4)
3.4 FIFO缓冲器的应用 (5)
3.5 FIFO缓冲器空/满状态的算法 (5)
4 FIFO缓冲器设计方案 (6)
4.1方案一——FIFO定制 (6)
4.1.1 设计步骤 (6)
4.1.2 功能验证 (7)
4.2方案二——8个字长为9的变量构成寄存器 (9)
4.2.1 设计思想 (9)
4.2.2功能模块 (9)
4.2.3 硬件调试 (10)
4 结束语 (11)
参考文献 (12)
附录1 (13)
附录2 (15)
摘要
先进先出(FIFO)缓冲器是双端口数据存储器,其存储结构与RAM相同,仅存储方式存在差异。
本文详细介绍了基于FPGA开发环境Quartus II、用VHDL语言编程实现FIF O缓冲器的方法和过程。
利用FPGA的可编程性,拥有简洁而又多变的设计方法。
本设计实现了先进先出缓存器的一些基本功能,也把一些新的思路加入到设计中,通过仿真和实验箱实现了FIFO缓冲器的数据读写功能、读写指针移动和复位功能、缓冲器空、满指示标志功能。
本次课程设计中拟定了两种设计方案,使FIFO缓冲器性能得以优化,并且都进行了仿真和FPGA实现。
关键词:FIFO缓冲器,FPGA,Quartus II,VHDL
Abstract
First In First Out (FIFO) buffer is a dual-port data memory. It has the same storage structure with RAM, but differences in the storage pattern. This article describes the methods and processes of designing a FIFO buffer, which based on Quartus II -- the FPGA development environment. The design is programmed by VHDL language. Via the simulation and experiment, such FIFO buffer functions is achived, as data reading and writing, moving and resetting the read and write pointer, signage feature of empty and full. In addition, in order to enhancing the function and improve the storing speed of FIFO, the designer developed three design options and have carried out simulation and implementation on FPGA chip, so that FIFO buffer’s performance can be optimized.
Key words:FIFO buffer,FPGA,Quartus II,VHDL
1 绪论
随着电子工程和计算机科学(EECS)的迅猛发展,数字电路系统的发展也十分迅速。
电子器件在最近几十年经历了从小规模集成电路到中、大规模集成电路的发展历程。
从简单的可编程器件到高密度可编程器件。
设计方法也在从根本上转变。
由原来的手工设计发展到现在的电子设计自动化EDA(Electronic Design Automation)技术。
EDA技术就是依赖功能强大的计算机。
在EDA工具软件平台上.以硬件描述语言VHDL(Very High Speed Inte-grated Circuit Hardware Description Language)为系统逻辑捕述手段。
VHDL是一种全方位的硬件描述语言,包括系统行为级、寄存器传输级和逻辑门级多个设计层次,支持结构、数据流和行为3种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件描述语言的功能,整个自顶向下或自底向上的电路设计过程都可以用VHDL来完成。
可编程逻辑器件自20世纪70年代以来,经历了PAL、GAL、CPLD、FPGA几个发展阶段,其中CPLD、FPGA属高密度可编程逻辑器件,目前集成度以高达200万门/片,它将掩膜ASIC集成度高的优点和可编程逻辑器件设计生产方便的特点结合在一起,特别适合于样品研制和小批量产品开发,使产品能以最快的速度上市,而当市场扩大时,它可以和容易地转由ASIC实现,因此开发风险也大为降低。
CPLD/FPGA器件已成为现代高层次电子设计方法的实现载体。
Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在X P、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。
该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。
Quartus平台与Cadence、Exe-mplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。
改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。
Altera在Quartus II中包含了许多诸如SignalTap II、Chip Editor和RTL V -iewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。
2 QUARTUS II的使用
2.1 新建工程
双击桌面QUARTUS II图标进入主界面,单击软件主界面中File → New Project Wizard...开始新建一个工工程,根据提示选择存储路径,输入工程名,软件会默认顶层实体名与工程名相同并显示。
往下选择芯片,在此时选择Cyclone下的EP1C3T144C8,最后会显示所有选择结果,以供最后确认。
2.2 程序编写
单击File→New...,在弹出的窗口中选择新建VHDL File,然后在其中编写程序。
一般用三段式VHDL语言编写程序代码。
⑴库或程序包调用的说明部分;⑵实体说明部分;
⑶结构体描述模块功能;
编写完成程序代码后,将其以实体名保存,编译程序,若编译成功则继续向下进行。
将多个程序连起来成为创建顶层文件,可以由程序编写或者用画图来实现。
本课题最终用原理图画顶层文件,故还需要由VHDL File生成元件,以供画图使用。
在主窗口左侧Project Navigator下选择Files,在Software Files下找到需要生成元件的VHDL 文件,右键单击选择Create Symbol Files For Current File来生成元件。
元件生成之后就可以进行原理图绘制。
方法是:单击File→New...,在弹出的窗口中选择新建Block Diagram/Schematic File。
左键双击原理图,在弹出的Symbol窗口中选择元件,可以再软件自带的元件库中找常用元件,如果之前有通过VHDL File生成元件,还可以在窗口中的Project下找自己生成的元件。
选定元件,OK后将其放置在原理图上适当的位置,选好所有元件后,按照设计对元件进行连线,最后再加上输入输出端口并更改端口名,保存原理图进行编译,若成功则进入下一步,否则根据提示修改原理图直到编译成功。
2.3 仿真
单击File→New...,在弹出的窗口中选择新建Vector Waveform File。
左键双击图左边的空白处,在弹出的Insert Node or Bus窗口下单击Node Finder,在弹出的窗口中单击List,并将Nodes Found全部导到Selected Nodes,单击OK,仿真图上会显示所有的输入输出端口。
选定某一输入端口,在左边的工具条中选择适当的图标设置输入波形。
将所有的输入端口设置完毕后保存,单击Processing→Simulator Tool,Simulation Tool设置为Functional,
单击Generate Functional Simulation Netlist。
待其完成后选择Simulator Tool窗口下方的的Start,完成后,单击Open,仿真结果会覆盖在仿真图上。
根据波形检查是否实现要达到的功能。
2.4 硬件调试
单击主界面Assignments→Device...在弹出的Setting窗口下单击Device&Pin Option,在弹出的窗口中设置不是用的管脚为高阻态。
单击Assignments→Pins,对应实验箱上的管脚名进行设置,设置完毕后进行编译,软件会检测管脚设置有无错误。
设置无误单击Programmer,在实验箱与微机主机连接好并通电打开电源的前提下,即可以向实验箱中导入程序,进行硬件调试。
3 FIFO缓冲器原理
FIFO是英文First In First Out的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
3.1 FIFO缓冲器的结构
FIFO缓冲器一般由三部分构成,分别为写地址产生器、读地址产生器、双端寄存器。
各部分都有各自的时钟信号,有数据输入输出端口、读写操作控制信号、有缓冲空满标志位。
FIFO缓冲器一般结构简图如图2-1所示。
图2-1 FIFO缓冲器一般结构简图
3.2 FIFO的一些重要参数
FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它指的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。
FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。
如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。
在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。
在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度
大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。
一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。
而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。
满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:指向下一个读出地址。
读完后自动加1。
写指针:指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。
3.3 FIFO的分类
根据FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。
同步FIFO是指读时钟和写时钟为同一个时钟。
在时钟沿来临时同时发生读写操作。
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
异步FIFO缓冲器结构原理图如图2-2所示。
图2-2 异步FIFO缓冲器结构原理图
3.4 FIFO缓冲器的应用
FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为10 56Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。
另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。
3.5 FIFO缓冲器空/满状态的算法
FIFO设计的难点在于怎样判断FIFO的空/满状态。
为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。
在空的状态下不能进行读操作。
怎样判断FIFO的满/空就成了FIFO设计的核心问题。
由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。
构造一个指针宽度为N+1,深度为2^N字节的FIFO(为方便比较将格雷码指针转换为二进制指针)。
当指针的二进制码中最高位不一致而其它N位都相等时,FIFO为满(在Clifford E. Cummings的文章中以格雷码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MSB不同其他相同为满是一样的)。
当指针完全相等时,FIFO为空。
这也许不容易看出,举个例子说明一下:一个深度为8字节的FIFO怎样工作(使用已转换为二进制的指针)。
FIFO_WIDTH=8,FIFO_DEPTH= 2^N = 8,N = 3,指针宽度为N+1=4。
起初rd_ptr_bin和wr_ptr_bin均为“0000”。
此时FIFO中写入8个字节的数据。
wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。
当然,这就是满条件。
现在,假设执行了8次的读操作,使得rd_ptr_bin =“1000”,这就是空条件。
另外的8次写操作将使wr_ptr_bin 等于“0000”,但rd_ptr_bin 仍然等于“1000”,因此FIFO为满条件。
显然起始指针无需为“0000”。
假设它为“0100”,并且FIFO为空,那么8个字节会使wr_ptr_bin =“1100”,, rd_ptr_bin 仍然为“0100”。
这又说明FIFO为满。
4 FIFO缓冲器设计方案
方案一充分利用Quartus II 软件的强大集成环境,直接定制FIFO模块,系统提供现成的电路结构图、程序代码、仿真波形等文件。
只需用户简单的调用和设置就可以完成,非常方便快捷,而且准确。
方案二使用VHDL语言编写程序实现FIFO功能。
从提高代码有效率的角度出发,用8个向量为9的变量存储数据,并将读写操作同内部寄存器融合在一起编写。
整合模块,提高利用率。
4.1方案一——FIFO定制
4.1.1 设计步骤
直接Quartus II自带的FIFO利用设计步骤如下:
(1) 打开MegaWizard Plug-In Manager初始对话框。
在Tools菜单中选择MegaWizard Plug-In Manager,选择Create a new custom…项(如果要修改一个已编辑好的LPM模块,则选择Edit an existing custom…项),即定制一个新的模块。
单击Next按钮后在左栏选择Storage项下的FIFO,再选择Cyclone器件和VHDL语言方式;最后输入FIFO文件存放的路径和文件名:d:\sin_gnt\data_rom.vhd(定制的ROM 元件文件名),单击Next按钮。
(2)输出信号控制线。
选择full、empty、usedw。
(3)单击Next按钮后继续执行以下设置。
后面的设置基本都默认,直接单击NEXT,直至如下图所示(中间过程为默认设置)选中所有的文件,即可生成.vhd、.inc、.cmp、.bsf、. jpg等文件。
至此,FIFO宏定制设计完成。
下面检测验证其功能。
4.1.2 功能验证
打开工程中.jpg文件得到仿真波形图。
当写使能write=1,read=0时的时候,遇到第一个脉冲上升沿就将输入端口的001送到内部双端寄存器里面,第二个脉冲时把002送进去;之后读使能read=1,将第一个数001送到输出端口;read=0,写入第三个数003;再次读使能read=1,读出第二个数001。
当aclr=1时,地址清零。
在写入第一个数后,读指针加1等于写指针,故判为空。
其功能模块如下:
仿真波形图:
4.2方案二——8个字长为9的变量构成寄存器
4.2.1 设计思想
在缓冲器内部定义一个8 9的存储空间用于暂存数据。
初始状态读写指针都指向0号数寄存器(共8个)。
当输入通道打开时,每来一个脉冲(由外部按键提供),向缓冲期内输入一个9位的数,与此同时内部寄存器读指针加1,准备接受下一个需要暂存的数,下一个脉冲到来,再存一个数,读指针再加1……当输出通道打开时,每来一个脉冲输出一个9位数,写指针加1,准备输出下一个9位数,同理进行下一个数的输出……由于输入/输出数据是按需进行的,故设计脉冲由按键提供,为更好的进行控制,加一个消抖电路使其每按一次内部计数确定加1。
4.2.2功能模块
本设计共由两个部分组成:先入先出缓存器、分频器。
其中先入先出缓存器模块包括写操作、读操作:
写操作:当wrptclr为0时,首先将写地址wrinc清零。
当wrptclr为1且写使能write =1、读使能无效ready=0时,将data_in写入寄存器。
程度段如下:
write_prog:process(wrptclr,clk)is
begin
if(wrptclr='0')then
wrinc<=(others=>'0'); wradd<=wrinc;
elsif (clk'event and clk='1') then
if (write='1') then
case wrinc is
when"000" => q0<=data_in;
………………
读操作:与写操作算法相同,只是读指针为rdinc,读指针清零控制变量rdptclr。
if (rdptclr='0') then rdinc<=(others=>'0');
elsif (clk'event and clk='1') then
if (ready='1') then --加入当ready无效时,输出处于高阻态
case rdinc is
when "000" => data_out <= q0; …………
else data_out<="ZZZZZZZZZ";
分频器原理如下:
为了配合消抖电路,取延时为5ms,即使得采样频率为5ms,由此根据f=1/T,算得脉冲频率为200Hz,而实验箱上提供的是20M的时钟频率,故要对时钟进行分频。
程序中用内部计数器计算到来的脉冲数,脉冲数小于50000时输出为0,否则输出为1,同时计到100000时计数器清零。
整体原理图如下:
4.2.3 硬件调试
选择下进行芯片设置,选择芯片选用设置好后进行引脚设置,一切选择好后将程序下载入实验箱上,接通电源,用按键来控制它的脉冲输入,用拨码开关来控制它的输入序列,用发光二极管(即试验箱上的灯)作为它的输出,以观察灯的的变化来观察FIFO的输出。
先将输入序列设置好将wrpclr rdpclr置1,将write 置1,此时灯的状态与输入序列相同,再将ready置1,改变输入序列,再将ready 置0,write置1,此时灯的状态与改后输入序列相同,从而达到缓冲的状态
4 结束语
两周时间转眼就过,电子线路EDA课程设计也接近的尾声。
在此次课程设计,我认为最重要的就是认真的研究老师给的题目,先搞懂要做什么达到什么样的效果,再进行原理分析写出各个模块程序这样会事半功倍。
在这两周来,也总结出了自己很多问题,第一、不够细心比如由于粗心大意敲错代码,由于对课本理论的不熟悉导致编程出现错误。
第二,思路不够严谨,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。
第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。
同时自己查阅资料获取对自己有用的信息的能力有所提高
感谢学校给我们这次机会,锻炼了我们的动手能力。
通过这次课设让我明白了理论和实际操作之间差距,而且也让我很明确得意识到自己在EDA有很多的不足,以后应该多钻研一下。
同时也感谢指导老师在设计过程中的辅导以及同学的帮助。
再次感谢老师的辅导以及同学的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。
课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。
参考文献
[1] 潘松.黄继业,EDA技术与VHDL(第二版).北京:清华大学出版社,2007.01
[2] 黄仁欣,EDA技术实用教程. 北京:清华大学出版社,2006.09
[3] 汪国强,EDA技术与应用. 北京:电子工业出版社,2007.04
[4] 宋嘉玉,孙丽霞.EDA实用技术.北京:人民邮电出版社,2006.
[5] 齐洪喜,陆颖.VHDL电路设计实用技术.北京:清华大学出版社,2004.
附录1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY FIFO IS
PORT
(
aclr : IN STD_LOGIC ;
clock : IN STD_LOGIC ;
data : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
rdreq : IN STD_LOGIC ;
wrreq : IN STD_LOGIC ;
empty : OUT STD_LOGIC ;
full : OUT STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (8 DOWNTO 0);
usedw : OUT STD_LOGIC_VECTOR (2 DOWNTO 0)
);
END FIFO;
ARCHITECTURE SYN OF fifo IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (2 DOWNTO 0);
SIGNAL sub_wire1 : STD_LOGIC ;
SIGNAL sub_wire2 : STD_LOGIC_VECTOR (8 DOWNTO 0);
SIGNAL sub_wire3 : STD_LOGIC ;
COMPONENT scfifo
GENERIC (
add_ram_output_register : STRING;
intended_device_family : STRING;
lpm_numwords : NA TURAL;
lpm_showahead : STRING;
lpm_type : STRING;
lpm_width : NA TURAL;
lpm_widthu : NA TURAL;
overflow_checking : STRING;
underflow_checking : STRING;
use_eab : STRING
);
PORT (
usedw : OUT STD_LOGIC_VECTOR (2 DOWNTO 0);
rdreq : IN STD_LOGIC ;
empty : OUT STD_LOGIC ;
aclr : IN STD_LOGIC ;
clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (8 DOWNTO 0);
wrreq : IN STD_LOGIC ;
data : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
full : OUT STD_LOGIC
);
END COMPONENT;
BEGIN
usedw <= sub_wire0(2 DOWNTO 0);
empty <= sub_wire1;
q <= sub_wire2(8 DOWNTO 0);
full <= sub_wire3;
scfifo_component : scfifo
GENERIC MAP (
add_ram_output_register => "ON",
intended_device_family => "Cyclone",
lpm_numwords => 8,
lpm_showahead => "OFF",
lpm_type => "scfifo",
lpm_width => 9,
lpm_widthu => 3,
overflow_checking => "ON",
underflow_checking => "ON",
use_eab => "ON"
)
PORT MAP (
rdreq => rdreq,
aclr => aclr,
clock => clock,
wrreq => wrreq,
data => data,
usedw => sub_wire0,
empty => sub_wire1,
q => sub_wire2,
full => sub_wire3
);
END SYN;
附录2
FIFIO的程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity FIFO is
port(ready,write : in std_logic;
data_in : in std_logic_vector(8 downto 0);
clk : in std_logic;
rdptclr,wrptclr : in std_logic;
data_out : out std_logic_vector(8 downto 0));
end FIFO;
architecture bhv of FIFO is
signal rdinc,wrinc : integer range 0 to 7;
signal rom0,rom1,rom2,rom3,rom4,rom5,rom6,rom7 : std_logic_vector(8 downto 0); signal r_w : std_logic_vector(1 downto 0);
begin
process(clk,data_in,ready,write,rdptclr,wrptclr)
begin
r_w<=ready&write;
if(rising_edge(clk))
then case r_w is
when "00"|"11" => data_out<="ZZZZZZZZZ";
when "01" => if(wrptclr='1') then wrinc<=0;
else case wrinc is
when 0 => rom0<=data_in;
when 1 => rom1<=data_in;
when 2 => rom2<=data_in;
when 3 => rom3<=data_in;
when 4 => rom4<=data_in;
when 5 => rom5<=data_in;
when 6 => rom6<=data_in;
when 7 => rom7<=data_in;
when others => null;
end case;
wrinc<=wrinc+1;
end if;
when "10" => if(rdptclr='1')
then rdinc<=0;
else case rdinc is
when 0 => data_out<=rom0;
when 1 => data_out<=rom1;
when 2 => data_out<=rom2;
when 3 => data_out<=rom3;
when 4 => data_out<=rom4;
when 5 => data_out<=rom5;
when 6 => data_out<=rom6;
when 7 => data_out<=rom7;
when others => null;
end case;
rdinc<=rdinc+1;
end if;
end case;
end if;
end process;
end bhv;
分频器的程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity fenpin is
port(clkf:in std_logic; q1:out std_logic);
end fenpin;
architecture behave of fenpin is
signal q:std_logic_vector(25 downto 0);
begin
process(clkf)
begin
if rising_edge(clkf)then
if(q=100000)then
q<=(others=>'0');
else q<=q+1;
if q<50000 then
q1<='0';
else q1<='1';
end if;
end if;
end if;
end process;
end behave;
本科生课程设计成绩评定表
指导教师签字
年月日。