基于vhdl语言的二进制转十进制并用数码管显示的设计(最终定稿)

时间:2019-05-12 23:21:13下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《基于vhdl语言的二进制转十进制并用数码管显示的设计》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《基于vhdl语言的二进制转十进制并用数码管显示的设计》。

第一篇:基于vhdl语言的二进制转十进制并用数码管显示的设计

河南科技学院机电学院 VHDL课程设计报告

题目:八位数码管显示

专业班级:电气工程及其自动化102 姓

名:

周迎接

学 号:

20100344214

指导教师: 付广春

完成日期:2012年12月 27 日

目 录 引言…………………………………………………………………………2 2 总体设计方案………………………………………………………………2 2.1 输入引脚数目的计算……………………………………………………3 2.2 二进制转为十进制部分程序设计………………………………………3 2.3 数码管显示部分程序设计………………………………………………4 3 仿真显示……………………………………………………………………5 3.1 显示3仿真图……………………………………………………………5 3.2显示96的仿真图…………………………………………………………5 4 心得体会……………………………………………………………………6 参考文献………………………………………………………………………6 附录1…………………………………………………………………………7

摘要

随着当今社会电子技术的快速发展,单凭借硬件已不再能满足广大人民的需求,这时候软件就显示除了他们突出的优点。与其他编程语言相比,VHDL语言以其超强的硬件描述能力,良好的可读性和可移植性,以及其良好的用户自定义性受到了广大用户的青睐。VHDL语言在最近几年的发展及其迅猛,由此可以看出其用途已经变的越来越广泛。

一个VHDL程序由5个部分组成,包括实体(ENTITY)、结构体(architecture)、配置(coxnfiguration)、包(package)和库(library)。实体和结构体两大部分组成程序设计的最基本单元。图2.2表示的是一个VHDL 3 程序的基本组成。配置是用来从库中选择所需要的单元来组成该系统设计的不同规格的不同版本,VHDL和Verilog HDL已成为IEEE的标准语言,使用IEEE提供的版本。包是存放每个设计模块都能共享的设计类型、常数和子程序的集合体。库是用来存放已编译的实体、结构体、包和配置。在设计中可以使用ASIC芯片制造商提供的库,也可以使用由用户生成的IP库。

今天我所要设计的是基于VHDL语言的8位数码管显示电路,其要实现的功能是把输入的二进制数转换为对应的十进制数,并通过数码管显示出来。其过程大致可以分为通过程序将输入的二进制数先转换为对应的十进制数,然后再把对应的十进制数与数码管的管脚对应起来,使其显示在数码管上。关键词:二进制转为十进制 数码管显示 共阳数码管1 引言

VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于

1982 年。1987 年底,VHDL被美国国防部和IEEE确认为标准硬件描述语言。

VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点:[1]

(1)VHDL 语言功能强大,设计方式多样

VHDL 语言具有强大的语言结构,只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。同时,它还具有多层次的电路设计描述功能。此外,VHDL 语言能够同时支持同步电路、异步电路和随机电路的设计实现,这是其他硬件描述语言所不能比拟的。VHDL 语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自底向上的设计方法; 既支持模块化设计方法,也支持层次化设计方法。

(2)VHDL 语言具有强大的硬件描述能力

VHDL 语言具有多层次的电路设计描述功能,既可描述系统级电路,也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。同时,VHDL 语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL 语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。

(3)VHDL 语言具有很强的移植能力

VHDL 语言很强的移植能力主要体现在: 对于同一个硬件电路的 VHDL 语言描述,它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。

(4)VHDL 语言的设计描述与器件无关

采用 VHDL 语言描述硬件电路时,设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化,而不需要考虑其他的问题。当硬件电路的设计描述完成以后,VHDL 语言允许采用多种不同的器件结构来实现。

(5)VHDL 语言程序易于共享和复用

VHDL 语言采用基于库的设计方法。在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。

本次我所要设计的基于VHDL语言的八位数码管显示将充分体现它的部分优点。总体设计方案

2.1 输入引脚数目的计算

因为题目要求数码管要能显示最大的八位十进制二进制数,所以对应的二进制表示的十进制数首先要大于99999999,即2的所有n次幂之和应该大于99999999,数码管才能显示出最大的八位十进制数,所以计算可得n的值最小为27,所以输入二进制数的引脚应该设为27个,其二进制数输入引脚图如图1所示

图1 二进制数输入引脚图

