VHDL第一次实验报告Word文件下载.docx
- 文档编号:22897441
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:59
- 大小:271.64KB
VHDL第一次实验报告Word文件下载.docx
《VHDL第一次实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《VHDL第一次实验报告Word文件下载.docx(59页珍藏版)》请在冰豆网上搜索。
实验过程及内容:
2.1多路选择器
多路选择器的顶层电路如图P2.1所示。
根据真值表,如果输入sel=“01”或者sel=“10”,那么输出将等于对应的某一输入(c=a或c=b).然而如果输入sel=“00”或者sel=“11”,那么输出将分别为‘0’和‘Z’(高阻)。
(a)填写表格,完成下面的代码。
(b)是对你的解答给出相关的注释。
(c)将代码编译后进行仿真,验证其正确性。
实验完整VHDL代码:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entitymuxis
Port(a:
inSTD_LOGIC_VECTOR(7DOWNTO0);
b:
sel:
inSTD_LOGIC_VECTOR(1DOWNTO0);
c:
outSTD_LOGIC_VECTOR(7DOWNTO0));
endmux;
architectureexampleofmuxis
begin
PROCESS(a,b,sel)
begin
IF(sel="
00"
)THEN
c<
="
00000000"
;
ELSIF(sel="
01"
=a;
10"
=b;
ELSE
=(OTHERS=>
'
U'
);
ENDIF;
ENDPROCESS;
endEXAMPLE;
仿真测试文件代码:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYTest_MuxIS
ENDTest_Mux;
ARCHITECTUREbehaviorOFTest_MuxIS
COMPONENTmux
PORT(
a:
INstd_logic_vector(7downto0);
INstd_logic_vector(1downto0);
OUTstd_logic_vector(7downto0)
);
ENDCOMPONENT;
--Inputs
signala:
std_logic_vector(7downto0):
=(others=>
0'
signalb:
signalsel:
std_logic_vector(1downto0):
--Outputs
signalc:
std_logic_vector(7downto0);
--Noclocksdetectedinportlist.Replace<
clock>
belowwith
--appropriateportname
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
muxPORTMAP(
a=>
a,
b=>
b,
sel=>
sel,
c=>
c
--Stimulusprocess
stim_proc:
process
begin
--holdresetstatefor100ns.
a<
="
10101010"
b<
11110000"
sel<
waitfor100ns;
sel<
11"
--insertstimulushere
wait;
endprocess;
END;
仿真结果:
如图,当输入信号sel为“00”时,输出信号c为“00000000”;
当输入信号sel为“01”时,输出信号c等于a即为“10101010”;
当输入信号sel为“10”时,输出信号c等于b即为“11110000”;
当输入信号sel为其他情况时,输出信号c等于自己设定的值,在此处即为“U”。
习题3.4ROM
试用1*1维常数来实现只读存储器ROM(read-onlymemory),假设一个ROM由许多深度为8,位宽为4的块组成。
提示:
首先建立一个名为rom的数组,然后定义一个rom类型的信号来实现ROM,用常数值填充到ROM块中:
CONSTANTmy_rom:
rom:
=(values);
。
entityROMis
Port(addr:
inintegerrange0to7;
data:
outSTD_LOGIC_vector(3downto0));
endROM;
architectureBehavioralofROMis
TYPEROMISARRAY(0TO7)OFSTD_LOGIC_VECTOR(3DOWNTO0);
CONSTANTmy_rom:
ROM:
=("
0000"
"
0001"
"
0010"
0011"
0100"
0101"
0110"
0111"
data<
=my_rom(addr);
endBehavioral;
ENTITYrom1IS
ENDrom1;
ARCHITECTUREbehaviorOFrom1IS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTROM
addr:
INintegerrange0to7;
OUTstd_logic_vector(3downto0)
signaladdr:
integerrange0to7;
signaldata:
std_logic_vector(3downto0);
ROMPORTMAP(
addr=>
addr,
data=>
data
addr<
=0;
addr<
=2;
=3;
=5;
=7;
=1;
wait;
如图。
当输入信号addr为“0”时,输出信号data为“0000”;
当输入信号addr为“2”时,输出信号data为“0010”;
当输入信号addr为“3”时,输出信号data为“0011”;
当输入信号addr为“5”时,输出信号data为“0101”;
当输入信号addr为“7”时,输出信号data为“0111”;
当输入信号addr为“1”时,输出信号data为“0001”。
习题3.5简易加法器
重新编写一段代码,实现例3.3所示的加法器,要求所有输入/输出信号的类型均为STD_LOGIC_VECTOR(提示:
回顾3.8节所学的内容)。
useIEEE.STD_LOGIC_arith.all;
useIEEE.STD_LOGIC_unsigned.all;
entityadder1is
inSTD_LOGIC_VECTOR(3DOWNTO0);
sum:
outSTD_LOGIC_VECTOR(4DOWNTO0));
endadder1;
architectureBehavioralofadder1is
sum<
=('
&
a)+('
b);
ENTITYadder2IS
ENDadder2;
ARCHITECTUREbehaviorOFadder2IS
COMPONENTadder1
INstd_logic_vector(3downto0);
OUTstd_logic_vector(4downto0)
std_logic_vector(3downto0):
signalsum:
std_logic_vector(4downto0);
adder1PORTMAP(
sum=>
sum
a<
b<
1000"
1001"
1010"
1011"
1100"
1101"
1110"
1111"
当输入信号a为“0000”,b为“0001”时,输出信号sum为“00001”;
当输入信号a为“0010”,b为“0011”时,输出信号sum为“00101”;
当输入信号a为“0100”,b为“0101”时,输出信号sum为“01001”;
当输入信号a为“0110”,b为“0111”时,输出信号sum为“01101”;
当输入信号a为“1000”,b为“1001”时,输出信号sum为“10001”;
当输入信号a为“1010”,b为“1011”时,输出信号sum为“10101”;
当输入信号a为“1100”,b为“1101”时,输出信号sum为“11001”;
当输入信号a为“1110”,b为“1111”时,输出信号sum为“11101”。
习题4.4通用译码器
下面这个习题和例4.1中的译码器电路有关。
(1)在例4.1给出的电路中,如果矢量的位宽发生变化,那么程序中的信号sel(第7行)和(第8行)的位宽也要相应的改变。
如果想要把例4.1中的设计修改为一个通用译码器。
为此必须在ENTITY中使用GENERIC语句指定sel的位宽(假设n=3),然后用n的函数来替代sel和x的位宽上界。
综合后,对电路进行仿真,验证其正确性。
entitydecoder1is
GENERIC(n:
INTEGER:
=3);
Port(ena:
inSTD_LOGIC;
inSTD_LOGIC_VECTOR(n-1DOWNTO0);
x:
outSTD_LOGIC_VECTOR((2**n)-1DOWNTO0));
enddecoder1;
architectureBehavioralofdecoder1is
PROCESS(ena,sel)
VARIABLEtemp1:
STD_LOGIC_VECTOR(x'
HIGHDOWNTO0);
VARIABLEtemp2:
INTEGERRANGE0TOx'
HIGH;
BEGIN
temp1:
1'
temp2:
=0;
IF(ena='
FORiINsel'
RANGELOOP
IF(sel(i)='
temp2:
=2*temp2+1;
ELSE
=2*temp2;
ENDIF;
ENDLOOP;
temp1(temp2):
='
x<
=temp1;
ENDBehavioral;
ENTITYdecoder2IS
ENDdecoder2;
ARCHITECTUREbehaviorOFdecoder2IS
COMPONENTdecoder1
inSTD_LOGIC_VECTOR(2DOWNTO0);
signalena:
std_logic:
='
std_logic_vector(2downto0):
signalx:
decoder1PORTMAP(
ena=>
ena,
x=>
x
ena<
sel<
010"
100"
110"
101"
111"
让使能端始终为“1”。
当输入信号sel为“010”时,输出信号x为“11111011”;
当输入信号sel为“100”时,输出信号x为“11101111”;
当输入信号sel为“110”时,输出信号x为“10111111”;
当输入信号sel为“101”时,输出信号x为“11011111”;
当输入信号sel为“111”时,输出信号x为“01111111”;
当输入信号sel为“101”时,输出信号x为“11011111”。
(2)在例4.1的设计中引入了一个二进制整数到整数的转换函数(第20行第26行)。
如果把sel声明为整数,就不需要使用这个转换函数。
要求读者修改代码,将信号sel声明为整数类型。
当信号sel的位宽用n来指定时,代码才是通用的。
综合代码并进行仿真。
entitydecoder3is
inINTEGERRANGE0TO(2**n)-1;
enddecoder3;
architectureBehavioralofdecoder3is
)THEN
temp1(sel):
ENTITYdecorder4IS
ENDdecorder4;
ARCHITECTUREbehaviorOFdecorder4IS
COMPONENTdecoder3
ena:
INstd_logic;
INintegerrange0to7;
integer:
decoder3PORTMAP(
en
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 第一次 实验 报告