西电EDA满分大作业.docx
《西电EDA满分大作业.docx》由会员分享,可在线阅读,更多相关《西电EDA满分大作业.docx(18页珍藏版)》请在冰豆网上搜索。
西电EDA满分大作业
EDA报告
题目VHDL设计初步
学院电子工程学院
专业
学号
导师姓名朱燕
引言
随着大规模集成电路技术和计算机技术的不断发展,在涉及通信、国防、航天、医学、工业自动化、计算机应用、仪器仪表等领域的电子系统设计工作中,EDA技术的含量正以惊人的速度上升;电子类的高新技术项目的开发也逾益依赖于EDA技术的应用。
即使是普通的电子产品的开发,EDA技术常常使一些原来的技术瓶颈得以轻松突破,从而使产品的开发周期大为缩短、性能价格比大幅提高。
不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。
第一章实验部分(流水灯)
1、程序设计流程图:
2、模块说明
第一部分:
分频器
因为主板是cyclong-EP16C6Q240C8的主频是4M赫兹,如果直接当做CLK信号,根本无法看清流水灯的变化,所以需要做分频操作。
仿照数电课本的例题中的分频器。
分频器的实体:
entitydevideis
port(
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
count<=(others=>'0');
clk_out<='1';
我们可以从程序中看到waituntilclk'eventandclk='1'这句是时钟来到意思,当count计数小于3999999时,count自加1,且输出为零,只有当大于3999999时,产生一个高电平脉冲。
接下来是对分频器的波形仿真:
从波形中我们可以看到分频器的工作.
第二部分:
模8计数器
我们需要一个计数器来输出计数电频,作为下一步38译码器的输入信号,首先我们来看这个器件的实体:
port(clk:
instd_logic;
dout:
outstd_logic_vector(2downto0)
);
(这是器件的实体图)
输入端口是clk,是接入分频器的时钟信号,输出就是计数电平了。
计数器的结构体:
architecturearc_mofmis
signalcount:
std_logic_vector(2downto0);
begin
process(clk)
begin
ifrising_edge(clk)then
ifcount<7then
count<=count+1;
elsifcount=7then
count<="000";
endif;
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:
instd_logic;
y:
outstd_logic_vector(7downto0));
输入是a,b,c从低到高的三个,输出是y对应的译码电平。
(这是译码器的原件图)
译码器的结构体:
architecturearc_yima38ofyima38is
signalcomb:
std_logic_vector(2downto0);
begin
comb<=x;
process(comb)
begin
casecombis
when"000"=>y<="11111110";
when"001"=>y<="11111101";
when"010"=>y<="11111011";
when"011"=>y<="11110111";
when"100"=>y<="11101111";
when"101"=>y<="11011111";
when"110"=>y<="10111111";
when"111"=>y<="01111111";
whenothers=>y<=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:
INSTD_LOGIC;--使能端
output:
OUTSTD_LOGIC);--输出端
ENDbuf3x;
答:
ENTITYmux21IS--实体2:
2选1多路选择器
PORT(in0,in1,sel:
INSTD_LOGIC;
output:
OUTSTD_LOGIC);
ENDENTITYmux21;
(Ex-2)图中所示的是4选1多路选择器,试分别用IF_THEN语句和CASE语句的表达方式写出此电路的VHDL程序。
(选择控制的信号s1和s0为STD_LOGIC_VECTOR类型;当s1='0',s0='0';s1='0',s0='1';s1='1',s0='0'和s1='1',s0='1'分别执行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:
instd_logic;
s1,s0:
instd_logic_vector(1downto0);
y:
outstd_logic);
endentitymux41;
architectureoneofmux41is
begin
process(a,b,c,d,s1,s0)
begin
ifs1='0'ands0='0'then
y<=a;
elseifs1='0'ands0='1'then
y<=b;
elseifs1='1'ands0='0'then
y<=c;
elseifs1='1'ands0='1'then
y<=d;
endif;
endprocess;
endarchitectureone;
用case语句
程序如下:
libraryIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entitymux41is
port(a,b,c,d:
instd_logic;
s1,s0:
instd_logic;--这里s1s0没有定义成2位矢量
y:
outstd_logic);
endentitymux41;
architectureoneofmux41is
signall1:
std_logic_vector(1downto0);--中间信号为两位矢量,为了使用&
begin
process(a,b,c,d,s1,s0)
begin
l1<=s1&s0;
casel1is
when"00"=>y<=a;
when"01"=>y<=b;
when"10"=>y<=c;
when"11"=>y<=d;
endcase;
endprocess;
endarchitectureone;
(Ex-3)图中所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s='0'和'1'时,分别有y<='a'和y<='b'。
试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个2选1多路选择器MUX21A。
libraryieee;
useieee.std_logic_1164.all;
entitymuxkis
port(a1,a2,a3:
instd_logic;--待选择变量
temp:
bufferstd_logic;--中间信号
s1,s0:
instd_logic;--控制端
output:
outstd_logic);--输出结果
endmuxk;
architecturepr1ofmuxkis
begin
process(a2,a3,s0)--process1
begin
cases0is--使用case语句
when'0'=>temp<=a2;
when'1'=>temp<=a3;
endcase;
endprocess;
process(a1,temp,s1)--process2
begin
cases1is
when'0'=>output<=a1;
when'1'=>output<=temp;
endcase;
endprocess;
endpr1;
(Ex-4)图中是一个含有上升沿触发的D触发器的时序电路,试写出此电路的VHDL设计文件。
libraryIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
entitydffis
port(cl,clk0:
instd_logic;
out1:
outstd_logic);
endentitydff;
architectureoneofdffis
signalq1,q2:
std_logic
begin
process(clk)
begin
ifrisingedge(clk)then
q2=notq1;
q1=not(clandq2);
endif;
endprocess;
out<=q2;
endone;
(Ex-5)给出1位全减器的VHDL描述。
要求:
(1)首先设计1