2.2 二进制转为十进制部分程序设计 二进制转为十进制的部分程序如下: architecture one of look is signal ai,bi,ci,ki,ei,fi,gi,hi:integer range 0 to 9;signal di:integer range 0 to 99999999;begin di<=conv_integer(d);2.3 数码管显示部分程序设计

2.3.1 程序中数码管的选择及显示的设置

在本设计中按照我的程序硬件所选用的应该为共阴极数码管,且当某一位数码管不需要显示数据时,统一设定其显示0,例如需要显示1时,八个数码管的显示为00000001。

2.3.2 数码管显示部分部分程序如下: …………

variable a,b,c,k,e,f,g,h:integer range 0 to 9;begin a:=di rem 10;7 b:=(di-a)rem 100;c:=(di-a-10*b)rem 1000;k:=(di-a-10*b-c*100)rem 10000;e:=(di-a-10*b-c*100)rem 100000;f:=(di-a-10*b-c*100-1000*e)rem 1000000;g:=(di-a-10*b-c*100-1000*e-10000*f)rem 10000000;h:=(di-a-10*b-c*100-1000*e-10000*f-100000*g)/10000000;ai<=a;bi<=b;ci<=c;ki<=k;ei<=e;fi<=f;gi<=g;hi<=h;end process;process(ai)begin case ai is

when 0=>led7s1(6 downto 0)<=“1000000”;

when 1=>led7s1(6 downto 0)<=“1111001”;

when 2=>led7s1(6 downto 0)<=“0100100”;

when 3=>led7s1(6 downto 0)<=“0110000”;

when 4=>led7s1(6 downto 0)<=“0011001”;8

when 5=>led7s1(6 downto 0)<=“0010010”;

when 6=>led7s1(6 downto 0)<=“0000010”;

when 7=>led7s1(6 downto 0)<=“1111000”;

when 8=>led7s1(6 downto 0)<=“0000000”;

when 9=>led7s1(6 downto 0)<=“0010000”;

when others=>led7s1(6 downto 0)<=“XXXXXXX”;end case;end process;…………

2.3.3 数码管显示部分引脚图

数码管显示部分部分引脚图如图2 所示

图 2 数码管显示部分部分引脚图

2.2.4 总体设计程序见附表1 3 仿真显示

3.1 显示“000000003”仿真图

显示数字“3”的仿真图如图3所示,因为根据程序所需数码管为共阳极数码管,所以数码管对应的“e”,“f”段应该为高电平,在本次设计中,即数码管的第5,6段为高电平,为了便于观察,仿真的各项周期均取10ns。

图3 显示“3”电路 3.2 显示“96”部分仿真图,如图4所示

图4 显示“96”仿真图 心得体会

通过这次的课程设计让我对VHDL语言以及电路设计的理论有了更加深入的了解,课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,这次课程设计虽然很累,但我学到了不少东西,对软件的设计过程和方法有了更深入的了解。在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,我们收获的是黎明。在本次实践中,给我印象最为深刻的是在文件删除程序的编译过程中,先有我的各个子程序都已经编辑成功,那么这最后的程序就将是我成功的关键。

这次课程设计顺利完成了,在设计中遇到了很多问题,最后都是经过查阅相关的资料和在同学的帮助下,终于游逆而解。同时,在我学得到很多实用的知识,同时,对给过我帮助的所有同学再次表示忠心的感谢!

参考文献

【1】黄继业.EDA技术使用教程[M].北京:科学出版社,2010 【2】王云亮.电力电子技术[M].北京:电子工业出版社,2009 【3】康光华.电子技术基础[M].北京:高等教育出版社,2006

附录1 library ieee;12 use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity look is port(d:in std_logic_vector(26 downto 0);clk3:in std_logic;led7s1,led7s2,led7s3,led7s4,led7s5,led7s6,led7s7,led7s8:out std_logic_vector(6 downto 0));end;architecture one of look is signal ai,bi,ci,ki,ei,fi,gi,hi:integer range 0 to 9;signal di:integer range 0 to 99999999;begin di<=conv_integer(d);

