EDA常用电路设计程序.docx

上传人:b****6 文档编号:8496350 上传时间:2023-01-31 格式:DOCX 页数:21 大小:30.24KB
下载 相关 举报
EDA常用电路设计程序.docx_第1页
第1页 / 共21页
EDA常用电路设计程序.docx_第2页
第2页 / 共21页
EDA常用电路设计程序.docx_第3页
第3页 / 共21页
EDA常用电路设计程序.docx_第4页
第4页 / 共21页
EDA常用电路设计程序.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

EDA常用电路设计程序.docx

《EDA常用电路设计程序.docx》由会员分享,可在线阅读,更多相关《EDA常用电路设计程序.docx(21页珍藏版)》请在冰豆网上搜索。

EDA常用电路设计程序.docx

EDA常用电路设计程序

用VHDL进行基本逻辑电路设计总结

组合逻辑电路设计、时序逻辑电路设计、状态机设计、存储器设计(调用宏功能模块进行设计)

1组合逻辑电路设计

常见组合逻辑电路设计主要有:

基本门电路、3-8译码器、8-3线优先编码器、比较器、多路选择器、三态门电路、单向总线驱动器、双向总线缓冲器等。

1.1基本门电路

基本门电路用VHDL语言来描述十分方便。

为方便起见,在下面的两输入模块中,使用VHDL中定义的逻辑运算符,同时实现一个与门、或门、与非门、或非门、异或门及反相器的逻辑。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYGATEIS

PORT(A,B:

INSTD_LOGIC;

YAND,YOR,YNAND,YNOR,YNOT,YXOR:

OUTSTD_LOGIC);

ENDGATE;

ARCHITECTUREARTOFGATEIS

BEGIN

YAND<=AANDB;--与门输出

YOR<=AORB;--或门输出

YNAND<=ANANDB;--与非门输出

YNOR<=ANORB;--或非门输出

YNOT<=ANOTB;--反相器输出

YXOR<=AXORB;--异或门输出

ENDART;

1.23-8译码器

下面我们分别以2种方法描述一个3-8译码器。

方法1:

使用CASE_WHEN语句

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYDECODERIS

