如何利用VHDL阳台设计图片大全5位BCD/二进制码变换电路

如何用VHDL语言编写一个模为40,两位8421BCD码输出的减法计数器?_百度知道
如何用VHDL语言编写一个模为40,两位8421BCD码输出的减法计数器?
我有更好的答案
use ieee.std_logic_arith.use ieee.std_logic_1164.use ieee.std_logic_unsigned.entity mo40 is port(clk,rst:in std_
jinw:out std_
y:out std_logic_vector(7 downto 0));end mo40;architecture shu of mo40 isbeginprocess(clk,rst)variable temp:std_logic_vector(7 downto 0);beginif rst='0'thentemp:=&&;elsif clk'event and clk='1' thenif temp=&& thentemp:=&&;jinw&='1';elsetemp:=temp-'1';jinw&='0';y&=
采纳率:100%
为您推荐:
其他类似问题
8421bcd码的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。如题,fpga 多位bcd转二进制的vhdl程序?
可以给你个思路:
每次读取4位,用conv_integer到整数,再移4位,然后此次读取的4位转化后乘以10加上原来的,
最后得到这个数据的整数表达,然后用conv_std_logic_vector转化为二进制。
希望能帮助你。
你看下你主程序最后的输出端口是定义成什么,是整数,还是std_logic型
你调用的三个波行输出 的类型两个是整数,一个是std_logic型 建议你把全部输出...
你试试看。
module Div20x (rst, clk, cet, cep, count,tc);
//TITLE 'Divide-by-20 Counte...
51串口每次只是接收8位数据。
16位数据,在发送之前,分解一下,分别传送即可。
希望我的回答能帮助你!!
答: 在国外能使用第三方支付软件吗?
答: 3、网络技术基于标准协议的(如SNMP和ITSM等)的应用于企业网和行业专网的信息服务管理和网络管理软件,包括监控软件、IP业务管理软件等;ISP、ICP的增值...
答: 某些ADSL调制解调器使用USB接口与电脑相连,需要在电脑上安装指定的软件以添加虚拟网卡来进行通信
海鸟的种类约350种,其中大洋性海鸟约150种。比较著名的海鸟有信天翁、海燕、海鸥、鹈鹕、鸬鹚、鲣鸟、军舰鸟等。海鸟终日生活在海洋上,饥餐鱼虾,渴饮海水。海鸟食量大,一只海鸥一天要吃6000只磷虾,一只鹈鹕一天能吃(2~2.5)kg鱼。在秘鲁海域,上千万只海鸟每年要消耗?鱼400×104t,它们对渔业有一定的危害,但鸟粪是极好的天然肥料。中国南海著名的金丝燕,用唾液等作成的巢被称为燕窝,是上等的营养补品。
嫌麻烦就把你洗衣机的型号或断皮带,拿到维修点去买1个,自己装上就可以了(要有个小扳手把螺丝放松,装上皮带,拉紧再紧固螺丝)。
你用的是工行的卡吗?到工行网站问了一下,下面是它们版主的回答——您好~
1、您可以拨打95588或通过网上银行等渠道查询消费明细。
2、若您的信用卡开通了网上银行。请您按照以下地址进行登录。工行网站地址: 点击“个人网上银行登录”或工行个人网上银行地址: 按照系统提示输入相关信息后即可登录。
“网页错误”请您进行以下操作:
(1)打开IE浏览器,选择“工具”菜单--&“Internet选项”--&“高级”标签--&点击“还原默认设置”,点击“确定”后关闭所有IE浏览器窗口;
(2)打开IE浏览器,选择“工具”菜单--&“Internet选项”--&“常规”标签--&Internet临时文件设置中的“检查所存网页的较新版本”选择“每次访问此页时检查”。并在Internet临时文件设置中点击“删除文件”,在“删除所有脱机内容”前打勾后点击确定关闭对话框,关闭所有IE窗口;
(3)打开IE浏览器,选择“工具”菜单--&“Internet选项”--&“安全”标签,在“请为不同区域的Web内容制定安全设置(z)”窗口内选择“Internet”,然后选择“自定义级别”,将“Activex控件和插件”中“下载已签名的Activex控件”、“运行Activex控件”等设置为“启用”或“提示”,点击确定后,请重新启动电脑;
(4)若您安装了3721上网助手之类的软件,请您将其完全卸载;
(5)请登录工行门户网站 ,点击“个人网上银行登录”下方的“下载”。进入下一个页面后,下载并安装控件程序。
(6)若仍无法正常使用,建议您重新安装IE6.0或以上版本的IE浏览器,并使用WINDOWS系统的UPDATE功能安装补丁。
3、您可以通过网上银行查看对账单进行还款。
4、是可以的。您需要通过网上银行办理跨行转账业务。
如果您想在网上办理跨行汇款,请使用“工行与他行转账汇款”功能,您除了需要申请开通网上银行对外转账功能,还需要您所在地区开通网上跨行汇款功能。若未开通,那么在操作时系统会提示您的(国际卡及香港信用卡无法使用此功能)。
从日起,柜台注册且未申请U盾或口令卡的客户,单笔交易限额、日累计限额以及总支付交易限额均为300元,9月1日前支付额度已经达到300元的客户需到网点申请电子口令卡或U盾(从注册日起计算支付额)。
若目前已达到交易限额但急需支付,建议您可通过下列方法变更交易限额:
1.申请U盾。u盾客户不再受交易限额和支付次数的限制。此外,使用u盾,您可以享受签订理财协议等服务项目,并在您原有使用基础上大大加强了安全性。如需办理U盾,请您本人携带有效身份证件和网上银行注册卡到当地指定网点办理U盾,办理手续及网点信息请您当地95588服务热线联系咨询。
2.申办口令卡。您本人可持有效身份证件、网上银行注册卡到当地指定网点申办口令卡。申办电子口令卡后,个人网上银行单笔交易限额1000元;日累计交易限额5000元,没有总支付额度控制;电子银行口令卡的使用次数为1000次(以客户输入正确的密码字符并通过系统验证为一次),达到使用次数后即不能使用,请及时到我行营业网点办理申领新卡手续。
1、以身作则,如果连自己都做不好,还怎么当班长?
2、人缘好,我就是由于人缘不好,才改当副班长的。
3、团结同学,我们班有一个班长就是由于不团结同学才不当班长的,他现在是体育委员。
4、要有管理能力,首先要有大嗓门,我们班有位学习委员就是由于声音太轻才以3票之差当不了班长;其次要口齿清楚,让同学能听得懂你说的话;第三要说出有道理的话,让吵闹或打架的同学心服口服;第四,不能包庇好朋友,公正;第五,要搞好师生关系;第六,要严以律己,宽以待人,我们班的第一任班长就是因为“严以待人,宽以律己”才不能继续当下去的。
5、要坚持,我们班的纪律委员就是由于没有恒心,原来的大组长、卫生委员、劳动委员、体育委员、学习委员、小组长等(每个学期都加起来)都被免除了,现在的才当1天的纪律委员要不要免除都在考虑中,还要写说明书。
6、提醒班干部做自己要做的事,要有责任心。我们班的纪律委员就是没有责任心,班长的职务都被罢免了。
7、不要拿出班长的架子,要虚心。
8、关心同学(包括学习)。
9、要及早发现问题,自己可以解决的自己解决;自己不能解决的,早日让班主任解决。
10、要发现班级的好的地方,及时表扬。让全班都照做。
11、不要太担心学习,当个班干部,对以后工作有好处,这是个锻炼的机会,好好当吧,加油!
在高中阶段,学校和老师的规定一般都是为了学生的成绩着想,执行老师的话,其实也是为了大家好。即使有时候打点小报告,只要你的心态的好的,也不是坏事。比如A学习不专心,你用个适当的办法提醒老师去关心他,其实也是为了他好。
总的方针:和同学们组成一个团结的班集体,一切以班集体利益为上(当然不冲突国家、社会和学校利益为前提)。跟上面领导要会说话,有一些不重要的东西能满就满,这对你的同学好,也对你的班好。
再说十五点
一,以德服人
也是最重要的,不靠气势,只靠气质,首先要学会宽容(very important)你才能与众不同,不能和大家“同流合污”(夸张了点),不要有这样的想法:他们都怎么样怎样,我也。如果你和他们一样何来让你管理他们,你凭什么能管理他们?
二,无亲友
说的绝了点,彻底无亲友是不可能,是人都有缺点,有缺点就要有朋友帮助你。不是说,不要交友,提倡交友,但是不能把朋友看的太重,主要不能对朋友产生依赖感,遇到事情先想到靠自己,而不是求助!
三,一视同仁
上边说的无亲友也是为了能更好的能一视同仁,无论是什么关系,在你眼里都应是同学,可能比较难作到,但没有这点,就不可能服众。
四,不怕困难
每个班级里都会一些不听话的那种,喜欢摆谱的那种,不用怕,他们是不敢怎么样的!知难而进才是一个班长应该有的作风。
五,带头作用
我想这点大家都有体会就不多说了
六,打成一片
尽量和大家达成共识,没有架子,不自负不自卑,以微笑面对每一个人,不可以有歧视心理,不依赖老师,有什么事情自己解决,老师已经够累的了。
七,“我是班长”
这句话要随时放在心底,但是随时都不要放在嘴上,有强烈的责任心,时刻以班级的荣誉为主,以大家的荣誉为主。什么事情都冲在最前面。遇事镇定。
八,帮助同学
帮助同学不是为了给大家留下一个好的印象等利益方面的事,是你一个班长的责任,是你应该做的,只要你还是一个班长,你就要为人民服务(夸张)为同学服务。
九,诚实守信
大家应该都知道这个,是很容易作到的,也是很不容易作到,然这两句话并不是矛盾的,不是为了建立一个好的形象,和班级责任也没有什么关系,只是一个人应该有的道德品质。但你必须作到,连这样都做不到,就不可能做成一个好的班长。
十,拿的起放的下
学会放弃也同样重要,学会辨别好与坏。知道什么是该做的,什么是不该做的。
十一,谦虚
认真分析同学给你提的意见,不管是有意的,还是无意的。提出来就有他的想法,有他的动机。要作到一日三醒我身。
十二,心态端正
总之要有一个好的心态,积极向上的心态,把事情往好里想,但同时要知道另一面的危机,遇到事情首先想到的应该是解决问题,而不是别的!
十三,合理的运用身边的人和事
主动,先下手为强,遇到不能够管理的,就可以和其他班干部一起对付,实在不行,就迅速找到老师陈述自己的观点,免得他倒打一耙(尽量少打小报告.)
十四,和老师同学搞好关系.
威信可以提高,你说的话老师也比较相信,可以简单一点的拿到老师的一些特殊授权,而这些授权往往对你的帮助很大.
十五,合理的运用自己的权利和魄力
对付难管理的,权利在他的眼中已经不存在的,就运用你的魄力,用心去交流,努力感动身边的人,感动得他们铭记于心,你就成功了.
一点要加油哦
考虑是由于天气比较干燥和身体上火导致的,建议不要吃香辣和煎炸的食物,多喝水,多吃点水果,不能吃牛肉和海鱼。可以服用(穿心莲片,维生素b2和b6)。也可以服用一些中药,如清热解毒的。
确实没有偿还能力的,应当与贷款机构进行协商,宽展还款期间或者分期归还; 如果贷款机构起诉到法院胜诉之后,在履行期未履行法院判决,会申请法院强制执行; 法院在受理强制执行时,会依法查询贷款人名下的房产、车辆、证券和存款;贷款人名下没有可供执行的财产而又拒绝履行法院的生效判决,则有逾期还款等负面信息记录在个人的信用报告中并被限制高消费及出入境,甚至有可能会被司法拘留。
第一步:教育引导
不同年龄阶段的孩子“吮指癖”的原因不尽相同,但于力认为,如果没有什么异常的症状,应该以教育引导为首要方式,并注意经常帮孩子洗手,以防细菌入侵引起胃肠道感染。
第二步:转移注意力
比起严厉指责、打骂,转移注意力是一种明智的做法。比如,多让孩子进行动手游戏,让他双手都不得闲,或者用其他的玩具吸引他,还可以多带孩子出去游玩,让他在五彩缤纷的世界里获得知识,增长见识,逐渐忘记原来的坏习惯。对于小婴儿,还可以做个小布手套,或者用纱布缠住手指,直接防止他吃手。但是,不主张给孩子手指上“涂味”,比如黄连水、辣椒水等,以免影响孩子的胃口,黄连有清热解毒的功效,吃多了还可导致腹泻、呕吐。
合肥政务区网络广告推广网络推广哪家公司比较好 一套能在互联网上跑业务的系统,被网络营销专家赞为目前最 有效的网络推广方式!
1、搜索引擎营销:分两种SEO和PPC,即搜索引擎优化,是通过对网站结构、高质量的网站主题内容、丰富而有价值的相关性外部链接进行优化而使网站为用户及搜索引擎更加友好,以获得在搜索引擎上的优势排名为网站引入流量。
良工拥有十多位资深制冷维修工程师,十二年生产与制造经验,技术力量雄厚,配有先进的测试仪器,建有系列低温测试设备,备有充足的零部件,包括大量品牌的压缩机,冷凝器,蒸发器,水泵,膨胀阀等备品库,能为客户提供迅捷,优质的工业冷水机及模温机维修和保养。
楼主,龙德教育就挺好的,你可以去试试,我们家孩子一直在龙德教育补习的,我觉得还不错。
成人可以学爵士舞。不过对柔软度的拒绝比较大。  不论跳什么舞,如果要跳得美,身体的柔软度必须要好,否则无法充分发挥出理应的线条美感,爵士舞也不值得注意。在展开暖身的弯曲动作必须注意,不适合在身体肌肉未几乎和暖前用弹振形式来做弯曲,否则更容易弄巧反拙,骨折肌肉。用静态方式弯曲较安全,不过也较必须耐性。柔软度的锻炼动作之幅度更不该超过疼痛的地步,肌肉有向上的感觉即可,动作(角度)保持的时间可由10馀秒至30-40秒平均,时间愈长对肌肉及关节附近的联结的组织之负荷也愈高。
正在加载...
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415当前位置: >>
VHDL设计应用实例
第6章 VHDL设计应用实例第6章 VHDL设计应用实例6.1 8位加法器的设计 6.2 8位乘法器的设计 6.3 序列检测器的设计 6.4 正负脉宽数控调制信号发生器的设计 6.5 数字频率计的设计 6.6 秒表的设计 6.7 MCSC51单片机与FPGA/CPLD总线接口逻辑设计 6.8 交通灯信号控制器的设计 6.9 语音信箱控制系统的设计 6.10 PID控制器的设计 6.11 空调系统有限状态自动机的设计 6.12 闹钟系统的设计 第6章 VHDL设计应用实例6.1 8位加法器的设计1.设计思路 加法器是数字系统中的基本逻辑器件,减法器和硬件乘法 器都可由加法器来构成。多位加法器的构成有两种方式:并行 进位和串行进位方式。并行进位加法器设有进位产生逻辑,运 算速度较快;串行进位方式是将全加器级联构成多位加法器。 并行进位加法器通常比串行级联加法器占用更多的资源。随着 位数的增加,相同位数的并行加法器与串行加法器的资源占用 差距也越来越大。因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。 第6章 VHDL设计应用实例 实践证明,4位二进制并行加法器和串行级联加法器占用 几乎相同的资源。这样,多位加法器由4位二进制并行加法器 级联构成是较好的折中选择。本设计中的8位二进制并行加法 器即是由两个4位二进制并行加法器级联而成的,其电路原理图如图6.1所示。 第6章 VHDL设计应用实例图6.1 8位加法器电路原理图 第6章 VHDL设计应用实例 2.VHDL源程序 1) 4位二进制并行加法器的源程序ADDER4B.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER4B IS--4位二进制并行加法器--低位进位 --4位加数 --4位被加数PORT(CIN:IN STD_LOGIC;A: IN STD_LOGIC_VECTOR(3 DOWNTO 0); B: IN STD_LOGIC_VECTOR(3 DOWNTO 0);S: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --4位和CONT: OUT STD_LOGIC);--进位输出 第6章 VHDL设计应用实例END ADDER4B;ARCHITECTURE ART OF ADDER4B IS SIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL AA,BB: STD_LOGIC_VECTOR(4 DOWNTO 0); BEGINAA&='0'& A; --将4位加数矢量扩为5位,为进位提供空间BB&='0'& B;--将4位被加数矢量扩为5位,为进位提供空间SINT&=AA+BB+CIN ; S&=SINT(3 DOWNTO 0); CONT&=SINT(4);END ART; 第6章 VHDL设计应用实例 2) 8位二进制加法器的源程序ADDER8B.VHD LIBRARY IEEE; USE IEEE_STD.LOGIC_1164.ALL; USE IEEE_STD.LOGIC_UNSIGNED.ALL: ENTITY ADDER8B IS --由4位二进制并行加法器级联而成的8位二进制加法器 PORT(CIN:IN STD_LOGIC; A:IN STD_LOGIC_VECTOR(7 DOWNTO 0); B:IN STD_LOGIC_VECTOR(7 DOWNTO 0); S:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); COUT:OUT STD_LOGIC); END ADDER8B; ARCHICTURE ART OF ADDER8B IS 第6章 VHDL设计应用实例 COMPONENET ADDER4B--对要调用的元件ADDER4B的界面端口进行定义PORT(CIN:IN STD_LOGIC; A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);S:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CONT:OUT STD_LOGIC); END COMPONENT ; SIGNAL CARRY_OUT:STD_LOGIC; --4位加法器的进位标志BEGINU1:ADDER4B --例化(安装)一个4位二进制加法器U1 第6章 VHDL设计应用实例 PORT MAP(CIN=&CIN,A=&A(3 DOWNTO 0),B=&B(3DOWNTO0),S=&S(3 DOWNTO 0),COUT=&CARRY_OUT); U2:ADDER4B --例化(安装)一个4位二进制加法器U2PORT MAP(CIN=&CARRY_OUT,A=&A(7 DOWNTO 4), B=&B(7 DOWNTO 4), S=&S (7 DOWNTO 4);CONT=&CONT); END ART; 第6章 VHDL设计应用实例 3.硬件逻辑验证 选择实验电路结构图NO.1,由5.2的实验电路结构图NO.1和 图6.1确定引脚的锁定。如可取实验电路结构图的PIO3~PIO0接 A[3..0],PIO7~PIO4接A[7..4], PIO11~PIO8接B[3..0],PIO15~PIO12接B[7..4],PIO49接CIN。此加法器的被加数A和加数B分别由键2与键1、键4与键3输入,加法器的最低位进位 CIN由键8输入,计算结果将分别通过PIO23~PIO20,PIO19~ PIO16输出并显示于数码管6(高4位)和数码管5(低4位),溢出进 位由PIO39输出,当有进位时,结果显示于发光管D8。 第6章 VHDL设计应用实例6.2 8位乘法器的设计1.设计思路 纯组合逻辑构成的乘法器虽然工作速度比较快,但占用硬件 资源多,难以实现宽位乘法器,而基于PLD器件外接ROM九九表 的乘法器则无法构成单片系统,也不实用。这里介绍由8位加法器构成的以时序逻辑方式设计的8位乘法器,此乘法器具有一定的实用价值。其乘法原理是:乘法通过逐项位移相加原理来实现, 从被乘数的最低位开始,若为1,则乘数左移后与上一次和相加; 若为0,左移后以全零相加,直至被乘数的最高位。从图6.2的逻 辑图上可以清楚地看出此乘法器的工作原理。 第6章 VHDL设计应用实例CLK CLK START START ARICTL ARIEND U1 CLKOUT RSTALL S2 S3 GND S1 S7[15..8 ] S5[7..0] SREG8B CLK A[7..0 ] LOAD DIN[7..0 ] S4 ANDARITH B[7..0 ] ABIN DOUT[7..0] DIN[7..0 ] U3 S5[7..0] S7[15..0 ] OUT[15. .0] S6[8..0] U2 QB CLK CLR D[8..0 ] U5 Q[15. .0] REG16B S7[7..0] S7[15..8 ] CIN A[7..0 ] B[7..0 ] U4 ARIEND ADDER8 B S[7 ..0] COUT S6[7..0] S6(8)图6.2 8×8位乘法器电路原理图 第6章 VHDL设计应用实例 图6.2中,ARICTL是乘法运算控制电路,它的START(可锁定于引脚I/O 49)信号的上跳沿与高电平有两个功能,即16位寄存器清零和被乘数A[7..0]向移位寄存器SREG8B加载;它的低电平则作 为乘法使能信号。乘法时钟信号从ARICTL的CLK输入。当被乘数加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。当为1时,与门ANDARITH打开,8 位乘数B[7..0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器REG16B中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。而当被乘数移出位为0时,与门全零输出。如此 往复,直至8个时钟脉冲后,由ARICTL的控制,乘法运算过程自 动中止。ARIEND输出高电平,以此可点亮一发光管,以示乘法 结束。此时REG16B的输出值即为最后乘积。 第6章 VHDL设计应用实例 此乘法器的优点是节省芯片资源,它的核心元件只是一个8 位加法器,其运算速度取决于输入的时钟频率。若时钟频率为100 MHz,则每一运算周期仅需80 ns。而若利用备用最高时钟,即12 MHz晶振的MCS-51单片机的乘法指令,进行8位乘法运算, 仅单指令的运算周期就长达4 μs。因此,可以利用此乘法器或 相同原理构成的更高位乘法器完成一些数字信号处理方面的运 算。 第6章 VHDL设计应用实例2. VHDL源程序1) 选通与门模块的源程序ANDARITH.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY ANDARITH IS--选通与门模块--与门开关 --8位输入PORT (ABIN:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR (7 DOWNTO 0)DOUT:OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); --8位输出 END ANDARITH;ARCHITECTURE ART OF ANDARITH IS 第6章 VHDL设计应用实例 BEGIN PROCESS (ABIN,DIN) BEGIN FOR I IN 0 TO 7 LOOP --循环,分别完成8位数据与一位 DOUT (I)&=DIN (I)AND ABIN; --控制位的与操作END LOOP;END PROCESS; END ART; 第6章 VHDL设计应用实例2) 16位锁存器的源程序REG16B.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG16B IS --16位锁存器PORT (CLK:IN STD_LOGIC;CLR:IN STD_LOGIC;--锁存信号--清零信号 --8位数据输入D:IN STD_LOGIC_VECTOR (8 DOWNTO 0) END REG16B; ARCHITECTURE ART OF REG16B ISQ:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--16位数据输出SIGNAL R16S:STD_LOGIC_VECTOR(15 DOWNTO 0);--16位寄存器设置 第6章 VHDL设计应用实例BEGIN PROCESS (CLK,CLR) BEGIN IF CLR = '1' THEN R16S&= &0000&; --异步复位信号 ELSIF CLK'EVENT AND CLK = '1' THEN --时钟到来时,锁存输入值 R16S(6 DOWNTO 0)&=R16S(7 DOWNTO 1); --右移低8位 R16S(15 DOWNTO 7)&=D; --将输入锁到高能位 END IF; END PROCESS; Q&=R16S; END ART; 第6章 VHDL设计应用实例 3) 8位右移寄存器的源程序SREG8B.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --8位右移寄存器ENTITY SREG8B ISPORT (CLK:IN STD_LOGIC; LOAD :IN STD _LOGIC; BIN:IN STD_LOGIC_VECTOR(7DOWNTO 0);QB:OUT STD_LOGIC );END SREG8B; ARCHITECTURE ART OF SREG8B ISSIGNAL REG8B:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN PROCESS (CLK,LOAD) 第6章 VHDL设计应用实例 BEGIN IF CLK'EVENT AND CLK= '1' THENIF LOAD = '1' THEN REG8&=DIN;--装载新数据ELSE REG8(6 DOWNTO0)&=REG8(7 DOWNTO 1);--数据右移END IF;END IF; END PROCESS; QB&= REG8 (0); END ART; --输出最低位 第6章 VHDL设计应用实例4) 乘法运算控制器的源程序ARICTL.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ARICTL IS--乘法运算控制器START:IN STD_LOGIC;PORT ( CLK:IN STD_LOGIC;CLKOUT:OUT STD_LOGIC; RSTALL:OUT STD_LOGIC;ARIEND:OUT STD_LOGIC );END ARICTL; ARCHITECTURE ART OF ARICTL ISSIGNAL CNT4B:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN 第6章 VHDL设计应用实例RSTALL&=START; PROCESS (CLK,START) BEGIN IF START = '1' THEN CNT4B&= &0000&; ELSIF CLK'EVENT AND CLK = '1' THEN --高电平清零计数器IF CNT4B&8 THEN--小于则计数,等于8表明乘法运算已经结束CNT4B=CNT4B+1; END IF;END IF;END PROCESS; PROCESS (CLK,CNT4B,START)BEGIN 第6章 VHDL设计应用实例IF START = '0' THEN IF CNT4B&8 THEN --乘法运算正在进行CLKOUT &=CLK; ARIEND&= '0';ELSE CLKOUT &= '0'; ARIEND&= '1'; END IF; ELSE CLKOUT &=CLK; ARIEND&= '0'; END IF; END PROCESS; END ART; --运算已经结束 第6章 VHDL设计应用实例5) 8位乘法器的源程序MULTI8X8.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MULTI8X8 IS PORT(CLK:IN STD_LOGIC; START:IN STD_LOGIC; --乘法启动信号,高电平复位与加载,低电平运算 --8位乘法器顶层设计A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);B:IN STD_LOGIC_VECTOR(7 DOWNTO 0); ARIEND:OUT STD_LOGIC;--8位被乘数--8位乘数--乘法运算结束标志位DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--16位乘积输出 END MULTI8X8; 第6章 VHDL设计应用实例ARCHITECTURE ART OF MULTI8X8 ISCOMPONENT ARICTL --待调用的乘法控制器端口定义 PORT(CLK:IN STD_LOGIC;START:IN STD_LOGIC;CLKOUT:OUT STD_LOGIC;RSTALL:OUT STD_LOGIC;ARIEND:OUT STD_LOGIC); END COMPONENT;COMPONENT ANDARITH--待调用的控制与门端口定义PORT(ABIN:IN STD_LOGIC; DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT:OUT_STD_LOGIC_VECTOR( 7 DOWNTO 0) ); END COMPONENT; COMPONENT ADDER8B ... --待调用的8位加法器端口定义 第6章 VHDL设计应用实例COMPONENT SREG8B... COMPONENT REG16B ... SIGNAL GNDINT:STD_LOGIC; --待调用的16右移寄存器端口定义--待调用的8位右移寄存器端口定义SIGNAL INTCLK:STD_LOGIC;SIGNAL RSTALL:STD_LOGIC; SIGNAL QB:STD_LOGIC;SIGNAL ANDSD:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL DTBIN:STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL DTBOUT:STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN 第6章 VHDL设计应用实例DOUT&=DTBOUT;GNDINT&= '0';U1:ARICTL PORT MAP(CLK=&CLK, START=&START, CLKOUT=&INTCLK, RSTALL=&RSTALL, ARIEND=&ARIEND); U2:SREG8B PORT MAP(CLK=&INTCLK, LOAD=&RSTALL. DIN=&B, QB=&QB); U3:ANDARITH PORT MAP(ABIN=&QB,DIN=&A,DOUT=&ANDSD); U4:ADDER8B PORT MAP(CIN=&GNDINT,A=&DTBOUT(15 DOWNTO 8), B=&ANDSD, S=&DTBIN(7 DOWNTO 0),COUT =&DTBIN(8)); U5:REG16B PORT MAP(CLK =&INTCLK,CLR=&RSTALL, D=&DTBIN, Q=&DTBOUT); END ART; 第6章 VHDL设计应用实例 3. 硬件逻辑验证 选择实验电路结构图NO.1,由5.2节的实验电路结构图NO.1 和图6.2确定引脚的锁定。如乘法运算时钟CLK接CLOCK0,清 零及启动运算信号START由键8 (PIO49)控制,乘数B[7..0]接PIO7~PIO0(由键2,键1输入8位二进制数),被乘数A[7..0]接PIO15~PIO8(由键4,键3输入8位二进制数),乘积输出 DOUT[15..0]接PIO31~PIO16,乘法运算结束信号ARIEND接 PIO39(D8)。 第6章 VHDL设计应用实例 进行硬件验证时方法如下:① 键2和键1分别输入乘数的高 4位和低4位(输入值显示于数码2和数码1);② 键4和键3分别输 入被乘数的高4位和低4位(输入值显示于数码4和数码3);③ 乘 法操作时钟信号输入接CLOCK0;④ 键8输入高电平时,乘积锁存器清零,乘数和被乘数数值加载,低电平时开始作乘法,8个脉冲后乘法结束,乘积显示于数码管8~5,高位在左。 第6章 VHDL设计应用实例6.3 序列检测器的设计1.设计思路序列检测器可用于检测一组或多组由二进制码组成的脉冲序 列信号,这在数字通信领域有广泛的应用。当序列检测器连续收 到一组串行二进制码后,如果这组码与检测器中预先设置的码相 同,则输出1,否则输出0。由于这种检测的关键在于正确码的收 到必须是连续的,这就要求检测器必须记住前一次的正确码及正 确序列,直到在连续的检测中所收到的每一位码都与预置数的对 应码相同。在检测过程中,任何一位不相等都将回到初始状态重 新开始检测。如图6.3所示,当一串待检测的串行数据进入检测器 后,若此数在每一位的连续检测中都与预置的密码数相同,则输 出“A”,否则仍然输出“B”。 第6章 VHDL设计应用实例DIN CLK CLR D[7..0]CHK DIN CLK CLR D[7..0] AB[3..0] AB[3..0]图6.3 8位序列检测器逻辑图 第6章 VHDL设计应用实例2.VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY CHK IS PORT(DIN:IN STD_LOGIC; CLK,CLR:IN STD_LOGIC; --串行输入数据位 --工作时钟/复位信号D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--8位待检测预置数 AB:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));--检测结果输出END CHK;ARCHITECTURE ART OF CHK IS 第6章 VHDL设计应用实例SIGNAL Q :INTEGER RANGE 0 TO 8; BEGIN PROCESS ( CLK,CLR ) BEGIN IF CLR= '1' THEN Q&=0;ELSIF CLK'EVENT AND CLK= '1' THEN--时钟到来时,判断并处理当前输入的位 CASE Q ISWHEN 0 =& IF DIN =D(7) THEN Q&= 1 ;ELSE Q&=0;END IF;WHEN 1 =& IF DIN =D(6) THEN Q&= 2 ;ELSE Q&=0;END IF; WHEN 2 =& IF DIN =D(5) THEN Q&= 3 ;ELSE Q&=0;END IF; 第6章 VHDL设计应用实例WHEN 3=& IF DIN =D(4) THEN Q&= 4 ;ELSE Q&=0;END IF; WHEN 4 =& IF DIN =D(3) THEN Q&= 5 ;ELSE Q&=0;END IF; WHEN 5 =& IF DIN =D(2) THEN Q&= 6 ;ELSE Q&=0;END IF; WHEN 6 =& IF DIN =D(1) THEN Q&= 7 ;ELSE Q&=0;END IF;WHEN 7 =& IF DIN =D(0) THEN Q&= 8 ;ELSE Q&=0;END IF;WHEN OTHERS =& Q&=0; END IF ; 第6章 VHDL设计应用实例END PROCESS; PROCESS(Q) BEGIN IF Q= 8 THEN AB&= &1010&; --序列数检测正确,输出“A” --检测结果判断输出ELSE AB&= &1011&;END IF ; END PROCESS; END ART;--序列数检测错误,输出 “B” 第6章 VHDL设计应用实例 3.硬件逻辑验证 选择实验电路结构图NO.8,由5.2节的实验电路结构图NO.8 和图6.3确定引脚的锁定。待检测串行序列数输入DIN接 PIO10(左移,最高位在前),清零信号CLR接PIO8,工作时钟 CLK接PIO9,预置位密码D[7..0]接PIO7~PIO0,指示输出 AB[3..0]接PIO39~PIO36(显示于数码管6)。 第6章 VHDL设计应用实例 进行硬件验证时方法如下:① 选择实验电路结构图NO.8, 按实验板“系统复位”键;② 用键2和键1输入两位十六进制待 测序列数;③ 利用键4和键3输入两位十六进制预置码;④ 按 键8,高电平初始化清零,低电平清零结束(平时数码6应显“B”);⑤ 按键6(CLK)8次,这时若串行输入的8位二进制序列码与预置码相同,则数码7应从原来的“B”变成“A”,表示序 列检测正确,否则仍为“B”。 第6章 VHDL设计应用实例6.4 正负脉宽数控调制信号发生器的设计1.设计思路图6.4 是脉宽数控调制信号发生器逻辑图,此信号发生器是由两个完全相同的可自加载加法计数LCNT8组成的,它的输出信号的高低电平脉宽可分别由两组8位预置数进行控制。 第6章 VHDL设计应用实例CLK LCNT8 CLK LD U1 CAO D[7..0] LCNT8 CLK LD U2 D[7..0] CAO CAO2 LD2 CAO1 LD1 A B PSOUT I2VCC PRN Q D CLRNPSINT图6.4 脉宽数控调制信号发生器逻辑图 第6章 VHDL设计应用实例如果将初始值可预置的加法计数器的溢出信号作为本计数 器的初始预置加载信号LD,则可构成计数初始值自加载方式 的加法计数器,从而构成数控分频器。图6.4中D触发器的一个 重要功能就是均匀输出信号的占空比,提高驱动能力,这对驱动,诸如扬声器或电动机十分重要。 第6章 VHDL设计应用实例 2.VHDL源程序1) 8位可自加载加法计数器的源程序LCNT8.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164,.ALL; ENTITY LCNT8 IS --8位可自加载加法计数器 --工作时钟/预置值加载信号 PORT(CLK,LD:IN STD_LOGIC; CAO:OUT STD_LOGIC); END LCNT8; ARCHITECTURE ART OF LCNT8 IS SIGNAL COUNT:INTEGER RANGE 0 TO 255; --8位计数器设置 BEGIN PROCESS ( CLK )D:IN INTEGER RANGE 0 TO 255;--8位分频预置数 --计数溢出输出 第6章 VHDL设计应用实例BEGINIF CLK'EVENT AND CLK= '1' THEN IF LD= '1' THEN COUNT&=D; --LD为高电平时加载预置数ELSE COUNT&=COUNT+1;END IF; END IF; END PROCESS; PROCESS (COUNT) BEGIN--否则继续计数IF COUNT=255 THEN CAO&= '1'; --计数满后,置于溢出位 ELSE CAO&= '0'; END IF; END PROCESS; END ART; 第6章 VHDL设计应用实例2) 正负脉宽数控调制信号发生器的源程序PULSE.VHD LIBRARY IEEE; --正负脉宽数控调制信号发生器顶层文件USE IEEE.STD_LOGIC_1164.ALL;ENTITY PULSE IS PORT (CLK:IN STD_LOGIC; --计数时钟A,B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--8位计数预置数 PSOUT:OUT STD_LOGIC); END PULSE; ARCHITECTURE ART OF PULSE IS COMPONENT LCNT8 --计数溢出并分频输出 第6章 VHDL设计应用实例PORT(CLK,LD:IN STD_LOGIC; D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); CAO:OUT STD_LOGIC); END COMPONENT; SIGNAL CAO1,CAO2 :STD_LOGIC; SIGNAL LD1,LD2 :STD_LOGIC; SIGNAL PSINT:STD_LOGIC;BEGINU1:LCNT8 PORT MAP(CLK=&CLK,LD=&LD1, D=&A,CAO=&CAO1);U2:LCNT8 PORT MAP(CLK=&CLK,LD=&LD2,D=&B,CAO=&CAO2); 第6章 VHDL设计应用实例 PROCESS(CAO1,CAO2) BEGIN IF CAO1= '1' THEN PSINT&= '0'; ELSIF CAO2 'EVENT AND CAO2= '1' THEN PSINT&='1'; END IF; END PROCESS; LD1&=NOT PSINT;LD2&=PSINT;PSOUT&=PSINT; END ART; 第6章 VHDL设计应用实例 3. 硬件逻辑验证 选择实验电路结构图NO.1,由5.2节的实验电路结构图 NO.1和图6.4确定引脚的锁定。输入时钟CLK接CLOCK0(用于 发声时,接频率65536 Hz);8位数控预置输入B[7..0]接PIO15~PIO8,由键4和键3控制输入,输入值分别显示于数码管4和数码管3;另8位数控预置输入A[7..0]接PIO7~PIO0,由键1和键2控制输入,输入值分别显示于数码管2和数码管1;输出PSOUT 接SPEAKER(对应1032E是第5引脚PIN5;对应 EPF10K是第3引脚PIN3)。 第6章 VHDL设计应用实例 进行硬件验证时方法如下:通过键2和键1输入控制高电平 信号脉宽的预置数(显示于数码管2和1);由键4和键3输入控制低电平信号脉宽的预置数(显示于数码管4和3);取待分频率F=12 MHz、6 MHz或3 MHz,通过短路帽输入CLK9;频率输 出可利用示波器观察波形随预置数的变化而变化的情况。在没 有示波器时,“CLK”可接低频率信号,然后接通扬声器,通 过声音音调的变化来了解输出频率的变化。 第6章 VHDL设计应用实例6.5 数字频率计的设计1. 设计思路 图6.5是8位十进制数字频率计的电路逻辑图,它由一个测频 控制信号发生器TESTCTL、8个有时钟使能的十进制计数器 CNT10、一个32位锁存器REG32B组成。以下分别叙述频率计各 逻辑模块的功能与设计方法。 第6章 VHDL设计应用实例FSIN CLK CLK CLK RST U0 TESTC TL TSTEN CLR _C NT LOAD GND SE SC CLR EN ACNT 10 U1 CQ[ 3.. 0] CAR RY_OUTSD[3..0]S4 CLK CLR EN A CLKCNT 10 U5 CQ[ 3.. 0] CAR RY_OUTSD[19. .16]S1 CNT 10 SD[7..4]S5 CNT 10 SD[23. .20]CLK CLR EN A CLK CLR EN A CLKCQ[ 3.. 0] U2 CAR RY_OUT S2 CNT 10 SD[11. .8]CLR EN A CLKU6 CQ[ 3.. 0] CAR RY_OUT S6 CNT 10 SD[27. .24]SL REG32B LOAD DIN[31..0] U9 DOUT[31. .0]U3 CQ[ 3.. 0] CAR RY_OUT S3 CNT 10 SD[15. .12]CLR EN A CLK CLR EN AU7 CQ[ 3.. 0] CAR RY_OUT S7 CNT 10 U8 CQ[ 3.. 0] CAR RY_OUT SD[31. .28]SD[31. .0]DOUT[31. .0]CLR EN AU4 CQ[ 3.. 0] CAR RY_OUTS8图6.5 8位十进制数字频率计逻辑图 第6章 VHDL设计应用实例 1) 测频控制信号发生器设计 频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。 这就要求TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽 的周期信号,并对频率计的每一计数器CNT10的ENA使能端进 行同步控制。当TSTEN高电平时,允许计数;低电平时,停止 计数,并保持其所计的数。在停止计数期间,首先需要一个锁 存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位 锁存器REG32B中,并由外部的7段译码器译出并稳定显示。锁 存信号之后,必须有一清零信号CLR_CNT对计数器进行清零, 为下1秒钟的计数操作作准备。测频控制信号发生器的工作时 序如图6.6所示。为了产生这个时序图,需首先建立一个由D触 发器构成的二分频器,在每次时钟CLK上沿到来时其值翻转。 第6章 VHDL设计应用实例 其中控制信号时钟CLK的频率取1 Hz,而信号TSTEN的脉 宽恰好为1 s,可以用作闸门信号。此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。由图6.6可见,在计数完成后,即计数使能信号TSTEN在1 s的高电平后,利用其 反相值的上跳沿产生一个锁存信号LOAD,0.5 s后,CLR_CNT 产生一个清零信号上跳沿。 高质量的测频控制信号发生器的设计十分重要,设计中要 对其进行仔细的实时仿真(TIMING SIMULATION),防止可能 产生的毛刺。 第6章 VHDL设计应用实例[I] RST [I] CLK [O] TSTEN [O] LOAD [O] CLR_CNT图6.6 测频控制信号发生器工作时序 第6章 VHDL设计应用实例 2) 寄存器REG32B设计 设置锁存器的好处是,显示的数据稳定,不会由于周期性 的清零信号而不断闪烁。若已有32位BCD码存在于此模块的输 入口,在信号LOAD的上升沿后即被锁存到寄存器REG32B的内部,并由REG32B的输出端输出,然后由实验板上的7段译码器译成能在数码管上显示输出的相对应的数值。 第6章 VHDL设计应用实例3) 十进制计数器CNT10的设计 如图6.5所示,此十进制计数器的特殊之处是,有一时钟使 能输入端ENA,用于锁定计数值。当高电平时计数允许,低电 平时禁止计数。 第6章 VHDL设计应用实例 2. VHDL源程序1) 有时钟使能的十进制计数器的源程序CNT10.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY CNT10 IS --有时钟使能的十进制计数器PORT (CLK:IN STD_LOGIC;CLR:IN STD_LOGIC; END:IN STD_LOGIC;--计数时钟信号--清零信号 --计数使能信号CQ:OUT INTEGER RANGE 0 TO 15;CARRY_OUT:OUT STD_LOGIC); END CNT10;--4位计数结果输出--计数进位ARCHITECTURE ART OF CNT10 IS 第6章 VHDL设计应用实例SIGNAL CQI :INTEGER RANGE 0 TO 15; BEGIN PROCESS(CLK,CLR,ENA) BEGIN IF CLR= '1' THEN CQI&= 0; --计数器异步清零 ELSIF CLK'EVENT AND CLK= '1' THEN IF ENA= '1' THEN IF CQI&9 THEN CQI&=CQI+1; ELSE CQI&=0;END IF; --等于9,则计数器清零 END IF; END IF; END PROCESS; PROCESS (CQI) BEGIN IF CQI=9 THEN CARRY_OUT&= '1'; --进位输出 ELSE CARRY_OUT&= '0';END IF; END PROCESS; CQ&=CQI; END ART; 第6章 VHDL设计应用实例2) 32位锁存器的源程序REG32B.VHDLIBRARY IEEE; --32位锁存器 USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG32B IS PORT(LOAD:IN STD_LOGIC; DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0); DOUT:OUT STD_LOGEC_VECTOR(31 DOWNTO 0)); END REG32B; ARCHITECTURE ART OF REG32B IS BEGIN PROCESS ( LOAD, DIN ) BEGIN IF LOAD 'EVENT AND LOAD= '1' THEN DOUT&=DIN; --锁存输入数据 END IF ; END PROCESS; END ART; 第6章 VHDL设计应用实例 3) 测频控制信号发生器的源程序TESTCTL.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL ENTITY TESTCTL IS PORT (CLK:IN STD_LOGIC; TSTEN:OUT STD_LOGIC; CLR_CNT:OUT STD_LOGIC; LOAD:OUT STD_LOGIC); END TESTCTL; ARCHITECTURE ART OF TESTCTL IS --1 Hz测频控制时钟 --计数器时钟使能 --计数器清零 --输出锁存信号 --测频控制信号发生器SIGNAL Dvi2CLK :STD_LOGIC;BEGIN 第6章 VHDL设计应用实例PROCESS ( CLK )BEGIN IF CLK'EVENT AND CLK= '1' THEN Div2CLK&=NOT Div2CLK; --1 Hz时钟二分频END IF ;END PROCESS; PROCESS ( CLK,Div2CLK )BEGINIF CLK= '0' AND Div2CLK = '0' THEN CLR_CNT&= '1'; ELSE CLR_CNT&= '0' ; END IF; END PROCESS; LOAD&=NOT Div2CLK; TSTEN&=Div2CLK; END ART; --产生计数器清零信号 第6章 VHDL设计应用实例4) 数字频率计的源程序FREQ.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY FREQ IS PORT(FSIN:IN STD_LOGIC; CLK:IN STD_LOGIC; DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); END FREQ; ARCHITECTURE ART OF FREQ IS COMPONENT CNT10 --待调用的有时钟使能的十进制计数器端口定义 PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC); 第6章 VHDL设计应用实例END COMPONENT; COMPONENT REG32B --待调用的32位锁存器端口定义 ... COMPONENT TESTCTL --待调用的测频控制信号发生器端口定义 ... SIGNAL TSTEN:STD_LOGIC; SIGNAL CLR_CNT:STD_LOGIC; SIGNAL LOAD:STD_LOGIC; SIGNAL CARRY1:STD_LOGIC; SIGNAL CARRY2:STD_LOGIC; SIGNAL CARRY3:STD_LOGIC; SIGNAL CARRY4:STD_LOGIC; SIGNAL CARRY5:STD_LOGIC; SIGNAL CARRY6:STD_LOGIC; SIGNAL CARRY7:STD_LOGIC; SIGNAL CARRY8:STD_LOGIC; SIGNAL DIN:STD_LOGIC_VECTOR(31 DOWNTO 0); 第6章 VHDL设计应用实例BEGIN U0:TESTCTL PORT MAP(CLK=&CLK,TSTEN=&TSTEN, CLR_CNT=&CLR_CNT,LOAD=&LOAD); U1:CNT10 PORT MAP(CLK=&FSIN,CLR=&CLR_CNT,ENA=&TSTEN, CQ=&DIN (3 DOWNTO 0),CARRY_OUT=&CARRY1);U2:CNT10 PORT MAP(CLK=&CARRY1,CLR=&CLR_CNT,ENA=&TSTEN, CQ=&DIN (7 DOWNTO 4),CARRY_OUT=&CARRY2);U3:CNT10 PORT MAP(CLK=&CARRY2,CLR=&CLR_CNT,ENA=&TSTEN, CQ=&DIN (11 DOWNTO 8),CARRY_OUT=&CARRY3);U4:CNT10 PORT MAP(CLK=&CARRY3,CLR=&CLR_CNT,ENA=&TSTEN, CQ=&DIN (15 DOWNTO 12),CARRY_OUT=&CARRY4);U5:CNT10 PORT MAP(CLK=&CARRY4,CLR=&CLR_CNT,ENA=&TSTEN, 第6章 VHDL设计应用实例CQ=&DIN (19 DOWNTO 16),CARRY_OUT=&CARRY5); U6:CNT10 PORT MAP(CLK=&CARRY5,CLR=&CLR_CNT,ENA=&TSTEN,CQ=&DIN (23 DOWNTO 20),CARRY_OUT=&CARRY6);U7:CNT10 PORT MAP(CLK=&CARRY6,CLR=&CLR_CNT,ENA=&TSTEN, CQ=&DIN (27 DOWNTO 24),CARRY_OUT=&CARRY7); U8:CNT10 PORT MAP(CLK=&CARRY7,CLR=&CLR_CNT,ENA=&TSTEN, CQ=&DIN (31 DOWNTO 28),CARRY_OUT=&CARRY8);U9:REG32B PORT MAP(LOAD=&LOAD,DIN=&DIN(31 DOWNTO 0),DOUT=&DOUT);END ART; 第6章 VHDL设计应用实例3. 硬件逻辑验证选择实验电路结构图NO.0,由5.2节的实验电路结构图NO.0和图6.5确定引脚的锁定,测频控制器时钟信号CLK(1 Hz)可接CLOCK1,待测频FSIN可接CLOCK0,8位数码显示输出DOUT[31..0]接PIO47~PIO16。进行硬件验证时方法如下:选择实验模式0,测频控制器时钟信号CLK与CLOCK1信号组中的1 Hz信号相接,待测频FSIN与CLOCK0信号组中的某个信号相接,数码管应显示来自 CLOCK0的频率。 第6章 VHDL设计应用实例6.6 秒 表 的 设 计1.设计思路 今需设计一个计时范围为0.01秒~1小时的秒表,首先需要获 得一个比较精确的计时基准信号,这里是周期为1/100 s的计时脉 冲。其次,除了对每一计数器需设置清零信号输入外,还需在6 个计数器设置时钟使能信号,即计时允许信号,以便作为秒表的 计时起停控制开关。因此秒表可由1个分频器、4个十进制计数器 (1/100秒、1/10秒、1秒、1分)以及2个六进制计数器(10秒、10分) 组成,如图6.7所示。6个计数器中的每一计数器的4位输出,通过 外设的BCD译码器输出显示。图6.7中6个4位二进制计数输出的最 小显示值分别为:DOUT[3..0]1/100秒、DOUT[7..4]1/10秒、 DOUT[11..8]1秒、DOUT[15..12]10秒、DOUT[19..16]1分、 DOUT[23..20]10分。 第6章 VHDL设计应用实例CLK CLK CLR ENA CLK CLR ENA CLKGE N U0 CNT 10 U1 CQ[ 3.. 0] S1 NEW CLK S0 DOUT[3..0] CLK CLR ENA CAR RY_OUT DOUT[23. .0] CNT 6 U4 CQ[ 3.. 0]DOUT[15. .12] CAR RY_OUT S4CNT 10 CLK CLR ENA CNT 10 CLK CLR ENA U3 CQ[ 3.. 0] U2 CQ[ 3.. 0]DOUT[7..4] CLK CLR S2 ENA CAR RY_OUTCNT 10 U5 CQ[ 3.. 0]DOUT[19. .16]CAR RY_OUT S5DOUT[11. .8] CAR RY_OUT CLK S3 CLR ENACNT 6 U6 CQ[ 3.. 0]DOUT[23. .20]CAR RY_OUT图6.7 秒表电路逻辑图 第6章 VHDL设计应用实例 2. VHDL源程序1) 3 MHz→100 Hz分频器的源程序CLKGEN.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY CLKGEN IS PORT (CLK:IN STD_LOGIC; --3 MHz信号输入NEWCLK:OUT STD_LOGIC );END CLKGEN; ARCHITECTURE ART OF CLKGEN IS--100 Hz计时时钟信号输出SIGNAL CNTER:INTEGER RANGE 0 TO 10#29999#; --十进制计数预制数BEGIN PROCESS(CLK) --分频计数器,由3 MHz时钟产生100 Hz信号BEGIN 第6章 VHDL设计应用实例IF CLK'EVENT AND CLK='1' THENIF CNTER=10#29999# THEN CNTER&=0; --3 MHz信号变为100 Hz,计数常数为30 000ELSE CNTER&=CNTER+1;END IF; END IF; END PROCESS; PROCESS(CNTER) BEGIN IF CNTER=10#29999# THEN NEWCLK&='1'; ELSE NEWCLK&='0'; END IF; END PROCESS; --计数溢出信号控制END ART; 第6章 VHDL设计应用实例 2) 六进制计数器的源程序CNT6.VHD(十进制计数器的源 程序CNT10.VHD与此类似) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT6 IS PORT (CLK:IN STD_LOGIC;CLR:IN STD_LOGIC;ENA: IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 第6章 VHDL设计应用实例 CARRY_OUT: OUT STD_LOGIC ); END CNT6;ARCHITECTURE ART OF CNT6 ISSIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(CLK,CLR,ENA) BEGINIF CLR='1' THEN CQI&=&0000&;ELSIF CLK'EVENT AND CLK='1' THEN IF ENA='1' THENIF CQI=“0101” THEN CQI&=“0000”; 第6章 VHDL设计应用实例 ELSE CQI&=CQI+'1';END IF; END IF; END IF; END PROCESS; PROCESS(CQI)BEGINIF CQI=“0000” THEN CARRY_OUT&='1'; ELSE CARRY_OUT&='0';END IF; END PROCESS; CQ&=CQI; END ART; 第6章 VHDL设计应用实例 3) 秒表的源程序TIMES.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY TIMES IS PORT(CLR:IN STD_LOGIC; CLK:IN STD_LOGIC; ENA:IN STD_LOGIC; DOUT:OUT STD_LOGIC_VECTOR(23 DOWNTO 0));END TIMES;ARCHITECTURE ART OF TIMES IS COMPONENT CLKGENPORT(CLK:IN STD_LOGIC;NEWCLK:OUT STD_LOGIC); 第6章 VHDL设计应用实例 END COMPONENT;COMPONENT CNT10PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END COMPONENT; COMPONENT CNT6 PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END COMPONENT; 第6章 VHDL设计应用实例SIGNAL NEWCLK:STD_LOGIC;SIGNAL CARRY1:STD_LOGIC;SIGNAL CARRY2:STD_LOGIC; SIGNAL CARRY3:STD_LOGIC; SIGNAL CARRY4:STD_LOGIC; SIGNAL CARRY5:STD_LOGIC; BEGIN U0:CLKGEN PORT MAP(CLK=&CLK,NEWCLK=&NEWCLK);U1:CNT10 PORT MAP(CLK=&NEWCLK,CLR=&CLR,ENA=&ENA,CQ=&DOUT(3 DOWNTO 0),CARRY_OUT=&CARRY1); 第6章 VHDL设计应用实例U2:CNT10 PORT MAP(CLK=&CARRY1,CLR=&CLR,ENA=&ENA, CQ=&DOUT(7 DOWNTO 4),CARRY_OUT=&CARRY2); U3:CNT10 PORT MAP(CLK=&CARRY2,CLR=&CLR,ENA=&ENA,CQ=&DOUT(11 DOWNTO 8),CARRY_OUT=&CARRY3);U4:CNT6 PORT MAP(CLK=&CARRY3,CLR=&CLR,ENA=&ENA, CQ=&DOUT(15 DOWNTO 12),CARRY_OUT=&CARRY4); U5:CNT10 PORT MAP(CLK=&CARRY4,CLR=&CLR,ENA=&ENA, CQ=&DOUT(19 DOWNTO 16),CARRY_OUT=&CARRY5); U6:CNT6 PORT MAP(CLK=&CARRY5,CLR=&CLR,ENA=&ENA, CQ=&DOUT(23 DOWNTO 20)); END ART; 第6章 VHDL设计应用实例 3. 硬件逻辑验证 选择实验电路结构图NO.0,由5.2节的实验电路结构图NO.0和图6.7确定引脚的锁定。时钟信号CLK可接CLOCK0,计数清零信号接键1,计数使能信号接键2,数码管1~6分别显 示以1/100 s、1/10 s、1 s、10 s、1 min、10 min为计时基准的 计数值。 进行硬件验证时方法如下:选择实验模式0,时钟信号CLK与CLOCK0信号组中的3 MHz信号相接,键1和键2分别为计数清零信号和计数使能信号,计数开始后时间显示在6个数 码管上。 第6章 VHDL设计应用实例6.7 MCS-51单片机与FPGA/CPLD总线接口逻辑设计单片机具有性能价格比高、功能灵活、易于人机对话和良 好的数据处理能力等特点;PLD则具有高速、高可靠以及开发 便捷规范等方面的优点,以此两类器件相结合的电路结构在许多高性能仪器仪表和电子产品中将被广泛应用。单片机与CPLD的接口方式一般有两种,即总线方式与独立方式。 单片机以总线方式与FPGA/CPLD进行数据与控制信息通信 有许多优点: 第6章 VHDL设计应用实例 (1) 速度快。其通信工作时序是纯硬件行为,对于MCS-51 单片机,只需一条单字节指令就能完成所需的读/写时序,如: MOV @DPTR,A;MOV A,@DPTR。 (2) 节省PLD芯片的I/O口线。如图6.9,如果将图中的译码DECODER设置足够的译码输出,以及安排足够的锁存器,就能仅通过19根I/O口线在FPGA/CPLD与单片机之间进行各种类 型的数据与控制信息交换。 (3) 相对于非总线方式,单片机的编程简捷,控制可靠。 第6章 VHDL设计应用实例 (4) 在FPGA/CPLD中通过逻辑切换,单片机易于与SRAM 或ROM接口。这种方式有许多实用之处,如利用类似于微处 理器DMA的工作方法,首先由FPGA/CPLD与接口的高速A/D 等器件进行高速数据采样,并将数据暂存于SRAM中,采样结束后,通过切换,使单片机与SRAM以总线方式进行数据通信,以便发挥单片机强大的数据处理能力。 第6章 VHDL设计应用实例 1.设计思路 对单片机与FPGA/CPLD以总线方式通信的逻辑设计, 应详细 了解单片机的总线读写时序,根据时序图来设计逻辑结构。图6.8 是MCS-51系列单片机的时序图,其时序电平变化速度与单片机工作时钟频率有关。图中,ALE为地址锁存使能信号,可利用其下降沿将低8位地址锁存于FPGA/CPLD中的地址锁存器 (LATCH_ADDRES)中。当ALE将低8位地址通过P0锁存的同时, 高8位地址已稳定建立于P2口,单片机利用读写指令允许信号 PSEN的低电平,从外部ROM中将指令从P0口读入。由时序图可 见,其指令读入的时机是在PSEN的上跳沿之前。接下来,由P2口 和P0口分别输出高8位和低8位数据地址,并由ALE的下沿将P0口 的低8位地址锁存于地址锁存器。 第6章 VHDL设计应用实例 若需从“FPGA/CPLD”中读出数据,单片机则通过指令“MOV A,@DPTR”使RD信号为低电平,由P0口将图6.9中锁存器LATCH_IN1中的数据读入累加器A。但若欲将累加器A的 数据写进FPGA/CPLD,需通过指令“MOV @DPRT,A”和写允 许信号WR。这时,DPTR中的高8位和低8位数据作为高低8位 地址分别向P2 和P0口输出,然后由WR的低电平,并结合译码,将A的数据写入图中相关的锁存器。 第6章 VHDL设计应用实例ALE P SEN W R/RD P2 P0 A7~A0地址锁存沿指令读允许外部RAM 读/写允许指令地址 A15~A8数据地址A15~A8指令A7~A0 低8位数据地址数据A7~A0 低8位数据地址低8位指令地址图6.8 MCS-51单片机总线接口方式工作时序 第6章 VHDL设计应用实例FP GA /CP LD DECOD ER WR R D
ALE 8 8 ALE LATCH_A DD RES 8 LATCH1 I1 P0LATCHT_IN1READ Y AD _CS DA TOUT W R_EN ABLE1 1 LATCH_O UT1 8 DA TOUT W R_EN ABLE2 2 LATCH_O UT2 8WR RD P28 8W R_EN ABLE1 W R_EN ABLE2 RD_EN ABLE8DA TAIN 1 8图6.9 CPLD/FPGA与MCS-51单片机的总线接口通信逻辑图 第6章 VHDL设计应用实例2. VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --MCS-51单片机读写电路ENTITY MCS_51 ISPORT( --与8031接口的各端口定义: P0:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0); --双向地址/数据口P2:IN STD_LOGIC_VECTOR(7 DOWNTO 0);RD,WR:IN STD_LOGIC; ALE:IN STD_LOGIC;--高8位地址线--读、写允许 -- 地址锁存READY:IN STD_LOGIC;AD_CS:OUT STD_LOGIC;--待读入数据准备就绪标志位--A/D器件片选信号DATAIN1:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--单片机待读回信号LATCH1:IN STD_LOGIC;--读回信号锁存 第6章 VHDL设计应用实例DATOUT1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--锁存输出数据1 DATOUT2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--锁存输出数据2 END MCS-51;ARCHITECTURE ART OF MCS-51 ISSIGNAL LATCH_ADDRES:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LATCH_OUT1:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL LATCH_OUT2:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL LATCH_IN1:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL WR_ENABLE1:STD_LOGIC;SIGNAL WR_ENABLE2:STD_LOGIC;BEGIN PROCESS ( ALE ) BEGIN --低8位地址锁存进程 第6章 VHDL设计应用实例IF ALE'EVENT AND ALE= '0' THEN LATCH_ADDRES&=P0; END IF; END PROCESS; PROCESS(P2,LATCH_ADDRES) --WR写信号译码进程1 --ALE的下降沿将P0口的低8位地址 --锁入锁存器LATCH_ADDRES中BEGINIF ( LATCH_ADDRES= &&) AND ( P2= && ) THEN WR_ENABLE1&=WR; --写允许ELSE WR_ENABLE1&= '1'; END IF ;--写禁止END PROCESS; PROCESS ( WR_ENABLE1 ) --数据写入寄存器1 第6章 VHDL设计应用实例BEGINIF WR_ENABLE1'EVENT AND WR_ENABLE1 = '1' THEN LLATCH_OUT1&= P0; END IF;END PROCESS;PROCESS (P2,LATCH_ADDRES ) BEGIN --WR写信号译码进程2IF ( LATCH_ADDRES= &&)AND(P2= && ) THENWR_ENABLE2&= WR; ELSE WR_ ENABLE2&= '1';END IF; END PROCESS; PROCESS (WR_ENABLE2 ) BEGIN --数据写入寄存器2 --写允许 --写禁止 第6章 VHDL设计应用实例IF WR_ENABLE2'EVENT AND WR_ENABLE2= '1'THEN LATCH_OUT2&=P0; END IF; END PROCESS;PROCESS(P2,LATCH_ADDRES,READY,RD)--8031对PLD中数据读入进程 BEGINIF ( LATCH_ADDRES= && ) AND ( P2= && )AND ( READY= '1') AND ( RD= '0' ) THEN P0&=LATCH_IN1; --寄存器中的数据读入P0口ELSE P0&= &ZZZZZZZZ&;END IF ;END PROCESS; PROCESS(LATCH1 )--禁止读数,P0口呈高阻态--外部数据进入CPLD进程 第6章 VHDL设计应用实例BEGINIF LATCH1'EVENT AND LATCH1= '1' THEN LATCH_IN1&=DATAIN1; END IF;END PROCESS;PROCESS(ALTCH_ADDRES) BEGIN --A/D工作控制片选信号输出进程IF ( LATCH_ADDRES= && ) THENAD_CS&= '0'; ELSE AD_CS&= '1'; END IF; --允许A/D工作 -- 禁止A/D工作END PROCESS;DATOUT1&=LATCH_OUT1; DATOUT2&=LATCH_OUT2; EDN ART; 第6章 VHDL设计应用实例 这是一个CPLD与8031单片机接口的VHDL电路设计。 8031以总线方式工作,例如,由8031将数据5AH写入目标器件 中的第一个寄存器LATCH_OUT1的指令是: MOV A,#5AH MOV DPTR,#6FF5HMOVX @DPTR,A当READY为高电平时,8031从目标器件中的寄存器 LATCH_IN1将数据读入的指令是: MOV DPTR,#9F7EH MOVX A,@DPTR 第6章 VHDL设计应用实例6.8 交通灯信号控制器的设计1. 设计思路设交通灯信号控制器用于主干道与支道公路的交叉路口,要求是优先保证主干道的畅通。因此,平时处于“主干道绿灯,支道红灯”状态,只有在支道有车辆要穿行主干道时,才将交通灯切向“主干道红灯,支道绿灯”,一旦支道无车辆通过路 口,交通灯又回到“主干道绿灯,支道红灯”的状态。此外,主干道和支道每次通行的时间不得短于30 s,而在两个状态交换过程出现的“主黄,支红”和“主红,支黄”状态,持续时间 都为4 s。根据交通灯信号控制的要求,我们可把它分解为定时器和控制器两部分,其原理方框图如图6.10所示。 第6章 VHDL设计应用实例图6.10 交通灯信号控制器原理方框图 第6章 VHDL设计应用实例2. VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY JTDKZ IS PORT(CLK,SM,SB;IN BIT;--这里要求CLK为1 kHzMR,MY,MG,BR,BY,BG:OUT BIT);END JTDKZ; ARCHITECTURE ART OF JTDKZ IS TYPE STATE_TYPE IS (A,B,C,D); SIGNAL STATE:STATE_TYPE;BEGIN 第6章 VHDL设计应用实例 CNT:PROCESS(CLK) VARIABLE S:INTEGER RANGE 0 TO 29; VARIABLE CLR,EN:BIT; BEGINIF (CLK'EVENT AND CLK='1') THENIF CLR = '0' THEN S:=0; ELSIF EN = '0' THEN S:=S;ELSE S:=S+1;END IF; CASE STATE ISWHEN A=&MR&='0';MY&='0';MG&='1';BR&= '1';BY&= '0';BG&= '0'; 第6章 VHDL设计应用实例IF (SB AND SM)= '1' THEN IF S=29 THEN STATE&=B;CLR:='0';EN:='0'; ELSE STATE&=A;CLR:='1';EN: = '1'; END IF; ELSIF (SB AND (NOT SM)) = '1' THEN STATE&=B;CLR:='0';EN:='0'; ELSE STATE&=A;CLR:='1';EN:='1'; END IF; WHEN B =&MR&= '0';MY&= '1';MG&= '0'; BR&= '1';BY&= '0';BG&= '0'; 第6章 VHDL设计应用实例IF S=3 THEN STATE &=C;CLR:='0';EN:='0'; ELSE STATE&=B;CLR:='1';EN:='1'; ENDIF; WHEN C =&MR&= '1';MY&= '0';MG&= '0'; BR&= '0';BY&= '0';BG &= '1'; IF (SM AND SB) = ' 1' THEN IF S=29 THEN STATE&=D;CLR:='0';EN:='0'; ELSE STATE&=C;CLR:= '1';EN:='1'; ELSIF SB = '0' THEN STATE &=D;CLR:= '0';EN:='0'; 第6章 VHDL设计应用实例ELSE STATE&=C;CLR:='1';EN:='1'; END IF ; WHEN D=&MR&= '1';MY&='0';MG&='0'; BR&='0';BY&='1';BG&= '0'; IF S =3 THEN STATE&=A;CLR:='0';EN:='0'; ELSE STATE&=D;CLR:='1';EN:='1'; END IF ; END CASE; END IF; END PROCESS CNT; END ART; 第6章 VHDL设计应用实例 3. 硬件逻辑验证 选择实验电路结构图NO.1,由5.2节的实验电路结构图NO.1和图6.10确定引脚的锁定。时钟脉冲CLK可接CLOCK0(1Hz),主干道和支干道来车信号分别接键7和键8,主干道和支 干道红、黄、绿灯驱动信号MR、MY、MG和BR、BY、BG分 别接D1~D3和D8~D6。 进行硬件验证时方法如下:选择实验模式1,时钟脉冲与CLOCK0信号组中的1 Hz信号相接,在键7和键8施加相应的信号,发光二极管D1~D3、D8~D6则按控制要求显示相应的信 号。 第6章 VHDL设计应用实例6.9 语音信箱控制系统的设计1.设计思路语音信箱控制系统用于控制对语音信箱的有关操作,允许用户发送信息、重阅信息、存储信息和擦除信息,状态转移图如图6.11所示。 第6章 VHDL设计应用实例MAIN_S T 1 REVIEW_S T REVIEW MAIN语音 信箱2 SEND_ST SEND ADDRESS_S T ADDRESS RECORD_ST RECORD收信 阅览3 1 REPEA T 2发信寻址记录5 RECORD MESSAGE BEGIN RECORDSAVE重复存信ERASE擦除记录 语音MESSAGE_ST开始 录音REPEAT_S TSAVE_STERASE_ STBIGIN_REC_ST图6.11 语音信箱控制器的状态转移图 第6章 VHDL设计应用实例正常起始状态是MAIN_ST状态,从MAIN_ST状态,用户 选择究竟是收信息还是发信息。为了得到收阅菜单,用户在按 键电话上按1键;为了选发送信息菜单,用户在按键菜单上按2 键。一旦用户选择了这些选项中的任何一种,下一级菜单允许用户选择执行进一步(如存储与删除信息)的功能。例如,如果用户先按键1,选收阅菜单,那么再按键2,将允许用户在收阅完时存储用户收阅过的信息。 第6章 VHDL设计应用实例2. VHDL源程序 PACKAGE VM_PACK IS TYPE T_VM_STATE IS(MAIN_ST,REPEAT_ST,SAVE_ST, BEGIN_REC_ST,MESSAGE_ST); TYPE T_KEY('1','2','3','4','5','6','7','8','9','*','#'); END VM_PACK; LIBRARY IEEE; USE WORK.VM_PACK,ALL; USE IEEE.STD_LOGIC_1164.ALL;ERASE_ST,SEND_ST,ADDRESS_ST,RECORD_ST,ENTITY CONTROL ISPORT(CLK,KEY:IN STD_LOGIC; 第6章 VHDL设计应用实例PLAY,RECORD,ERASE,SAVE,ADDRESS:OUT STD_LOGIC); END CONTROL; ARCHITECTURE ART OF CONTROL IS SIGNAL NEXT_STATE,CURRENT_STATE:T_VM_STATE;BEGINPROCESS(CURRENT_STATE,KEY) BEGINPLAY&= '0';SAVE &= '0';ERASE&= '0';RECORD&= '0';ADDRESS&= '0'; CASE CURRENT_STATE ISWHEN MAIN_ST =&--看信箱IF ( KEY='1') THEN 第6章 VHDL设计应用实例NEXT_STATE&=REVIEW_ST; ELSIF (KEY ='2') THEN NEXT_STATE&=SEND_ST ; ELSE NEXT_STATE&=MAIN_ST; END IF; WHEN REVIEW_ST=& --重阅 转到发送 --转到重阅IF (KEY='1')THENNEXT_STATE&=REPEAT_ST; ELSIF(KEY='2') THENNEXT_STATE&=SAVE_ST;ELSIF( KEY = '3') THEN NEXT_STATE =ERASE_ST;ELSIF( KEY = '#') THEN 第6章 VHDL设计应用实例NEXT_STATE =MAIN_ST;ELSE NEXT_STATE&=REVIEW_ST;END IF;WHEN REPEAT_ST =& PLAY&= '1'; --重复NEXT_STATE&=REVIEW_ST;WHEN SAVE_ST =& SAVE&= '1'; --存信息NEXT_STATE&=REVIEW_ST;WHEN ERASE_ST =& ERASE&= '1'; NEXT_STATE&=REVIEW_ST; --擦掉 第6章 VHDL设计应用实例WHEN SEND_ST =& --发送NEXT_STATE&=ADDRESS_ST; WHEN ADDRESS_ST =& --寻址ADDRESS&= '1';IF (KEY='#')THEN NEXT_STATE&=RECORD_ST;ELSENEXT_STATE, =ADDRESS_ST; END IF ; WHEN RECORD_ST=& IF (KEY='5') THEN NEXT_STATE&=BEGIN_REC_ST; ELSE --记录 第6章 VHDL设计应用实例NEXT_STATE&=RECORD_ST;END IF; WHEN BEGIN_REC_ST =& --开始录音RECORD&= '1';NEXT_STATE&=MESSAGE_ST; WHEN MESSAGE_ST=& RECORD&= '1'; IF (KEY='#')THEN --记录录音NEXT_STATE&=SEND_ST;ELSE发送到信箱NEXT_STATE&=MESSAGE_ST; 第6章 VHDL设计应用实例 END IF; END CASE; END PROCESS; PROCESS BEGIN WAIT UNTIL (CLK'EVENT AND CLK = '1'); CURRENT_STATE&=NEXT_STATE; END PROCESS; END ART; 第6章 VHDL设计应用实例 程序包VM_PACK含有对状态值的类型说明和语音信箱控 制系统允许用的键盘。必须指出的是,状态是用来表示某些事件的全过程,而事件的全过程又是由它所对应状态(如STATE1、STATE2和STATE3 等)来说明,用状态描述将使模块的可读性 更好。 为了实用,这个程序包实体标明了局部信号和键输入端口。 该实体只有一种输入(即键输入),由按键电话的键盘示出可能 的键字,实体除KEY和CLK之外,所有其他的端口都是输出端 口,并且用这些端口控制语音信箱系统的工作。 第6章 VHDL设计应用实例6.10 PID控制器的设计1.设计思路 要求设计一个PID控制器,对电机转速进行采样,与额定的 转速进行比较,并通过微积分计算得到电机的控制电流,从而 实现对电机转速的调整。通常,PID控制器用模拟电路实现,但 数字电路的实现方案可以很方便地实现集成。该PID控制器包括一个完成算术和逻辑功能的ALU以及一个存储状态变量和有关系数的存储器。其端口说明如图6.12 所示。 第6章 VHDL设计应用实例RESET FSIGNIN HOSTINTERRUPT POSITIONCHANGEPID控制器IREFKOUT图6.12 PID控制器示意图 第6章 VHDL设计应用实例 其中,RESET 端口为复位端口,当RESET为高电平时, PID控制器复位;FSIGNIN为输入的偏差方向,转速超过额定转速时为‘1?,否则为‘0?;HOSTINTERRUPT为主机请求信号,当此信号为‘1?时,PID开始计算,为‘0?时,则停止计算并输 出结果。POSITIONCHANGE为电机向PID控制器发送的脉冲信 号,每转过一周,POSITONCHANGE 出现一个脉冲; IREFKOUT为最终输出的控制电流值。主机向PID控制器发调用请求HOSTINTERRUPT之后,PID控制器进行采样并开始计算,当HOSTINTERRUPT信号停止时,PID控制器停止采样计算,并将计算结果输出到主机。 第6章 VHDL设计应用实例 PID控制器的电流计算公式为 Irefk=(Kp+Ek) + Ki×∫Ekdt + Kd×dEk/dt 采用近似的离散方式表示为 Irefk=(Kp+Ek) + Ki ×∑ Ekdt + Kd ×dEk/dt PID控制器运行时,电机每转过一周,即 POSITIONCHANGE信号发生一次变化时进行采样,得到电机转 过一周所需要的时间,并将其作为积分的dt值,将该dt 值取倒数 计算出转速。然后与标准转速进行比较,得到转速偏差Ek,将该 Ek与前一周得到的Ek-1相减得出d Ek 。将每一周的Ek /dt值相加得 到积分∫ Ek /dt的值。当HOSTINTERRUPT信号出现下降沿时将积 分与当前时刻的(Kp+ Ek)以及Kd×d Ek /dt线性相加得到控制电流 值。然后,在下一个时钟周期将该控制电流值输出到主机。 第6章 VHDL设计应用实例 4.VHDL源程序 LIBRARY WORK; USE WORK.SYNCHRO.ALL;USE WORK.OP_PKG.ALL;ENTITY PID IS PORT ( RESET:IN BIT;FSIGNIN:IN BIT;HOSTINTERRUPT:IN BIT; POSITIONCHANGE:IN BIT;IREFKOUT :OUT REAL );END PID; ARCHITECTURE ART OF PID IS COMPONENT FU_FPU 第6章 VHDL设计应用实例PORT (CLOCK :IN BIT;RESET :N BIT;INPUT1 :IN REAL;INPUT2 :IN REAL; SEL :IN BIT; COM :IN INT3BIT; OUTPUT :OUT REAL; OUTDONE :OUT BIT); END COMPONENT; 第6章 VHDL设计应用实例 SIGNAL SIG_IN1,SIG_IN2 :REAL; SIGNAL SIG_OUT : REAL; SIGNAL SIG_SEL,SIG_DONE :BIT; SIGNAL SIG_COM : INT3BIT; SIGNAL CLOCK : BIT;-- &= '1';FOR ALL:FU_FPU USE ENTITY WORK.FIXEDPOINTUNIT(ART); 第6章 VHDL设计应用实例BEGININST_FU :FU_FPU PORT MAP(CLOCK =& CLOCK, RESET =& RESET, INPUT1 =& SIG_IN1,INPUT2 =& SIG_IN2,SEL =& SIG_SEL,COM=& SIG_COM,OUTPUT =& SIG_OUT, OUTDONE =& SIG_DONE); 第6章 VHDL设计应用实例PROCESSVARIABLE N,EK_1,IK,EK,KP,KI,KD,FREF: REAL; VARIABLE FK,DEK,IREFK, TEMP: REAL;VARIABLE DONE : BIT; 第6章 VHDL设计应用实例 PROCEDURE MUL(A,B : IN REAL) IS BEGINSIG_IN1 &= A;SIG_IN2 &= B; SIG_SEL &='1'; SIG_COM &= 2; WAIT UNTIL RISING_EDGE(CLOCK); SIG_SEL &='0'; RETURN;END MUL; 第6章 VHDL设计应用实例 PROCEDURE REP(A: IN REAL) IS BEGINSIG_IN1 &= A;SIG_SEL &='1';SIG_COM &= 1;WAIT UNTIL RISING_EDGE(CLOCK); SIG_SEL &='0'; RETURN; END REP; 第6章 VHDL设计应用实例PROCEDURE WAITRESULT(X:OUT REAL; Y:OUT BIT) ISBEGIN X := SIG_OUT; Y := SIG_DONE; WAIT UNTIL RISING_EDGE(CLOCK);RETURN;END WAITRESULT; TYPE ROM IS ARRAY(0 TO 4) OF REAL;VARIABLE VAL_ROM : ROM := (2.0*2.0**(-20),2.0,3.0*2.0**(20),4.0*2.0**(20),2.0*2.0** (-20)); PROCEDURE GETCONSTKP(X :OUT REAL) IS 第6章 VHDL设计应用实例BEGIN X := VAL_ROM(0); END GETCONSTKP; PROCEDURE GETCONSTKI(X :OUT REAL) IS BEGIN X := VAL_ROM(1); END GETCONSTKI; PROCEDURE GETCONSTKD(X : OUT REAL) IS BEGIN X := VAL_ROM(2); END GETCONSTKD; PROCEDURE GETFREF(X :OUT REAL) IS BEGIN X := VAL_ROM(3); 第6章 VHDL设计应用实例 END GETFREF; PROCEDURE GETN(X :OUT REAL) IS BEGIN X := VAL_ROM(4); END GETN; BEGIN GETCONSTKP(KP); GETCONSTKI(KI); GETCONSTKD(KD); GETFREF(FREF); IK :=0.0; EK := 0.0; IREFK := 0.0; 第6章 VHDL设计应用实例--WAIT FOR 50 NS;WAIT UNTIL (HOSTINTERRUPT ='0'); WHILE (HOSTINTERRUPT ='0') LOOPWAIT UNTIL(POSITIONCHANGE ='1');GETN(N); REP(N);EK_1 := EK;--WAIT UNTIL(DONE ='1') WAITRESULT(FK,DONE);WHILE (DONE /='1') LOOP WAITRESULT(FK,DONE); END LOOP;IF(FSIGNIN ='0') THEN EK := FREF - FK; ELSE EK := FREF + FK; 第6章 VHDL设计应用实例END IF; MUL(KP,EK); DEK := EK - EK_1; WAITRESULT(IREFK,DONE); MUL(DEK,FK); WAITRESULT(TEMP,DONE); MUL(TEMP,KD); WAITRESULT(TEMP,DONE); IREFK := IREFK + TEMP;WHILE(DONE /='1'') LOOP WAITRESULT(IREFK,DONE); END LOOP;WHILE(DONE /='1') LOOP WAITRESULT(TEMP,DONE); END LOOP;WHILE(DONE /='1') LOOP WAITRESULT(TEMP,DONE); END LOOP; 第6章 VHDL设计应用实例MUL(EK,N);WAITRESULT(TEMP,DONE);WHILE(DONE /='1') LOOP WAITRESULT(TEMP,DONE); END LOOP;IK := IK + TEMP;MUL(IK,KI); WAITRESULT(TEMP,DONE); -- IREFKOUT &= IREFK + TEMP; IREFK := IREFK + TEMP; END LOOP; IREFKOUT &= IREFK; END PROCESS; CLOCK &= NOT CLOCK ; END ART;WHILE (DONE /='1') LOOP WAITRESULT(TEMP ,DONE); END LOOP; 第6章 VHDL设计应用实例6.11 空调系统有限状态自动机的设计1.设计思路 设计一个空调系统的有限状态自动机,它的两个输入端 TEMP_HIGH 和TEMP_LOW分别与传感器相连,用于检测室内 温度。如果室内温度正常,则TEMP_HIGH和TEMP_LOW均为 ‘0?。如果室内温度过高,则TEMP_HIGH为‘1?,TEMP_LOW 为‘0 ?。如果室内温度过低,则TEMP_HIGH为‘0?, TEMP_LOW为‘1?。根据TEMP_HIGH 和TEMP_LOW的值来判 断当前的状态(太热TOO_HOT,太冷 TOO_COLD或适中 JUST_RIGHT),并决定HEAT和COOL的输出值。其原理方框图 如图6.13所示。 第6章 VHDL设计应用实例TEMP_HIGH TEMP_LOW 空调有限状态 自动机HEAT COOL图6.13 空调有限状态自动机原理方框图 第6章 VHDL设计应用实例 2.VHDL源程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY AIR_CONDITIONER ISPORT(CLK : IN STD_ULOGIC; TEMP_HIGH :IN STD_ULOGIC; TEMP_LOW : IN STD_ULOGIC; HEAT : OUT STD_ULOGIC; COOL : OUT STD_ULOGIC); END AIR_CONDITIONER; 第6章 VHDL设计应用实例ARCHITECTURE ART OF AIR_CONDITIONER IS TYPE STATE_TYPE IS (JUST_RIGHT,TOO_COLD,TOO_HOT); ATTRIBUTE SEQUENTIAL_ENCODING : STRING;ATTRIBUTE SEQUENTIAL_ENCODING OF STATE_TYPE :TYPE IS “00 01 10”SIGNAL STVAR: STATE_TYPE;ATTRIBUTE STATE_VECTOR : STRING; ATTRIBUTE STATE_VECTOR OF STYLE_B:ARCHITECTURE IS “STVAR”;BEGINCONTROLLER1: PROCESS BEGIN WAIT UNTIL CLK='1'; --REVISED BY DLS 第6章 VHDL设计应用实例IF (TEMP_LOW='1') THEN STVAR&=TOO_COLD; ELSIF (TEMP_HIGH='1') THEN STVAR&=TOO_HOT; ELSE STVAR&=JUST_RIGHT; END IF;CASE STVAR ISWHEN JUST_RIGHT=&HEAT&='0';COOL&='0'; WHEN TOO_COLD=&HEAT&='1';COOL&='0'; WHEN TOO_HOT=&HEAT&='0';COOL&='1'; END CASE;END PROCESS CONTROLLER1;END ART; 第6章 VHDL设计应用实例6.12 闹钟系统的设计6.12.1 闹钟系统的设计要求及设计思路 要求设计一个带闹钟功能的24小时计时器,计时器的外观如 图6.14所示。它包括以下几个组成部分:① 显示屏,由4个七段 数码管组成,用于显示当前时间(时:分)或设置的闹钟时间;② 数字键‘0?~‘9?,用于输入新的时间或新的闹钟时间;③TIME(时间)键,用于确定新的时间设置;④ ALARM(闹钟)键,用于确定新的闹钟时间设置,或显示已设置的闹钟时间;⑤ 扬 声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。 第6章 VHDL设计应用实例7894560123TIMEALARM图6.14 计时器外观 第6章 VHDL设计应用实例该计时器设计要求完成如下功能:(1) 计时功能:这是本计时器设计的基本功能,每隔一分钟 计时一次,并在显示屏上显示当前时间。 (2) 闹钟功能:如果当前时间与设置的闹钟时间相同,则扬 声器发出蜂鸣声。(3) 设置新的计时器时间:用户用数字键‘0?~‘9?输入新的 时间,然后按 &TIME&键确认。在输入过程中,输入数字在显示 屏上从右到左依次显示。例如,用户要设置新的时间12:34, 则按顺序输入“1”,“2”,“3”,“4”键,与之对应,显示屏上 依次显示的信息为:“1”,“12”,“123”,“1234&。如果用户 在输入任意几个数字后较长时间内,例如5 s,没有按任何键, 则计时器恢复到正常的计时显示状态。 第6章 VHDL设计应用实例 (4) 设置新的闹钟时间:用户用数字键“0”~“9”输入新的时 间,然后按“ALARM”键确认。过程与(3)类似。(5) 显示所设置的闹钟时间:在正常计时显示状态下,用户直接按下“ALARM”键,则已设置的闹钟时间将显示在显示屏上。根据上述的设计要求,整个系统大致包括如下几个组成部 分:用于键盘输入的缓冲器;用于时钟计数的计数器;用于保 存闹钟时间的寄存器;用于显示的七段数码显示电路以及控制 以上各个部分协同工作的控制器。 第6章 VHDL设计应用实例 6.12.2 闹钟系统的控制器的设计 1.设计思路控制器命名为ALARM_CONTROLLER,其外部端口如图 6.15所示。各端口的作用如下:(1) CLK为外部时钟信号,RESET为复位信号。 (2) 当KEY为高电平(KEY= '1')时,表示用户按下数字键 (“0”~“9”)。(3) 当ALARM_BUTTON为高电平时,表示用户按下 “ALARM”键。(4) 当TIME_BUTTON为高电平时,表示用户按下“TIME” 键。 第6章 VHDL设计应用实例KEY ALARM_BUTTON TIME_BUTTON CLK RESETALARM_CONTROLLER LOAD_NEW_A LOAD_NEW_C SHOW_NEW_TIME SHOW_A图6.15 控制器的外部端口 第6章 VHDL设计应用实例 (5) 当LOAD_NEW_A 为高电平时,控制(闹钟时间寄存器) 加载新的闹钟时间值。(6) 当LOAD_NEW_C为高电平时,控制(时钟计数器)设置新的时间值。(7) 当SHOW_NEW_TIME为高电平时,控制(七段数码显示电路)显示新的时间值,即用户通过数字键输入的时间;否则,当SHOW_NEW_TIME为低电平时,根据SHOW_A信号的值控制显示当前时间或闹钟时间。此时,当SHOW_A为高电平时, 控制显示闹钟时间,否则,显示当前时间。 第6章 VHDL设计应用实例 控制器的功能可以通过有限状态自动机(FSM)的方式来实 现。根据设计要求及端口设置,需要5个状态来实现: S0: 表示电路初态即正常时钟计数状态,完成前面设计功 能 (1) 的工作。 S1:接收键盘输入状态。在状态S0时用户按下数字键后进 入此状态。在此状态下,显示屏上显示的是用户键入的数字。 S2:设置新的闹钟时间。在状态S1时用户按下ALARM键后进入此状态。S3:设置新的计时器时间。在状态S1时用户按下TIME键后进入此状态。 第6章 VHDL设计应用实例 S4:显示闹钟时间。在状态S0时用户直接按下ALARM键 后进入此状态。在此状态下, 显示屏上显示的是所设置的闹钟 时间。注意:在此状态下,用户按下ALARM键后,显示屏上 保持显示闹钟时间,经过一段时间以后,再返回状态S0显示计时器时间。 第6章 VHDL设计应用实例 表6.1 控制器状态转换及控制输出表当前状态 S0 控制输入(条件) KEY = ?1? ALARM_BUTTON = ?1? 否则 KEY = ?1? ALARM_BUTTON = ?1? TIME_BUTTON = ?1? 否 是 ALARM_BUTTON = ?1? 否则 TIME_BUTTON = ?1? 否则 ALARM_BUTTON = ?1? 否 否则(超时) 是 否则(超时) S2 S3 S4 下一状态 S1 S4 S0 S1 S2 S3 S1 S0 S2 S0 S3 S0 S4 S4 S0 控制输出(动作) SHOW_NEW_TIME &= ?1? SHOW_A &= ?1? -SHOW_NEW_TIME &= ?1? LOAD_NEW_A &= ?1? LOAD_NEW_C &= ?1? SHOW_NEW_TIME &= ?1?, “超时”判断处理 -LOAD_NEW_A &= ?1? -LOAD_NEW_C &= ?1? -SHOW_A &= ?1? SHOW_A &= ?1?, “超时”判断处理 --S1 第6章 VHDL设计应用实例表6.1中没有显式说明的控制信号赋值,表示信号的值为零。例如在状态S0,当信号KEY =?1?时,SHOW_NEW_TIME 信号的赋值为‘1?,而其他信号LOAD_NEW_A, LOAD_NEW_C和SHOW_A的值此时都赋为‘0?。另外,表中 关于“超时”判断处理的处理细节见VHDL源程序中的有关部 分。 第6章 VHDL设计应用实例2.VHDL源程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE WORK.P_ALARM.ALL; ENTITY ALARM_CONTROLLER IS PORT(KEY :IN STD_LOGIC; ALARM_BUTTON :IN STD_LOGIC; TIME_BUTTON :IN STD_LOGIC; CLK :IN STD_LOGIC; RESET :IN STD_LOGIC; LOAD_NEW_A :OUT STD_LOGIC; LOAD_NEW_C :OUT STD_LOGIC; SHOW_NEW_TIME :OUT STD_LOGIC; SHOW_A :OUT STD_LOGIC ); END ALARM_CONTROLLER; 第6章 VHDL设计应用实例ARCHITECTURE ART OF ALARM_CONTROLLER ISTYPE T_STATE IS (S0, S1, S2, S3,S4); CONSTANT KEY_TIMEOUT :T_SHORT := 500;CONSTANT SHOW_ALARM_TIMEOUT : T_SHORT := 500;SIGNAL CURR_STATE : T_STATE; SIGNAL NEXT_STATE : T_STATE; SIGNAL COUNTER_K : T_SHORT; SIGNAL ENABLE_COUNT_K : STD_LOGIC; SIGNAL COUNT_K_END : STD_LOGIC; SIGNAL COUNTER_A : T_SHORT; SIGNAL ENABLE_COUNT_A : STD_LOGIC; SIGNAL COUNT_A_END : STD_LOGIC; BEGIN 第6章 VHDL设计应用实例 PROCESS(CLK,RESET) BEGIN IF RESET ='1' THEN CURR_STATE &= S0; ELSIF RISING_EDGE(CLK) THEN CURR_STATE &= NEXT_STATE; END IF; END PROCESS; 第6章 VHDL设计应用实例PROCESS(KEY,ALARM_BUTTON,TIME_BUTTON,CURR_STATE, COUNT_A_END,COUNT_K_END) BEGIN NEXT_STATE LOAD_NEW_A LOAD_NEW_C &= CURR_STATE; &= '0'; &= '0';SHOW_A&= '0';SHOW_NEW_TIME &= '0'; ENABLE_COUNT_K &= '0'; ENABLE_COUNT_A &= '0'; 第6章 VHDL设计应用实例CASE CURR_STATE IS WHEN S0 =& IF (KEY = '1') THEN NEXT_STATE &= S1; SHOW_NEW_TIME &= '1'; ELSIF (ALARM_BUTTON = '1') THEN NEXT_STATE &= S4; SHOW_A &= '1'; ELSE NEXT_STATE &= S0; END IF; WHEN S1 =& IF (KEY = '1') THEN NEXT_STATE &= S1; 第6章 VHDL设计应用实例ELSIF (ALARM_BUTTON = '1') THEN NEXT_STATE &= S2; LOAD_NEW_A &= '1'; ELSIF (TIME_BUTTON = '1') THEN NEXT_STATE &= S3; LOAD_NEW_C &= '1'; ELSE IF (COUNT_K_END = '1') THEN NEXT_STATE &= S0; ELSE NEXT_STATE &= S1; END IF; ENABLE_COUNT_K &= '1'; END IF; SHOW_NEW_TIME &= '1'; 第6章 VHDL设计应用实例WHEN S2 =&IF (ALARM_BUTTON = '1') THEN NEXT_STATE &= S2; LOAD_NEW_A &= '1'; ELSE NEXT_STATE &= S0; END IF; WHEN S3 =& IF (TIME_BUTTON = '1') THEN NEXT_STATE &= S3; LOAD_NEW_C &= '1'; ELSE NEXT_STATE &= S0; 第6章 VHDL设计应用实例END IF;WHEN S4 =&IF (KEY = '1') THEN NEXT_STATE &= S1;ELSENEXT_STATE &= S4;IF (COUNT_A_END = '1') THEN NEXT_STATE &= S0; ELSENEXT_STATE &= S4;SHOW_A &= '1'; 第6章 VHDL设计应用实例END IF;ENABLE_COUNT_A &= '1'; END IF; WHEN OTHERS =& NULL; END CASE; END PROCESS; 第6章 VHDL设计应用实例COUNT_KEY : PROCESS(ENABLE_COUNT_K, CLK)BEGIN IF (ENABLE_COUNT_K = '0') THENCOUNTER_K &= 0;COUNT_K_END &= '0'; ELSIF (RISING_EDGE(CLK)) THENIF (COUNTER_K &= KEY_TIMEOUT) THENCOUNT_K_END &= '1'; ELSE COUNTER_K &= COUNTER_K + 1; END IF; END IF; END PROCESS; 第6章 VHDL设计应用实例COUNT_ALARM : PROCESS(ENABLE_COUNT_A, CLK) BEGIN IF (ENABLE_COUNT_A = '0') THEN COUNTER_A &= 0; COUNT_A_END &= '0'; ELSIF RISING_EDGE(CLK) THEN IF (COUNTER_A &= SHOW_ALARM_TIMEOUT) THEN COUNT_A_END &= '1'; ELSE COUNTER_A &= COUNTER_A + 1; END IF; END IF; END PROCESS; END ART; 第6章 VHDL设计应用实例 6.12.3 闹钟系统的译码器的设计 1.设计思路 本模块的功能是将每次按下闹钟系统的数字键盘后产生的 一个数字所对应的10位二进制数据信号转换为1位十进制整数 信号,以作为小时、分钟计数的4个数字之一,如图6.16所示。 其中KEYPAD为输入端口,接收10位二进制数据信号;VALUE为输出端口,输出相应的1位十进制整数信号。输入数据与输出数据的译码关系见表6.2。 第6章 VHDL设计应用实例DECODER KEYPAD VALUE图6.16 电路系统示意图 第6章 VHDL设计应用实例表6.2 输入、输出数据的译码关系输入 输出 输入 输出 0
9 第6章 VHDL设计应用实例2.VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE WORK.P_ALARM.ALL; ENTITY DECODER ISPORT(KEYPAD :IN STD_LOGIC_VECTOR(9 DOWNTO 0); VALUE :OUT T_DIGITAL);END DECODER;ARCHITECTURE ART OF DECODER IS BEGIN 第6章 VHDL设计应用实例 WITH KEYPAD SELECT VALUE &= 0 WHEN “”, 1 WHEN “”, 2 WHEN “”, 3 WHEN “”, 4 WHEN “”, 5 WHEN “”, 6 WHEN “”, 7 WHEN “”, 8 WHEN “”, 9 WHEN “”, 0 WHEN OTHERS; END ART; 第6章 VHDL设计应用实例 6.12.4 闹钟系统的移位寄存器的设计 1.设计思路 本模块的功能是在CLK端口输入信号的上升沿同步下,将 KEY端口的输入信号移入NEW_TIME 端口的输出信号最低位, 原有信息依次向左移,最高位信息丢失;而RESET端口的输入 信号对NEW_TIME端口输出信号进行异步清零复位。电路系统 示意图如图6.17所示。 第6章 VHDL设计应用实例KEY_BUFFER KEY CLK RESETNEW_TIME图6.17 移位寄存器电路示意图 第6章 VHDL设计应用实例2.VHDL源程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE WORK.P_ALARM.ALL; ENTIT}

我要回帖

更多关于 小房间设计图卧室图片 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信