process(di)variable a,b,c,k,e,f,g,h:integer range 0 to 9;begin a:=di rem 10;b:=(di-a)rem 100;c:=(di-a-10*b)rem 1000;k:=(di-a-10*b-c*100)rem 10000;e:=(di-a-10*b-c*100-k*1000)rem 100000;f:=(di-a-10*b-c*100-k*1000-10000*e)rem 1000000;g:=(di-a-10*b-c*100-k*1000-10000*e-100000*f)rem 10000000;h:=(di-a-10*b-c*100-k*1000-10000*e-100000*f-1000000*g)/10000000;ai<=a;bi<=b;ci<=c;ki<=k;ei<=e;fi<=f;gi<=g;hi<=h;end process;process(ai)begin case ai is

when 0=>led7s1(6 downto 0)<=“1000000”;

when 1=>led7s1(6 downto 0)<=“1111001”;13

when 2=>led7s1(6 downto 0)<=“0100100”;

when 3=>led7s1(6 downto 0)<=“0110000”;

when 4=>led7s1(6 downto 0)<=“0011001”;

when 5=>led7s1(6 downto 0)<=“0010010”;

when 6=>led7s1(6 downto 0)<=“0000010”;

when 7=>led7s1(6 downto 0)<=“1111000”;

when 8=>led7s1(6 downto 0)<=“0000000”;

when 9=>led7s1(6 downto 0)<=“0010000”;

when others=>led7s1(6 downto 0)<=“XXXXXXX”;end case;end process;process(bi)begin case bi is

when 0=>led7s2(6 downto 0)<=“1000000”;

when 1=>led7s2(6 downto 0)<=“1111001”;

when 2=>led7s2(6 downto 0)<=“0100100”;

when 3=>led7s2(6 downto 0)<=“0110000”;

when 4=>led7s2(6 downto 0)<=“0011001”;

when 5=>led7s2(6 downto 0)<=“0010010”;

when 6=>led7s2(6 downto 0)<=“0000010”;

when 7=>led7s2(6 downto 0)<=“1111000”;

when 8=>led7s2(6 downto 0)<=“0000000”;

when 9=>led7s2(6 downto 0)<=“0010000”;

when others=>led7s2(6 downto 0)<=“XXXXXXX”;end case;end process;process(ci)begin case ci is

when 0=>led7s3(6 downto 0)<=“1000000”;

when 1=>led7s3(6 downto 0)<=“1111001”;

when 2=>led7s3(6 downto 0)<=“0100100”;

when 3=>led7s3(6 downto 0)<=“0110000”;

when 4=>led7s3(6 downto 0)<=“0011001”;

when 5=>led7s3(6 downto 0)<=“0010010”;

when 6=>led7s3(6 downto 0)<=“0000010”;14

when 7=>led7s3(6 downto 0)<=“1111000”;

when 8=>led7s3(6 downto 0)<=“0000000”;

when 9=>led7s3(6 downto 0)<=“0010000”;

when others=>led7s3(6 downto 0)<=“XXXXXXX”;end case;end process;process(ki)begin case ki is

when 0=>led7s4(6 downto 0)<=“1000000”;

when 1=>led7s4(6 downto 0)<=“1111001”;

when 2=>led7s4(6 downto 0)<=“0100100”;

when 3=>led7s4(6 downto 0)<=“0110000”;

when 4=>led7s4(6 downto 0)<=“0011001”;

when 5=>led7s4(6 downto 0)<=“0010010”;

when 6=>led7s4(6 downto 0)<=“0000010”;

when 7=>led7s4(6 downto 0)<=“1111000”;

when 8=>led7s4(6 downto 0)<=“0000000”;

when 9=>led7s4(6 downto 0)<=“0010000”;

when others=>led7s4(6 downto 0)<=“XXXXXXX”;end case;end process;process(ei)begin case ei is

when 0=>led7s5(6 downto 0)<=“1000000”;

when 1=>led7s5(6 downto 0)<=“1111001”;

when 2=>led7s5(6 downto 0)<=“0100100”;

when 3=>led7s5(6 downto 0)<=“0110000”;

when 4=>led7s5(6 downto 0)<=“0011001”;

when 5=>led7s5(6 downto 0)<=“0010010”;

when 6=>led7s5(6 downto 0)<=“0000010”;

when 7=>led7s5(6 downto 0)<=“1111000”;

when 8=>led7s5(6 downto 0)<=“0000000”;

when 9=>led7s5(6 downto 0)<=“0010000”;

when others=>led7s5(6 downto 0)<=“XXXXXXX”;end case;15 end process;process(fi)begin case fi is

when 0=>led7s6(6 downto 0)<=“1000000”;

when 1=>led7s6(6 downto 0)<=“1111001”;