PORT(SEL:

INSTD_LOGIC_VECTOR(2DOWNTO0);

EN:

INSTD_LOGIC;---加使能控制端

Y:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

END;

ARCHITECTUREART1OFDECODERIS

BEGIN

PROCESS(SEL,EN)

BEGIN

Y<=”11111111”;

IF(EN=’1’)THEN

CASESELIS

WHEN"000"=>Y(0)<=‘0’;--输出低有效

WHEN"001"=>Y

(1)<=‘0’;

WHEN"010"=>Y

(2)<=‘0’;

WHEN"011"=>Y(3)<=‘0’;

WHEN"100"=>Y(4)<=‘0’;

WHEN"101"=>Y(5)<=‘0’;

WHEN"110"=>Y(6)<=‘0’;

WHEN"111"=>Y(7)<=‘0’;

WHENOTHERS=>NULL;

ENDCASE;

ELSEY<=”11111111”;

ENDIF;

ENDPROCESS;

ENDART1;

方法2:

使用条件选择WHENELSE语句

ARCHITECTUREART2OFDECODERIS

BEGIN

Y(0)<=‘0’WHEN(EN=’1’ANDSEL="000")ELSE’1’;

Y

(1)<=‘0’WHEN(EN=’1’ANDSEL="001")ELSE’1’;

Y

(2)<=‘0’WHEN(EN=’1’ANDSEL="010")ELSE’1’;

Y(3)<=‘0’WHEN(EN=’1’ANDSEL="011")ELSE’1’;

Y(4)<=‘0’WHEN(EN=’1’ANDSEL="100")ELSE’1’;

Y(5)<=‘0’WHEN(EN=’1’ANDSEL="101")ELSE’1’;

Y(6)<=‘0’WHEN(EN=’1’ANDSEL="110")ELSE’1’;

Y(7)<=’0’WHEN(EN=’1’ANDSEL="111")ELSE’1’;

ENDART2;

注意:

使用了8条WHENELSE语句

1.38-3线优先编码器

8-3线优先编码器

输入信号为y0、y1、y2、y3、y4、y5、y6和y7,

输出信号为OUT0、OUT1和OUT2。

输入信号中y0的优先级别最低,依次类推,y7的优先级别最高。

下面我们用两种方法设计8-3线优先编码器。

方法1:

使用条件赋值语句

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYENCODERIS

PORT(y0,y1,y2,y3,y4,y5,y6,y7:

INSTD_LOGIC;

OUT0,OUT1,OUT2:

OUTSTD_LOGIC);

ENDENCODER;

ARCHITECTUREART1OFENCODERIS

SIGNALOUTS:

STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

OUTS(2DOWNTO0)<="111”WHENy7=‘1’ELSE

"110"WHENy6=‘1’ELSE

"101"WHENy5=‘1’ELSE

"100"WHENy4=‘1’ELSE

"011"WHENy3=‘1’ELSE

"010"WHENy2=‘1’ELSE

"001"WHENy1=‘1’ELSE

"000"WHENy0=‘1’ELSE

"XXX";

OUT0<=OUTS(0);

OUT1<=OUTS

(1);

OUT2<=OUTS

(2);

ENDART1;

方法2:

使用IF语句

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYENCODERIS

PORT(IN1:

INSTD_LOGIC_VECTOR(7DOWNTO0);

OUT1:

OUTSTD_LOGIC_VECTOR(2DOWNTO0));

ENDENCODER;

ARCHITECTUREART2OFENCODERIS

BEGIN

PROCESS(IN1)

BEGIN

IFIN1(7)=‘1’THENOUT1<="111";

ELSIFIN1(6)=‘1’THENOUT1<="110";

ELSIFIN1(5)=‘1’THENOUT1<="101";

ELSIFIN1(4)=‘1’THENOUT1<="100";

ELSIFIN1(3)=‘1’THENOUT1<="011";

ELSIFIN1

(2)=‘1’THENOUT1<="010";

ELSIFIN1

(1)=‘1’THENOUT1<="001";

ELSIFIN1(0)=‘1’THENOUT1<="000";

ELSEOUT1<="XXX";

ENDIF;

ENDPROCESS;

ENDART2;

1.4加法器—带进位的4位加法器

方法1:

用FOR-LOOP语句实现

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYADDER4IS

PORT(A,B:

INSTD_LOGIC_VECTOR(3DOWNTO0);

CIN:

INSTD_LOGIC;

SUM:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT:

OUTSTD_LOGIC);

ENDADDER4;

ARCHITECTUREARTOFADDER4IS

SIGNALC:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

PROCESS(A,B,CIN,C)

BEGIN

C(0)<=CIN;

FORIIN0TO3LOOP---用FOR循环语句实现多位相加

SUM(I)<=A(I)XORB(I)XORC(I);

C(I+1)<=(A(I)ANDB(I))OR(C(I)AND(A(I))OR(C(I)ANDB(I));

ENDLOOP;

COUT<=C(4);---总的进位输出

ENDPROCESS;

ENDART;

方法2:

直接使用加法“+”函数

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;----运算符重载

ENTITYADDER4_OPIS

PORT(A,B:

INSTD_LOGIC_VECTOR(3DOWNTO0);

CIN:

INSTD_LOGIC;

SUM:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT:

OUTSTD_LOGIC);

ENDADDER4_OP;

ARCHITECTUREARTOFADDER4_OPIS

SIGNALC:

STD_LOGIC_VECTOR(4DOWNTO0);

SIGNALAA,BB:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

AA<=‘0’&A;--4位扩展成5位,提供进位空间

BB<='0'&B;

C<=AA+BB+CIN;

SUM<=C(3DOWNTO0);

COUNT<=C(4);

ENDART;

1.58位比较器设计

比较器可以比较两个二进制的大小,下面是一个8位比较器的VHDL描述。

有两个8位二进制数,分别是A和B,输出为YA,YB,YC,当A>B时,YA=1;当A

LIBRARYIEEE;

USEIEEE.STD_LOGIC_VECTOR(7DOWNTO0);

ENTITYCOMPAREIS

PORT(A,B:

INSTD_LOGIC_VECTOR(7DOWNTO0);

YA,YB,YC:

OUTSTD_LOGIC);

ENDCOMPARE;

ARCHITECTUREARTOFCOMPAREIS

BEGIN

PROCESS(A,B)

BEGIN

IF(A>B)THENYA<='1';YB<='0';YC<='0';

ELSIF(A

ELSEYA<='0';YB<='0';YC<='1';

ENDIF;

ENDPROCESS;

ENDART;

1.6多路选择器

选择器常用于信号的切换,用IF语句、CASE语句、条件赋值语句、选择赋值语句都可以描述多路选择器。

例用CASE语句进行描述

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYMUX4TO1IS

PORT(A,B,C,D:

INSTD_LOGIC;

SEL:

INSTD_LOGIC_VECTOR(1DOWNTO0);

Q:

OUTSTD_LOGIC);

ENDMUX4TO1;

ARCHITECTURERTLOFMUX4TO1IS

BEGIN

PROCESS(SEL,A,B,C,D)

BEGIN

CASESELIS

WHEN"00"=>Q<=A;

WHEN"01"=>Q<=B;

WHEN"10"=>Q<=C;

WHENOTHERS=>Q<=D;

ENDCASE;

ENDPROCESS;

ENDRTL;

1.6多路选择器

选择器常用于信号的切换,用IF语句、CASE语句、条件赋值语句、选择信号赋值语句都可以描述多路选择器。

思考:

用选择信号赋值语句如何进行描述?

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYMUX4TO1IS

PORT(A,B,C,D:

INSTD_LOGIC;

SEL:

INSTD_LOGIC_VECTOR(1DOWNTO0);

Q:

OUTSTD_LOGIC);

ENDMUX4TO1;

ARCHITECTURERTLOFMUX4TO1IS

BEGIN

WITHSELSELECT

Q<=AWHEN"00“,

BWHEN"01",

CWHEN"10",

DWHENOTHERS;

ENDRTL;

1.7总线驱动器设计

Ⅰ:

单向总线驱动器设计

在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。

一个8位的单向总线缓冲器如图所示。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYTR1_BUF8IS

PORT(DIN:

INSTD_LOGIC_VECTOR(7DOWNTO0);

EN:

INSTD_LOGIC;

DOUNT:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ARCHITECTUREARTOFTR1_BUF8IS

BEGIN

PROCESS(EN,DIN)

IF(EN=‘1’)THEN

DOUT<=DIN;

ELSE

DOUT<="ZZZZZZZZ";

ENDIF;

ENDPROCESS;

ENDART;

Ⅱ:

双向总线缓冲器设计

双向总线缓冲器用于数据总线的驱动和缓冲,典型的双向总线缓冲器如图所示。

图中的双向总线缓冲器有两个数据输入输出端A和B,一个方向控制端DIR和一个选通端EN。

EN=0时双向缓冲器选通

DIR=0,则A=B(B送A)

DIR=1,则B=A(A送B)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYBIDIRIS

PORT(A,B:

INOUTSTD_LOGIC_VECTOR(7DOWNTO0);

EN,DIR:

INSTD_STD_LOGIC);

ENDBIDIR;

ARCHITECTUREARTOFBIDIRIS

SIGNALAOUT,BOUT:

STD_LOGIC_VECTOR(7DOWNTO0);

BEGIN

PROCESS(A,EN,DIR)

BEGIN

IFEN=‘0’ANDDIR=‘1’THENBOUT<=A;

ELSEBOUT<"ZZZZZZZZ";

ENDIF;

B<=BOUT;

ENDPROCESS;

PROCESS(B,EN,DIR)

BEGIN

IFEN=‘0’ANDDIR=‘1’THENAOUT<=B;

ELSEAOUT<"ZZZZZZZZ";

ENDIF;

A<=AOUT;

ENDPROCESS;

ENDART;

2时序逻辑电路设计

时序电路设计主要有:

触发器、寄存器、计数器、分频器、序列信号发生器、序列信号检测器

2.1D触发器的设计

设计如图所示的D触发器

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYDFF2IS

PORT(CLK,CD,SD,D:

INSTD_LOGIC;

Q,NOTQ:

OUTSTD_LOGIC);

ENDDFF2;

ARCHITECTURERTLOFDFF2IS

BEGIN

PROCESS(CLK,SD,CD)

BEGIN

IFCD='0'THENQ<='0';NOTQ<='1';

ELSIFSD='0'THENQ<='1';NOTQ<='0';

ELSIFCLK'EVENTANDCLK='1‘THENQ<=D;

ENDIF;

ENDPROCESS;

ENDRTL;

2.2移位寄存器的设计

下面给出一个8位的移位寄存器,其具有左移一位或右移一位、并行输入和同步复位的功能。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYSHIFTERIS

PORT(DATA:

INSTD_LOGIC_VECTOR(7DOWNTO0);

SHIFT_LEFT:

INSTD_LOGIC;

SHIFT_RIGHT:

INSTD_LOGIC;

RESET:

INSTD_LOGIC;

MODE:

INSTD_LOGIC_VECTOR(1DOWNTO0);

QOUT:

BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));

ENDSHIFTER;

ARCHITECTUREARTOFSHIFTERIS

BEGIN

PROCESS

BEGIN

WAITUNTILRISING_EDGE(CLK);

IFRESET=‘1’THENQOUT<="00000000";

ELSE--同步复位功能的实现

CASEMODEIS

WHEN"01"=>QOUT<=SHIFT_RIGHT&QOUT(7DOWNTO1);--右移一位

WHEN"10"=>QOUT<=QOUT(6DOWNTO0)&SHIFT_LEFT;--左移一位

WHEN“11”=>QOUT<=DATA;--并行加载

WHENOTHERS=>NULL;

ENDCASE;

ENDIF;

ENDPROCESS;

ENDART;

2.3计数器

例:

模为60具有异步复位、同步置数功能的8421BCD码计数器

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYClock60IS

PORT(CI,RESET,LOAD,CLK:

INSTD_LOGIC;

D:

INSTD_LOGIC_VECTOR(7DOWNTO0);

CO:

OUTSTD_LOGIC;

Q10,Q1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

ENDCNTM60;

ARCHITECTUREARTOFCNTM60IS

SIGNALQH,QL:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

CO<=‘1’WHEN(QH="0101“ANDQL="1001“ANDCI=‘1’)ELSE

'0';--进位输出的产生

PROCESS(CLK,RESET)

BEGIN

IFRESET=‘0’THENQH<="0000";QL<="0000";--异步复位

ELSIFCLK'EVENTANDCLK=‘1’THEN--同步置数

IFLOAD=‘1’THENQH<=D(7DOWNTO4);QL<=D(3DOWNTO0);

ELSIFCI=‘1’THEN--模60的实现

IFQL=9THENQL<="0000";

IFQH=5THENQH<="0000";

ELSEQH<=QH+1;--计数功能的实现

ENDIF

ELSE

QL<=QL+1;

ENDIF;

ENDIF;--ENDIFLOAD

ENDIF;

ENDPROCESS;

Q10<=QH;

Q1<=QL;

ENDART;

2.4N分频器的设计

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYFREDIVNIS

PORT(CLK:

INSTD_LOGIC;

OUTCLK:

OUTSTD_LOGIC);

ENDFREDIVN;

ARCHITECTURERTLOFFREDIVNIS

CONSTANTN:

INTEGER:

=9;

SIGNALCOUNT:

INTEGERRANGENDOWNTO0;

BEGIN

PROCESS(CLK)

BEGIN

IF(CLK'EVENTANDCLK='1')THEN

IF(COUNT=N-1)THENCOUNT<=0;

ELSECOUNT<=COUNT+1;

IFCOUNT<(INTEGER(N/2))THENOUTCLK<='0';

ELSEOUTCLK<='1';

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

ENDRTL;

2.5序列信号发生器

在数字信号的传输和数字系统的测试中,有时需要用到一组特定的串行数字信号,产生序列信号的电路称为序列信号发生器。

如产生“01111110”序列的序列信号发生器(序列可任意)

该电路可由计数器与数据选择器构成,其VHDL描述如下:

LIBRARYIEEE;--“01111110”序列信号发生器

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSENQGENIS

PORT(CLK,CLR,CLK1:

INSTD_LOGIC;--两个时钟信号

ZO:

OUTSTD_LOGIC);

ENDSENQGEN;

ARCHITECTUREARTOFSENQGENIS

SIGNALCOUNT:

STD_LOGIC_VECTOR(2DOWNTO0);

--序列发生器的关键是计数器,COUNT的宽度决定序列的长度,此为8位

SIGNALZ:

STD_LOGIC:

=‘0’;--赋初值仅对仿真有用

BEGIN

PROCESS(CLK,CLR)--8进制计数器进程

BEGIN

IFCLR=‘1’THENCOUNT<="000";

ELSIFCLK=‘1’ANDCLK'EVENTTHEN

IFCOUNT="111“THENCOUNT<="000";--此处可不要

ELSECOUNT<=COUNT+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(COUNT)--数据选择器进程,计数器计数时输出01111110序列BEGIN

CASECOUNTIS

WHEN"000"=>Z<=‘0’;

WHEN"001"=>Z<=‘1’;

WHEN"010"=>Z<=‘1’;

WHEN"011"=>Z<=‘1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1