西电EDA满分大作业Word格式文档下载.docx
《西电EDA满分大作业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西电EDA满分大作业Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
clk:
instd_logic;
clk_out:
outstd_logic
);
enddevide;
我们可以从程序中看到,输入时clk(外部主频时钟),输出是clk_out(分频后的时钟)。
(这是实体的器件图)
分频器的结构体:
process;
用进程语言描述
begin
waituntilclk'
eventandclk='
1'
if(count<
3999999)then
count<
=count+1;
clk_out<
='
0'
;
else
=(others=>
'
);
我们可以从程序中看到waituntilclk'
这句是时钟来到意思,当count计数小于3999999时,count自加1,且输出为零,只有当大于3999999时,产生一个高电平脉冲。
接下来是对分频器的波形仿真:
从波形中我们可以看到分频器的工作.
第二部分:
模8计数器
我们需要一个计数器来输出计数电频,作为下一步38译码器的输入信号,首先我们来看这个器件的实体:
port(clk:
dout:
outstd_logic_vector(2downto0)
(这是器件的实体图)
输入端口是clk,是接入分频器的时钟信号,输出就是计数电平了。
计数器的结构体:
architecturearc_mofmis
signalcount:
std_logic_vector(2downto0);
begin
process(clk)
ifrising_edge(clk)then
ifcount<
7then
elsifcount=7then
="
000"
endif;
a<
=count(0);
b<
=count
(1);
c<
=count
(2);
endprocess;
以上是模8计数器的结构体,我们可以看到,但时钟来到时,在count小于7时count加一,当count=7时,count清零。
接下来是对计数器波形的仿真:
dout输出000,001,010,011,100,101,110,111,000,001…这符合我们的要求。
第三部分:
38译码器
因为我们使用是共阴极二极管,38译码器每接受一个来自计数器的点平时,对应的Yn就输出低电平,点亮此二极管。
我们就可以看到二极管依次点亮好似流水一般。
译码器的实体:
port(a,b,c:
y:
outstd_logic_vector(7downto0));
输入是a,b,c从低到高的三个,输出是y对应的译码电平。
(这是译码器的原件图)
译码器的结构体:
architecturearc_yima38ofyima38is
signalcomb:
comb<
=x;
process(comb)
casecombis
when"
=>
y<
="
11111110"
001"
11111101"
010"
11111011"
011"
11110111"
100"
11101111"
101"
11011111"
110"
10111111"
111"
01111111"
whenothers=>
=null;
endcase;
endprocess;
我们可以看到如下的波形:
在y的输出波形中,“0”循环右移,这是我们想要的结果。
第四部分:
总体效果
3、遇到的问题和解决方法
我使用的是原理图连接,在下到片子后我编译失败,经过同学和我的检查,终于发现我的原理图连接有问题,如上图所示,我将y[2..0]连接到译码器的输入端(a,b,c),这是不正确的,因为y[2..0]是(vector)矢量,而(a,b,c)是位,我错误的以为用线连起来就可以使用,但事实是矢量必须配对矢量,位配对位。
第二章习题部分
(Ex-1)画出下例实体描述对应的原理图符号元件:
ENTITYbuf3sIS--实体1:
三态缓冲器
PORT(input:
INSTD_LOGIC;
--输入端
enable:
--使能端
output:
OUTSTD_LOGIC);
--输出端
ENDbuf3x;
答:
ENTITYmux21IS--实体2:
2选1多路选择器
PORT(in0,in1,sel:
INSTD_LOGIC;
OUTSTD_LOGIC);
ENDENTITYmux21;
(Ex-2)图中所示的是4选1多路选择器,试分别用IF_THEN语句和CASE语句的表达方式写出此电路的VHDL程序。
(选择控制的信号s1和s0为STD_LOGIC_VECTOR类型;
当s1='
,s0='
;
s1='
和s1='
分别执行y<
=a、y<
=b、y<
=c、y<
=d。
)
首先为用IFTHEN语句实现
程序如下:
libraryIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entitymux41is
port(a,b,c,d:
s1,s0:
instd_logic_vector(1downto0);
y:
outstd_logic);
endentitymux41;
architectureoneofmux41is
begin
process(a,b,c,d,s1,s0)
ifs1='
ands0='
then
y<
=a;
elseifs1='
=b;
=c;
=d;
endarchitectureone;
用case语句
程序如下:
--这里s1s0没有定义成2位矢量
signall1:
std_logic_vector(1downto0);
--中间信号为两位矢量,为了使用&
l1<
=s1&
s0;
casel1is
00"
=>
01"
10"
11"
(Ex-3)图中所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s='
和'
时,分别有y<
a'
和y<
b'
。
试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个2选1多路选择器MUX21A。
libraryieee;
useieee.std_logic_1164.all;
entitymuxkis
port(a1,a2,a3:
--待选择变量
temp:
bufferstd_logic;
--中间信号
--控制端
output:
outstd_logic);
--输出结果
endmuxk;
architecturepr1ofmuxkis
process(a2,a3,s0)--process1
cases0is--使用case语句
when'
temp<
=a2;
=a3;
endcase;
process(a1,temp,s1)--process2
cases1is
output<
=a1;
=temp;
endpr1;
(Ex-4)图中是一个含有上升沿触发的D触发器的时序电路,试写出此电路的VHDL设计文件。
entitydffis
port(cl,clk0:
out1:
endentitydff;
architectureoneofdffis
signalq1,q2:
std_logic
process(clk)
ifrisingedge(clk)then
q2=notq1;
q1=not(clandq2);
out<
=q2;
endone;
(Ex-5)给出1位全减器的VHDL描述。
要求:
(1)首先设计1