when 2=>led7s6(6 downto 0)<=“0100100”;

when 3=>led7s6(6 downto 0)<=“0110000”;

when 4=>led7s6(6 downto 0)<=“0011001”;

when 5=>led7s6(6 downto 0)<=“0010010”;

when 6=>led7s6(6 downto 0)<=“0000010”;

when 7=>led7s6(6 downto 0)<=“1111000”;

when 8=>led7s6(6 downto 0)<=“0000000”;

when 9=>led7s6(6 downto 0)<=“0010000”;

when others=>led7s6(6 downto 0)<=“XXXXXXX”;end case;end process;process(gi)begin case gi is

when 0=>led7s7(6 downto 0)<=“1000000”;

when 1=>led7s7(6 downto 0)<=“1111001”;

when 2=>led7s7(6 downto 0)<=“0100100”;

when 3=>led7s7(6 downto 0)<=“0110000”;

when 4=>led7s7(6 downto 0)<=“0011001”;

when 5=>led7s7(6 downto 0)<=“0010010”;

when 6=>led7s7(6 downto 0)<=“0000010”;

when 7=>led7s7(6 downto 0)<=“1111000”;

when 8=>led7s7(6 downto 0)<=“0000000”;

when 9=>led7s7(6 downto 0)<=“0010000”;

when others=>led7s7(6 downto 0)<=“XXXXXXX”;end case;end process;process(hi)begin case hi is

when 0=>led7s8(6 downto 0)<=“1000000”;16

when 1=>led7s8(6 downto 0)<=“1111001”;

when 2=>led7s8(6 downto 0)<=“0100100”;

when 3=>led7s8(6 downto 0)<=“0110000”;

when 4=>led7s8(6 downto 0)<=“0011001”;

when 5=>led7s8(6 downto 0)<=“0010010”;

when 6=>led7s8(6 downto 0)<=“0000010”;

when 7=>led7s8(6 downto 0)<=“1111000”;

when 8=>led7s8(6 downto 0)<=“0000000”;

when 9=>led7s8(6 downto 0)<=“0010000”;

when others=>led7s8(6 downto 0)<=“XXXXXXX”;end case;end process;end;

第二篇:二进制转十进制(共)

二进制数转换成十进制数

二进制的1101转化成十进制

1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13 转化成十进制要从右到左用二进制的每个数去乘以2的相应次方 不过次方要从0开始

相反 用十进制的数除以2 每除一下将余数就记在旁边

最后按余数从下向上排列就可得到1101或者用下面这种方法:

13=8+4+0+1=8+4+1(算出等于13就行了)

由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为“按权相加”法。

本人有个更直接的方法,例如二进制数1000110转成十进制数可以看作这样:

数字中共有三个1 即第二位一个,第三位一个,第七位一个,然后十进制数即2的2-1次方+2的3-1次方+2的7-1次方即2+4+64=70 次方数即1的位数减一。如此计算只需要牢记2的前十次方即可在此本人为大家陈述一下:2的0次方是1

2的1次方是2

2的2次方是4

***222的的的的的的的的的的的的的的的的的的3次方是8 4次方是16 5次方是32 6次方是64 7次方是128 8次方是256 9次方是512 10次方是1024 11次方是2048 12次方是4096 ***81920次方是次方是次方是次方是次方是次方是次方是次方是8192 16384 32768 65536 131072 262144 524288 1048576

在这里仅为您提供前20次方,若需要更多请自己查询。编辑本段十进制数转换为二进制数

十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。1.十进制整数转换为二进制整数

十进制整数转换为二进制整数采用“除2取余,逆序排列”法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

十进制整数转二进制

如:255=(11111111)B

255/2=127=====余1

127/2=63======余1

63/2=31=======余1

31/2=15=======余1

15/2=7========余1

7/2=3=========余1 3/2=1=========余1 1/2=0=========余1 789=1100010101 789/2=394.5 =1 第10位 394/2=197 =0 第9位 197/2=98.5 =1 第8位 98/2=49 =0 第7位 49/2=24.5 =1 第6位 24/2=12 =0 第5位 12/2=6 =0 第4位 6/2=3 =0 第3位 3/2=1.5 =1 第2位 1/2=0.5 =1 第1位

2.十进制小数转换为二进制小数

十进制小数转换成二进制小数采用“乘2取整,顺序排列”法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。

然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

十进制小数转二进制

如:0.625=(0.101)B

0.625*2=1.25======取出整数部分1

