考试题最后整理.docx
《考试题最后整理.docx》由会员分享,可在线阅读,更多相关《考试题最后整理.docx(17页珍藏版)》请在冰豆网上搜索。
考试题最后整理
复习思考题
考试时,由老师随机抽取试题,题目的范围如下所示,实际考试题目在以下题目基础上稍作修改,口试内容主要是围绕所做题目进行。
考试时间:
90分钟。
1、什么叫异步清零?
同步清零?
用VHDL语言如何表示?
同步是指与时钟同步,即时钟触发条件满足时检测清零信号是否有效,有效则在下一个时间周期的触发条件下,执行清零,异步是清零信号有效时,无视触发脉冲,立即清零。
Process(cr,clk)
Begin
Ifcr=’0’then
Count<=(others=>’0’);
elsif(clk’eventandclk=’0’)then
顺序语句;
Endif;
Endif;
Endprocess;
2、用Case语句和IF语句描述电路时应注意什么问题?
If和case语句是VHDL里边两个非常重要的语句,如何用好她们来描述逻辑电路和时序电路是学会VHDL编程重要的一步。
if和case语句有一定的相关性,也有一定的区别。
相同的地方是他们可以实现几乎一样的功能。
下面主要介绍一下她们之间的区别。
If语句每个分支之间是有优先级的,综合得到的电路是类似级联的结构。
Case语句每个分支是平等的,综合得到的电路则是一个多路选择器。
因此,多个ifelseif语句综合得到的逻辑电路延时往往比case语句要大。
一些初学者在一开始往往喜欢用ifelsif语句,因为这种语法表达起来更加直接,但是在运行速度比较关键的项目中,使用case语句的效果会更好。
下面的例子给出了if语句和case语句的综合结果
If语句综合结果
Case语句综合结果
有关if,case语句另外一个值得一提的东西是在用if或者case语句做逻辑电路的时候,必须为信号设置默认值。
有两种方法,第一种方法是在if,case语句之前对目标信号进行赋值,采用这种方法,就不必专门写else或者whenothers语句对信号进行默认赋值。
第二种方法就是在else或者whenothers语句中对信号进行默认条件下的赋值。
如果违反了上述规则,那么会在综合电路的时候形成一个transparentlatch,也就是电平触发的锁存器,这对电路的时序分析等会造成很大的麻烦。
在时序电路中,如果没有在else语句或者whenothers语句中对信号赋值,那么综合工具会认为寄存器保持当前输入。
从电路图上看,即把寄存器的输出接回寄存器的输入。
CASE语句的结构如下:
CASE表达式IS
When选择值=>顺序语句;
When选择值=>顺序语句;
...
ENDCASE;
注意事项:
1、条件句中的选择值必在表达式的取值范围内。
2、除非所有条件句中的选择值能完全覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHER”表示。
3、CASE语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。
4、CSAE语句执行中必须选中且只能选中所列条件语句中的一条。
IF语句根据指定的条件来确定语句执行顺序,共有3种类型。
1、用于门闩控制的IF语句
书写格式:
IF条件THEN
<顺序处理语句>
ENDIF;
条件成立,顺序处理语句执行,否则不执行。
2、用于二选一控制的IF语句
书写格式:
IF条件THEN
<顺序处理语句甲>
ELSE
<顺序处理语句乙>
ENDIF;
当条件满足时,执行顺序语句甲;条件不成立时,执行顺序语句乙。
3、IF语句
IF条件1THEN
<顺序语句1>;
ELSEIF条件2THEN
<顺序语句2>;
……
ELSEIF条件nTHEN
<顺序语句n>;
ELSE
<顺序语句n+1>;
ENDIF;
3、试用VHDL语言描述一个M=100的二进制计数器.
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitym100is
port(
CLK:
instd_logic;
EN:
instd_logic;
CR:
instd_logic;
Q:
outstd_logic_vector(6downto0);
OC:
outstd_logic
);
endm100;
architecturearc_m100ofm100is
signalcount:
std_logic_vector(6downto0);
begin
process(CR,CLK,EN)
begin
ifCR='0'then
count<=(others=>'0');
elsifclk'eventandclk='1'then
ifEN='1'andcount<99then
count<=count+1;
elsifEN='1'andcount=99then
count<="0000000";
endif;
endif;
endprocess;
process(count)
begin
ifcount=99then
OC<='1';
else
OC<='0';
endif;
endprocess;
Q<=count;
endarchitecturearc_m100;
4、试用VHDL语言描述一个M=24的十进制计数器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitym24is
port(
CLK:
instd_logic;
QL:
outstd_logic_vector(3downto0);
QH:
outstd_logic_vector(3downto0);
OC:
outstd_logic
);
endm24;
architecturebehavofm24is
signalcouL:
std_logic_vector(3downto0);
signalcouH:
std_logic_vector(3downto0);
begin
process(CLK)
begin
ifclk'eventandclk='1'then
if(couL=3andcouH=2)then
couL<="0000";
couH<="0000";
elsifcouL=9then
couL<="0000";
couH<=couH+1;
else
couL<=couL+1;
endif;
endif;
endprocess;
process
begin
if(couL=3andcouH=2)then
OC<='1';
else
OC<='0';
endif;
endprocess;
QL<=couL;
QH<=couH;
endbehav;
5、试用VHDL语言描述一个分频器,要求fi=5KHz,fout=50Hz
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinqiis
port(
clk:
instd_logic;
clk_out:
outstd_logic
);
endfenpinqi;
architecturearcoffenpinqiis
signalcou:
std_logic_vector(6downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifcou=99then
cou<=(others=>'0');
else
cou<=cou+1;
endif;
endif;
endprocess;
process(cou)
begin
ifcou=99then
clk_out<='1';
else
clk_out<='0';
endif;
endprocess;
endarc;
6、试用VHDL语言设计一个序列码发生器,要求反复产生00110111序列码
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
entityxulieis
port(
clk:
inSTD_LOGIC;
res:
inSTD_LOGIC;
Q:
outSTD_LOGIC
);
endxulie;
architecturertlofxulieis
signaltemp:
std_logic_vector(7downto0);
begin
process(res,clk)
begin
if(res='1')then
temp<="00110111";
elsif(clk'eventandclk='1')then
temp<=temp(7downto0)&temp(7);
endif;
Q<=temp(0);
endprocess;
endrtl;
7、如何设置仿真结束时间?
8、下载前顶层原理图要做那些操作?
9、如何观察分频器输入输出波形?
10、已知计数器模值,如何设置计数器的位数?
2^n-1
11、试用VHDL语言中的CASE语句编写一个三--八译码器;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYtest1IS
PORT(
in1,in2,in3:
INSTD_LOGIC;
Result:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDtest1;
ARCHITECTUREaOFtest1IS
SIGNALtemp:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
temp<=in1&in2&in3;
PROCESS(temp)
BEGIN
CASEtempIS
WHEN"000"=>Result<="11111110";
WHEN"001"=>Result<="11111101";
WHEN"010"=>Result<="11111011";
WHEN"011"=>Result<="11110111";
WHEN"100"=>Result<="11101111";
WHEN"101"=>Result<="11011111";
WHEN"110"=>Result<="10111111";
WHEN"111"=>Result<="01111111";
WHENOTHERS=>Result<="11111111";
ENDCASE;
ENDPROCESS;
ENDa;
12、试用VHDL语言编写一个3位乘法器;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmulti3IS
PORT(
A,B:
INSTD_LOGIC_VECTOR(2DOWNTO0);
Y:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
);
ENDmulti3;
ARCHITECTUREaOFmulti3IS
SIGNALtemp1:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALtemp2:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtemp3:
STD_LOGIC_VECTOR(4DOWNTO0);
BEGIN
temp1<=AWHENB(0)='1'ELSE"000";
temp2<=(A&'0')WHENB
(1)='1'ELSE"0000";
temp3<=(A&"00")WHENB
(2)='1'ELSE"00000";
Y<=temp1+temp2+('0'&temp3);
ENDa;
13、试用VHDL语言编写一个七段共阴数码显示译码器;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityymqis
port(
num:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(6downto0)
);
endymq;
architecturea1ofymqis
begin
withnumselect
dout<="1111110"when"0000",
"0110000"when"0001",
"1101101"when"0010",
"1111001"when"0011",
"0110011"when"0100",
"1011011"when"0101",
"1011111"when"0110",
"1110000"when"0111",
"1111111"when"1000",
"1111011"when"1001",
"0000000"whenothers;
enda1;
14、试用VHDL语言编写一个4选1多路选择器;
libraryieee;
useieee.std_logic_1164.all;
entitybxyis
port(
d:
instd_logic_vector(7downto0);
s:
instd_logic_vector(2downto0);
y:
outstd_logic);
endbxy;
architecturebehofbxyis
begin
process(s)
begin
casesis
when"000"=>y<=d(0);
when"001"=>y<=d
(1);
when"010"=>y<=d
(2);
when"011"=>y<=d(3);
when"100"=>y<=d(4);
when"101"=>y<=d(5);
when"110"=>y<=d(6);
whenothers=>y<=d(7);
endcase;
endprocess;
endbeh;
15、试用VHDL语言编写一个4位二进制加法器。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityadd4is
port(
a,b:
instd_logic_vector(3downto0);
ci:
instd_logic;
sum:
outstd_logic_vector(3downto0);
co:
outstd_logic
);
endadd4;
architecturearcofadd4is
signals:
std_logic_vector(4downto0);
begin
s<=('0'&a)+('0'&b)+("0000"&ci);
sum<=s(3downto0);
co<=s(4);
endarc;
16、试用VHDL语言编写八选一数据选择器程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYEIGHT_XUAN_1IS
PORT(
ST:
INSTD_LOGIC;
A:
INSTD_LOGIC_VECTOR(2DOWNTO0);
D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
Q:
OUTSTD_LOGIC
);
END;
ARCHITECTUREHBVOFEIGHT_XUAN_1IS
SIGNALQ1:
STD_LOGIC;
BEGIN
PROCESS(A)
BEGIN
IFST='1'THEN
Q1<='0';
ELSECASEAIS
WHEN"000"=>Q1<=D(0);
WHEN"001"=>Q1<=D
(1);
WHEN"010"=>Q1<=D
(2);
WHEN"011"=>Q1<=D(3);
WHEN"100"=>Q1<=D(4);
WHEN"101"=>Q1<=D(5);
WHEN"110"=>Q1<=D(6);
WHEN"111"=>Q1<=D(7);
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
Q<=Q1;
ENDHBV;
17、试用VHDL语言编写一个同步复位的4位二进制加法计数器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycountis
port(
clk:
instd_logic;
cr:
instd_logic;
q:
outstd_logic_vector(3downto0);
oc:
outstd_logic
);
endcount;
architecturearcofcountis
signalcou:
std_logic_vector(3downto0);
begin
process(cr,clk)
begin
waituntilclk'eventandclk='1';
ifcr='0'then
cou<=(others=>'0');
else
cou<=cou-1;
endif;
endprocess;
q<=cou;
process(cou)
begin
ifcou=15then
oc<='1';
else
oc<='0';
endif;
endprocess;
endarchitecturearc;
18、试用VHDL语言编写一个一位全加器电路
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityfulladderis
port(a,b,ci:
instd_logic;
co,s:
outstd_logic);
endfulladder;
architectureaddstroffulladderis
begin
s<=axorbxorci;
co<=(aandb)or(aandci)or(bandci);
endaddstr;
19、试用VHDL语言编写一个异步复位的4位二进制减法计数器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycounter4is
port(
rst:
instd_logic;
clk:
instd_logic;
load:
instd_logic;
data:
instd_logic_vector(3downto0);
count:
outstd_logic_vector(3downto0)
);
endcounter4;
architecturearcofcounter4is
signalcnt:
std_logic_vector(3downto0);
begin
process(clk,rst)
begin
ifrst='0'then
cnt<=(others=>'0');
elsifclk'eventandclk='1'then
ifload='1'then
cnt<=data;
else
cnt<=cnt-1;
endif;
endif;
endprocess;
count<=cnt;
endarc;
20、试用VHDL语言编写一个74160电路
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(
clk:
instd_logic;
rst:
instd_logic;
ena:
instd_logic;
outy:
outstd_logic_vector(3downto0);
cout:
outstd_logic
);
endcnt10;
architectureoneofcnt10is
signalcqi:
std_logic_vector(3downto0);
begin
p_reg:
process(clk,rst,ena)
begin
ifrst='1'then
cqi<="0000";
elsifclk'eventandclk='1'then
ifena='1'then
cqi<=cqi+1;
endif;
endif;
outy<=cqi;
endprocessp_reg;
cout<=cqi(0)andcqi
(1)andcqi
(2)andcqi(3);
endone;
4-16译码器