Elsecount<="0000";clk<=notclk;
Endif;
Endif;
Endprocess;
U1:
ARICTLPORTMAP(CLK=>CLK,START=>NEWSTART,--FORTHEBETTER
CLKOUT=>INTCLK,RSTALL=>RSTALL,ARIEND=>ARIEND);
U2:
SREG8BPORTMAP(CLK=>INTCLK,LOAD=>RSTALL,DIN=>B,QB=>QB);
U3:
ANDARITHPORTMAP(ABIN=>QB,DIN=>A,DOUT=>ANDSD);
U4:
ADDER8BPORTMAP(CIN=>GNDINT,A=>DTBOUT(15DOWNTO8),B=>ANDSD,
S=>DTBIN(7DOWNTO0),COUT=>DTBIN(8));
U5:
REG16BPORTMAP(CLK=>INTCLK,CLR=>RSTALL,D=>DTBIN,Q=>DTBOUT);
ENDstruc;
2、8位右移寄存器
(1)模块图形符号及其逻辑功能描述
图1
(2)VHDL程序
LIBRARYIEEE;--8位右移寄存器
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSREG8BIS
PORT(CLK,LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
QB:
OUTSTD_LOGIC);
ENDSREG8B;
ARCHITECTUREbehavOFSREG8BIS
SIGNALREG8:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(CLK,LOAD)
BEGIN
IFCLK’EVENTANDCLK=’1’THEN
IFLOAD=’1’THENREG8<=DIN;
ELSEREG8(6DOWNTO0)<=REG8(7DOWNTO1);
ENDIF;
ENDIF;
ENDPROCESS;
QB<=REG8(0);--输出最低位
ENDbehav;
(3)仿真结果及其分析
图2
仿真分析:
在时钟脉冲的作用下,高位寄存器的数码送给低位寄存器,作为低位寄存器的次态输出;每输入一个时钟脉冲,寄存器的数据就顺序向右移动一位。
3、8位加法器
(1)模块图形符号及其逻辑功能描述
图3
(2)VHDL程序
LIBRARYIEEE;--8位加法器
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYADDER8BIS
PORT(CIN:
INSTD_LOGIC;
A,B:
INSTD_LOGIC_VECTOR(7DOWNTO0);
S:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDADDER8B;
ARCHITECTUREbehavOFADDER8BIS
SIGNALSINT,AA,BB:
STD_LOGIC_VECTOR(8DOWNTO0);
BEGIN
AA<='0'&A;BB<='0'&B;SINT<=AA+BB+CIN;S<=SINT(7DOWNTO0);
COUT<=SINT(8);
ENDbehav;
(3)仿真结果及其分析
图5
仿真分析:
输入10000000与00000001相加得到10000001仿真正确
4、1位乘法器
(1)模块图形符号及其逻辑功能描述
图6
(2)VHDL程序
LIBRARYIEEE;--1位乘法器
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYANDARITHIS
PORT(ABIN:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDANDARITH;
ARCHITECTUREbehavOFANDARITHIS
BEGIN
PROCESS(ABIN,DIN)
BEGIN
FORIIN0TO7LOOP--循环,完成8位与1位运算
DOUT(I)<=DIN(I)ANDABIN;
ENDLOOP;
ENDPROCESS;
ENDbehav;
(3)仿真结果及其分析
图7
仿真分析:
当ABIN为高电平时输出计算结果,当它为低电平时清零。
仿真分析正确。
5、16位锁存器/右移寄存器
(1)模块图形符号及其逻辑功能描述
图8
(2)VHDL程序
LIBRARYIEEE;--16位锁存器/右移寄存器
USEIEEE.STD_LOGIC_1164.ALL;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYREG16BIS
PORT(CLK,CLR:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(8DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));
ENDREG16B;
ARCHITECTUREbehavOFREG16BIS
SIGNALR16S:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
PROCESS(CLK,CLR)
BEGIN
IFCLR='1'THENR16S<="0000000000000000"
;--时钟到来时,锁存输入值,并右移低8位
ELSIFCLK'EVENTANDCLK='1'THEN
R16S(6DOWNTO0)<=R16S(7DOWNTO1);--右移低8位
R16S(15DOWNTO7)<=D;--将输入锁存到高8位
ENDIF;
ENDPROCESS;
Q<=R16S;
ENDbehav;
(3)仿真结果及其分析
图9
仿真分析:
输入110010101移位后得到110010*********仿真正确
6、运算控制模块
(1)模块图形符号及其逻辑描述
图10
(2)VHDL程序
LIBRARYIEEE;--运算控制模块
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYARICTLIS
PORT(CLK,START:
INSTD_LOGIC;
CLKOUT,RSTALL,ARIEND:
OUTSTD_LOGIC);
ENDARICTL;
ARCHITECTUREbehaveOFARICTLIS
SIGNALCNT4B:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
RSTALL<=START;
PROCESS(CLK,START)
BEGIN
IFSTART='1'THENCNT4B<="0000";
ELSIFCLK'EVENTANDCLK='1'THEN
IFCNT4B<8THENCNT4B<=CNT4B+1;ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CNT4B,START)
BEGIN
IFSTART='0'THEN
IFCNT4B<8THENCLKOUT<=CLK;ARIEND<='0';
ELSECLKOUT<='0';ARIEND<='1';ENDIF;
ELSECLKOUT<=CLK;ARIEND<='0';
ENDIF;
ENDPROCESS;
ENDbehave;
(3)仿真结果及其分析
图11
仿真分析:
当开始START信号发出后,RSTALL重置,CLKOUT才原样输出CLK信号,起到控制器件工作的作用!
仿真正确!
五、总体设计电路图
图12
1、工作原理:
本乘法器由五个模块组成,其中ARICTL是乘法运算控制电路,它的START信号上的上跳沿与高电平有2个功能,即16位寄存器清零和被乘数A[7...0]]向移位寄存器SREG8B加载;它的低电平则作为乘法使能信号,乘法时钟信号从ARICTL的CLK输入。
当被乘数被加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,一位乘法器ANDARITH打开,8位乘数B[7..0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器REG16B中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,一位乘法器全零输出。
如此往复,直至8个时钟脉冲后,由ARICTL的控制,乘法运算过程自动中止,ARIEND输出高电平,乘法结束。
此时REG16B的输出即为最后的乘积
2、仿真结果及其分析
图13
仿真分析:
两个十六进制数FD和9F相乘,当开始脉冲加进时,乘法器开始工作,经过八个时钟信号的上升沿,计算出结果!
理论上应等于9D23,实验结果也等于9D23,与理论吻合,仿真正确!
3、管脚分配图
图14
4、硬件验证
(1)试验箱电路板上的连线
(2)设计验证情况
K0~K7分别控制A0~A7,A0为低位;K8~K15分别控制B0~B8,B0为低位。
L0~L15分别为S70~S715的输出,S70为低位;CLK为时钟信号由CLK0提供;START为开始信号由S0控制;ARIEND为运算结束信号,由LED0显示。
验证:
编译,综合后向目标苡片下载适配后的逻辑设计文件,操作步骤省略。
下载适配后,
1>令K0~K15全部置零,即“0x0”,结果显示“0000000000000000”,理论结果也为“0000000000000000”,验证正确;
2>令K0~K15全部置1,即“FFxFF”,结果显示“1111111000000001”,理论结果也为“1111111000000001”,验证正确;
3>令K7~K0置数“10101010”,K15~K8置数“11011011”,即“AAxDB”,结果显示“1001000101101110”,理论结果也为“1001000101101110”,验证正确。
综上所述,硬件验证正确。
六、心得体会
通过电子设计的数字部分EDA设计,我们掌握了系统的数字电子设计的方法,也知道了实验调试适配的具体操作方法。
在设计过程中,我们遇到了各种问题,在李老师的指导下和我们自己的努力,克服了各种问题,最后得到了成功。
但是我也发现了一些问题,我们无法解决。
如:
在ARICTL控制器模块中有一个警告,还有在适配后得到频率高的执行速度还要慢一些等等。
总之,这次设计使我掌握了很多有用的经验,也学到了很多在书本上学不到知识,为以后的学习和工作打下坚实的基础。