0.25*2=0.5========取出整数部分0

0.5*2=1==========取出整数部分1

再如:0.7=(0.1 0110 0110...)B

0.7*2=1.4========取出整数部分1 0.4*2=0.8========取出整数部分0 0.8*2=1.6========取出整数部分1 0.6*2=1.2========取出整数部分1 0.2*2=0.4========取出整数部分0 0.4*2=0.8========取出整数部分0 0.8*2=1.6========取出整数部分1 0.6*2=1.2========取出整数部分1 0.2*2=0.4========取出整数部分0

1、二进制数、八进制数、十六进制数转十进制数

有一个公式:二进制数、八进制数、十六进制数的各位数字分别乖以各自的基数的(N-1)次方,其和相加之和便是相应的十进制数。个位,N=1;十位,N=2...举例:

110B=1*2的2次方+1*2的1次方+0*2的0次方=0+4+2+0=6D 110Q=1*8的2次方+1*8的1次方+0*8的0次方=64+8+0=72D

110H=1*16的2次方+1*16的1次方+0*16的0次方=256+16+0=272D

2、十进制数转二进制数、八进制数、十六进制数

方法是相同的,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数部分拼接成一个数作为转换的最后结果。

例:见四级指导16页。

3、二进制数转换成其它数据类型

3-1二进制转八进制:从小数点位置开始,整数部分向左,小数部分向右,每三位二进制为一组用一位八进制的数字来表示,不足三位的用0补足,就是一个相应八进制数的表示。

010110.001100B=26.14Q 八进制转二进制反之则可。

3-2二进制转十进制:见1

3-3二进制转十六进制:从小数点位置开始,整数部分向左,小数部分向右,每四位二进制为一组用一位十六进制的数字来表示,不足四位的用0补足,就是一个相应十六进制数的表示。

00100110.00010100B=26.14H 十进制转各进制

要将十进制转为各进制的方式,只需除以各进制的权值,取得其余数,第一次的余数当个位数,第二次余数当十位数,其余依此类推,直到被除数小于权值,最后的被除数当最高位数。

一、十进制转二进制

如:55转为二进制

2|55

27――1 个位

13――1 第二位

6――1 第三位

3――0 第四位

1――1 第五位

最后被除数1为第七位,即得110111 二、十进制转八进制

如:5621转为八进制

8|5621

702 ―― 5 第一位(个位)

―― 6 第二位―― 7 第三位―― 2 第四位

最后得八进制数:127658 三、十进制数十六进制

如:76521转为十六进制

16|76521

4726 ――5 第一位(个位)

295 ――6 第二位――6 第三位―― 2 第四位

最后得1276516

二进制与十六进制的关系

2进制 0000 0001 0010 0011 0100 0101 0110 0111 16进制 0 1 2 3 4 5 6 7

2进制 1000 1001 1010 1011 1100 1101 1110 1111 16进制 8 9 a(10)b(11)c(12)d(13)e(14)f(15)

可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为:

3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102 右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制的值即可。

二进制与八进制间的关系

二进制 000 001 010 011 100 101 110 111 八进制 0 1 2 3 4 5 6 7

二进制与八进制的关系类似于二进制与十六进制的关系,以八进制的各数为0到7,以三位二进制数来表示。如要将51028 转为二进制,5为101,1为001,0为000,2为010,将这些数的二进制合并后为1010010000102,即是二进制的值。

若要将二进制转为八进制,将二进制的位数由右向左每三位一个单位分隔,将事单位对照出八进制的值即可。

第三篇:数字电路课程设计——用VHDL语言设计交通灯

数字电路课程设计报告

院系: 电气信息工程学院 班级: 08测控2班 学号: 08314237 姓名: 董 亮 合作: 虞 波 指导教师: 翟 丽 芳

2010年12月10日

引言······················································2 一 设计任务和设计要求·········································2 二 电路工作原理及方案设计································3 三 软件设计与调试········································4 1.分频模块的设计及仿真图·································4 2.控制器设计及仿真图····································6 3.计数器的设计及仿真图···································7 4.分位模块的设计·······································9 5.数码管驱动设计·······································10 6. 顶层文件设置·········································14

四 硬件焊接与组装调试···································15 五 心得体会·············································16 六 参考文献·············································16

交通灯控制电路设计

引言:

随着社会的发展以及人类生活水平的提高,基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制用计算机等领域的重要性日益突出。

如今,交通的问题日益突出,单单依靠人力来指挥交通已经不可行了,所以,设计交通灯来完成这个需求就显的越加迫切了。为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。以下就是运用数字电子设计出的交通灯。

本程序设计的是交通灯的设计。采用EDA作为开发工具,VHDL语言为硬件描述语言,quartusII作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,实现设计目标。

一.设计任务与设计要求

1. 设计任务

设计一个基于FPGA的十字路口交通控制器,假设南北方向和东西方向,两个方向分别设置红灯、绿灯、黄灯三盏灯,设置一组倒计时显示器,用以指挥车辆和行人有序的通行。红灯亮表示直行车辆禁行;绿灯亮表示直行车辆可以通行;黄灯亮表示直行车辆即将禁行;倒计时显示器用来显示允许通行或禁止通行的时间。尽量采用层次化设计。2. 设计要求

在十字路口南北和东西两个方向各设一组红灯、黄灯、绿灯。设一组倒计时显示器。

自动控制:

设置一组数码管,以倒计时的方式显示允许通行或禁止通行的时间,南北方向为主干道,红灯、黄灯和绿灯显示时间分别是55、5s、50s。东西方向为次干道,红灯、黄灯绿灯显示时间分别为35s、5s、30s。

特殊功能:

(1)紧急状态时,手动拨动紧急开关,主干道以及次干道都显示红灯,禁止通行,并由蜂鸣其报警。

(2)黄灯显示信号为脉冲信号,使得黄灯为“一闪一闪”的显示状态。

二.电路工作原理及方案设计

图1总体设计框图

在VHDL设计描述中,采用自顶向下的设计思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:输入信号:外部时钟信号clk。LED在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。通过上面的分析,不难得知可以把交通灯控制系统划分为4个模块:时钟分频模块,计数模块,控制模块,分位译码模块。

分频电路:输入较高频率脉冲用分频电路的到较

(HOLD=‘1’)发生是,计数器暂停计数。

分位译码电路:因为控制器输出的倒计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数)。七段数码管的译码电路根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管,我们用的是共阴极数码管,因此译码电路输出逻辑数值‘1’点亮二极管,译码电路输出逻辑数值‘0’熄灭二极管。

三.软件设计与调试

图2模块化设计原理图

1.分频模块的设计及仿真图

分频器1实现的是将高频时钟信号转换成底频的时钟信号,用于触发控制器、计数器和扫描显示电路。该分频器实现的是1000分频,将50M赫兹的时钟信号分频成50000赫兹的时钟信号。LIBRARY IEEE;USE IEEE.Std_Logic_1164.ALL;ENTITY FreDevider IS PORT(Clkin:IN Std_Logic;Clkout:OUT Std_Logic);

END;ARCHITECTURE Devider OF FreDevider IS CONSTANT N:Integer:=499;Signal counter:Integer range 0 to N;signal Clk:Std_Logic;BEGIN PROCESS(Clkin)begin IF rising_edge(Clkin)THEN IF Counter=N then counter<=0;Clk<=not clk;else counter<=counter+1;end if;end if;end process;clkout<=clk;end;分频器2实现的是50000分频,将50000赫兹的时钟信号分频成1赫兹的时钟信号。

LIBRARY IEEE;USE IEEE.Std_Logic_1164.ALL;ENTITY FreDevider1 IS PORT(Clkin:IN Std_Logic;Clkout:OUT Std_Logic);END;ARCHITECTURE Devider1 OF FreDevider1 IS CONSTANT N:Integer:=24999;signal counter:Integer range 0 to N;signal Clk:Std_Logic;BEGIN PROCESS(Clkin)begin IF rising_edge(Clkin)THEN IF Counter=N then counter<=0;Clk<=not clk;else counter<=counter+1;end if;end if;end process;

clkout<=clk;end;

2.控制器设计及仿真图

控制器的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译管的分译码电路。此外,当检测到特殊情况(Hold=‘1’)发生时,无条件点亮红色的发光二极管。功能:控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY countroller IS PORT(Clock:IN STD_LOGIC;Hold:in std_logic;CountNum:in INTEGER RANGE 0 TO 89;NumA:out INTEGER RANGE 0 TO 90;RedA,GreenA,YellowA:out std_logic;RedB,GreenB,YellowB:out std_logic);END;ARCHITECTURE behavior OF Countroller IS BEGIN process(Clock)BEGIN IF falling_edge(Clock)THEN IF Hold='1' THEN RedA<='1';RedB<='1';GreenA<='0';GreenA<='0';YellowA<='0';YellowB<='0';

ELSIF CountNum<=54 THEN NumA<=55-CountNum;RedA<='0';GreenA<='1';YellowA<='0';ELSIF CountNum<=59 THEN NumA<=60;RedA<='0';GreenA<='0';YellowA<='1';ELSE NumA<=90-CountNum;RedA<='1';GreenA<='0';YellowA<='0';END IF;IF CountNum<=54 THEN RedB<='1';GreenB<='0';YellowB<='0';ELSIF CountNum<=84 THEN RedB<='0';GreenB<='1';YellowB<='0';ELSe RedB<='0';GreenB<='0';YellowB<='1';END IF;end if;END PROCESS;END;3.计数器的设计及仿真图

这里计数器的计数范围为0—90S,下一个时钟沿回复到0,开始下一轮计数.此外,当检测到特殊情况(Hold=‘1‘)发生时,计数器暂停计数。

程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY counter IS PORT(clock:IN STD_LOGIC;Hold:in std_logic;countNum:BuFFeR INTEGER RANGE 0 TO 90);

END;ARCHITECTURE behavior OF counter IS BEGIN Process(Clock)BEGIN IF rising_edge(Clock)THEN IF Hold='1' then countNum<=countNum;ELSE IF countNum=90 THEN countNum<=0;ELSE countNum<=countNum+1;END IF;END IF;END PROCESS;END;

4.分位模块的设计

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Fenwei IS PORT(Numin:IN integer RANGE 0 TO 90;NumA,NumB:OUT Integer RANGE 0 to 9);END;ARCHITECTURE behavior OF Fenwei IS BEGIN process(Numin)BEGIN IF Numin>=60 THEN NumA<=10;NumB<=10;elsIF Numin>=50 THEN NumA<=5;NumB<=Numin-50;elsIF Numin>=40 THEN NumA<=4;NumB<=Numin-40;ELSIF Numin>=30 THEN NumA<=3;NumB<=Numin-30;ELSIF Numin>=20 THEN NumA<=2;NumB<=Numin-20;ELSIF Numin>=10 THEN

NumA<=1;NumB<=Numin-10;ELSE NumA<=0;NumB<=Numin;END IF;END PROCESS;END;

5.数码管驱动设计 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY bcd_data IS PORT(bcd_data:in STD_LOGIC_VECTOR(3 downto 0);segout: out STD_LOGIC_VECTOR(6 downto 0));END;ARCHITECTURE behavior OF bcd_data IS BEGIN process(bcd_data)BEGIN case bcd_data is when “0000”=>segout<=“1111110”;when “0001”=>segout<=“0110000”;when “0010”=>segout<=“1101101”;when “0011” =>segout<=“1111001”;when “0100” =>segout<=“0110011”;when “0101”=>segout<=“1011011”;when “0110”=>segout<=“0011111”;when “0111”=>segout<=“1110000”;when “1000” =>segout<=“1111111”;when “1001” =>segout<=“1110011”;when “1010”=>segout<=“0000000”;when others =>null;END CASE;END PROCESS;END;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_unsigned.ALL;

ENTITY dtsm IS PORT(clk:in STD_LOGIC;NumA,NumB,NumC,NumD: in STD_LOGIC_VECTOR(3 downto 0);segout1:out STD_LOGIC_VECTOR(6 downto 0);led_sel: out STD_LOGIC_VECTOR(3 downto 0));END dtsm;architecture bhv of dtsm is component bcd_data is port(bcd_data:in STD_LOGIC_VECTOR(3 downto 0);segout:out STD_LOGIC_VECTOR(6 downto 0));end component;signal x:STD_LOGIC_VECTOR(3 downto 0);signal q:STD_LOGIC_VECTOR(1 downto 0);begin p1:process(clk)begin if clk'event and clk ='1' then Q<= Q + '1';end if;end process;

p2:process(Q)begin case Q is when“00”=>led_sel<=“1110”;x<=NumD;when“01”=>led_sel<=“1101”;x<=NumC;when“10”=>led_sel<=“1011”;x<=NumB;when“11”=>led_sel<=“0111”;x<=NumA;when others=>null;end case;end process;u1:bcd_data PORT map(bcd_data=>x,segout=>segout1);end;

6.顶层文件设置

library ieee;use ieee.std_logic_1164.all;entity jiaotongdeng is port(clk1:in std_logic;reset1:in std_logic;

hold1:in std_logic;segout2:out std_logic_vector(6 downto 0);led_sel1:out std_logic_vector(3 downto 0);reda1,yellowa1,greena1:out std_logic;redb1,yellowb1,greenb1:out std_logic);end jiaotongdeng;

architecture aa11 of jiaotongdeng is component FreDevider PORT(Clkin:IN Std_Logic;Clkout:OUT Std_Logic);END component;

component FreDevider1 PORT(Clkin:IN Std_Logic;Clkout:OUT Std_Logic);END component;component countroller PORT(Clock:IN STD_LOGIC;Hold:in std_logic;CountNum:in INTEGER RANGE 0 TO 89;NumA:out INTEGER RANGE 0 TO 90;RedA,GreenA,YellowA:out std_logic;RedB,GreenB,YellowB:out std_logic);END component;component counter PORT(clock:IN STD_LOGIC;reset:in std_logic;Hold:in std_logic;countNum:BuFFeR INTEGER RANGE 0 TO 90);END component;component Fenwei PORT(Numin:IN integer RANGE 0 TO 90;NumA,NumB:OUT Integer RANGE 0 to 9);END component;component dtsm PORT(clk:in STD_LOGIC;NumA,NumB: in Integer RANGE 0 to 9;segout1:out STD_LOGIC_VECTOR(6 downto 0);led_sel: out STD_LOGIC_VECTOR(3 downto 0));

END component;signal a,b:std_logic;signal c:INTEGER RANGE 0 TO 89;signal d:INTEGER RANGE 0 TO 90;signal e,f:Integer RANGE 0 to 9;begin u1: FreDevider port map(clkin=>clk1,clkout=>a);u2: FreDevider1 port map(clkin=>a,clkout=>b);u3:counter

port map(clock=>b,reset=>reset1,hold=>hold1,countnum=>c);u4:countroller port map(clock=>b,hold=>hold1,countnum=>c,numa=>d,reda=>reda1,greena=>greena1,yellowa=>yellowa1,redb=>redb1,greenb=>greenb1,yellowb=>yellowb1);u5:fenwei port map(numin=>d,numa=>e,numb=>f);u6:dtsm

port map(clk=>clk1,numa=>e,numb=>f,segout1=>segout2,led_sel=>led_sel1);end aa11;

四.硬件焊接与组装调试

按照如下图所示的电路图,在通用电路焊接板上合理布置各个元器件,进行焊接布线。

图3硬件焊接电路图

安装焊接完成后,仔细检查电路,是否有误。若与电路图不符,应及时排除错误。一切就绪后,将与FPGA对应的引脚使用杜邦线连接,连接完毕后,检查电源极性,避免反接。确认无误后,接通电源,观察实验结果。

首先我们完成的基本的功能,只是简单的倒计时显示,然后我们可以进一步修改我们的VHDL语言程序,重新烧入FPGA,以完善我们的设计。

五.心得体会

通过几天的课程设计,我对EDA技术、VHDL等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高。

EDA设计我们感觉程序调试最重要,试验软件、硬件熟悉其次。直到没有错误。若与理想的不同,再查看程序,有无原理上的编辑错误或没有查出的输入错误。都通过可以进行管脚配对,把程序烧入芯片,在实物上看结果,从显示中得出还需改正的地方,再去改程序。必须注意每改一次都要编译,重新烧入。我们采用模块化编程,模块化接线,再编译总原理图,思路比较清楚。有的模块可以供其它任务通用。

课程设计对学生而言是其对所学课程内容掌握情况的一次自我验证,从而有着极其重要的意义。通过课程设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学内容,在这学期的课程设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

另外,我还学到了一个人的力量毕竟有限,但是团队的力量势不可挡,我们不能局限,要学会合作。这次课程设计虽然结束了,相信以后我们会以更加积极的态度对待我们的学习、对待我们的生活。我们的激情永远不会结束,相反,我们会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,我们会更加珍惜拥有的,更加努力的去完善它。

六.参考文献

(1)潘松,黄继业.《EDA

技术使用教程》.科学出版社.2006.(2)潘松,黄继业.《EDA技术与VHDL(

下载基于vhdl语言的二进制转十进制并用数码管显示的设计(最终定稿)word格式文档
下载基于vhdl语言的二进制转十进制并用数码管显示的设计(最终定稿).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