移位相加型8位硬件乘法器设计.docx
《移位相加型8位硬件乘法器设计.docx》由会员分享,可在线阅读,更多相关《移位相加型8位硬件乘法器设计.docx(12页珍藏版)》请在冰豆网上搜索。
移位相加型8位硬件乘法器设计
移位相加型8位硬件乘法器设计
合肥学院
课程设计报告
题目:
移位相加型8位硬件乘法器
系别:
电子信息与电气工程系
专业:
通信工程
班级:
13通信工程
(1)班
学号:
姓名:
导师:
石朝毅
成绩:
2016年6月11日
移位相加型8位硬件乘法器设计
摘要
本次设计是基于时序结构的8位移位相加型乘法器,使用软件QuartusII进行仿真设计。
完成此乘法器,我们需要首先设计该乘法器的组件,包括REGSHT模块、SREG8BT模块、AND8B模块和ADDER8BT模块,并对所有元件进行仿真,无误后可进行乘法器的设计。
设计方法使用的是元件例化,具体原理是通过逐项相加来实现乘法功能,最终完成整体的VHDL程序设计并仿真。
关键词:
时序;乘法器;元件例化
第一章前言
设计概述
问题提出与原理
采用元件例化的设计方法,设计一个移位相加型8位硬件乘法器设计。
下图所示为一个基于时序结构的8位移位相加型乘法器。
图1设计原理图
设计需要
(1)元件REGSHT设计,并仿真;
(2)元件SREG8BT,并仿真;
(3)元件AND8B,并仿真;
(4)元件ADDER8BT,并仿真;
(5)整体VHDL程序设计,包括元件例化,并仿真。
第二章设计过程及结果
设计思路
设计须知
首先建立文件夹在软件工作的环境下,注意对于不同的器件的设计不能放在同一个文件夹当中这样会造成编译时出现混乱的错误现象。
对于每个元器件的设计有两种方法:
可以利用原理图输入法,或者利用文本输入法进行设计。
本次设计使用的是文本输入法。
要注意在写文本输入时要注意实体名与你程序中名字一致。
然后,依次按照实验指导书的步骤进行设计。
先功能仿真,然后时序仿真,最后下载编译。
基本步骤
(1)为本项设计建立文件夹任何一项设计都是一项工程(Project),都必须首先为此工程建立一个放置与此工程相关的所有文件的文件夹,此文件夹将被EDA软件默认为工作库(WorkLibrary)。
一个设计项目可以包含多个设计文件,一般不同的设计项目最好放在不同的文件夹中。
注意:
文件名不能用中文,且不可带空格。
(2)输入设计项目和存盘
a.打开QuartusII,单击“File”菜单,将鼠标移到NewProjectWizard…选项并单击,
b.选择File--New,选择原理图编辑器,双击“BlockDiagram/SchematicFile”,或者选中该项后单击“OK”按钮。
(或者选择FileNew,选择VHDLFile进行文本设计)
(3)选择目标器件并编译,在Assignments选项的下拉菜单中选择器件选择项Device...,在Family(器件序列栏)中选定目标器件对应的序列名,EP1C6对应的是Cyclone系列。
在AvailableDevices里选择EP1C6Q240C8(有时需要把Showadvanceddevices的勾消去,以便显示出所有速度级别的器件)。
注意:
所选器件必须与目标板的器件型号完全一致。
(4)在总VHDL程序中需要将要用到的之前设计好的元件添加到当前工程中来,添加方法如下:
Project—Add/RemoveFileinProject,找到之前的元件add即可,之后方可进行总程序的编译。
(5)仿真时,首先选择Edit—EndTime设置时间为30us,之后导入输入输出端口,选择Pins:
All将需要的端口添加,之后给输入端口进行赋值或添加时钟进行时序仿真。
设计代码及仿真
元件REGSHT设计代码及仿真结果
LIBRARYIEEE;
USEregshtIS
PORT(CLK,CLR:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(8DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));
ENDregsht;
ARCHITECTUREbehavOFregshtIS
SIGNALR16S:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
PROCESS(CLK,CLR)
BEGIN
IFCLR='1'THENR16S<=(OTHERS=>'0');
ELSIFCLK'EVENTANDCLK='1'THEN
R16S(6DOWNTO0)<=R16S(7DOWNTO1);
R16S(15DOWNTO7)<=D;
ENDIF;
ENDPROCESS;
Q<=R16S;
ENDbehav;
图2REGSHT时序仿真图
分析:
此处锁存器模块即16位右移寄存器可利用IF语句来完成其输入值的锁存当清零CLR=‘1’信号到来时定义的信号量R16S锁存输入值即R16S清零否则在时钟信号CLK上升沿作用下将R16S的低8位进行移位操作同时将8位输入数据D锁存到R16S的高8位最后传送给Q输出。
在乘法器的顶层设计中乘数与被乘数的乘积也将出现在REG16B端口。
元件SREG8BT设计代码及仿真结果
LIBRARYIEEE;
USEsreg8btIS
PORT(CLK,LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
QB:
OUTSTD_LOGIC);
ENDsreg8bt;
ARCHITECTUREbehavOFsreg8btIS
SIGNALREG8:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(CLK,LOAD)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFLOAD='1'THEN
REG8<=DIN;
ELSEREG8(6DOWNTO0)<=REG8(7DOWNTO1);
ENDIF;
ENDIF;
ENDPROCESS;
QB<=REG8(0);
ENDbehav;
图3SREG8BT时序仿真图
分析:
8位右移寄存器是当时钟信号CLK处于上升沿时当LOAD=‘1’时将8位被乘数加载进去而当LOAD=‘0’时数据进行移位操作。
同时定义一个信号REG8用来装载新数据及移位后的操作数在完成这些操作后寄存器的最低位REG8(0)传送给QB输出。
元件AND8B设计代码及仿真结果
LIBRARYIEEE;
USEand8bIS
PORT(ABIN:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDand8b;
ARCHITECTUREbehavOFand8bIS
BEGIN
PROCESS(ABIN,DIN)
BEGIN
FORIIN0TO7LOOP
DOUT(I)<=DIN(I)ANDABIN;
ENDLOOP;
ENDPROCESS;
ENDbehav;
图4AND8B时序仿真图
分析:
加法器是由两个4位二进制加法器U1和U2组成的8位加法器逻辑电路其中U1用来装载8位加法器中两个加数的低四位而U2则用来装载高4位。
元件ADDER8BT设计代码及仿真结果
LIBRARYIEEE;
USEadder8btIS
PORT(CIN:
INSTD_LOGIC;
A,B:
INSTD_LOGIC_VECTOR(7DOWNTO0);
S:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDadder8bt;
ARCHITECTUREbehavOFadder8btIS
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;
图5ADDER8BT时序仿真图
分析:
8位加法器的设计是由两个4位加法器U1,U2所形成的在下面程序中定义一个信号量CARRY_OUT将4位加法器U1的COUT赋给CARRY_OUT,再将CARRY_OUT的值赋给4位加法器U2的进位CIN,8位加法器的高四位低四位分别来自于4位加法器U2和U1。
总模块设计代码及仿真结果
LIBRARYIEEE;
USEMULT8BIS
PORT(CLK0,LD:
INSTD_LOGIC;
A,B:
INSTD_LOGIC_VECTOR(7DOWNTO0);
Q0:
BUFFERSTD_LOGIC_VECTOR(15DOWNTO0));
ENDENTITYMULT8B;
ARCHITECTUREBEHAVOFMULT8BIS
COMPONENTSREG8BT
PORT(CLK,LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
QB:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTAND8B
PORT(ABIN:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTADDER8BT
PORT(CIN:
INSTD_LOGIC;
A,B:
INSTD_LOGIC_VECTOR(7DOWNTO0);
S:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTREGSHT
PORT(CLK,CLR:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(8DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));
ENDCOMPONENT;
SIGNALNET1:
STD_LOGIC;
SIGNALNET4:
STD_LOGIC;
SIGNALNET3:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALNET2:
STD_LOGIC_VECTOR(8DOWNTO0);
BEGIN
U1:
SREG8BT
PORTMAP(CLK=>CLK0,LOAD=>LD,DIN=>A,QB=>NET1);
U2:
AND8B
PORTMAP(DIN=>B,ABIN=>NET1,DOUT=>NET3);
U4:
ADDER8BT
PORTMAP(A=>Q0(15DOWNTO8),B=>NET3,CIN=>NET4,
S=>NET2(7DOWNTO0),COUT=>NET2(8));
U3:
REGSHT
PORTMAP(CLK=>CLK0,CLR=>LD,D=>NET2,Q=>Q0);
ENDARCHITECTUREBEHAV;
图6总模块时序仿真图
第三章总结
本次设计是个综合性设计,我们需要熟悉很多知识才能完成本次设计。
通过本次项目的设计,我对一个项目开发的基本流程有了更深层次的了解,也让我加深对EDA的了解,我也开始喜欢上了EDA。
在此次设计的过程中,遇到了很多问题,如写端口时将小括号写成大括号,有些部分还少了分号导致了编译出错,最后根据错误提示信息找到了错误并改正,还有仿真的时候找不到波形文件,原因是我没有将波形文件保存到对应的文件夹中,在找错误的过程中,我觉得自己得到了很大的提升。
上课的时候我们学习的都是理论知识,将理论转化成实践是有一定的难度的,但我们不能纸上谈兵,只有实践才能让我们真正掌握这门课的知识,从中获得最终的结论,使我们对以前的知识以及接触到的新内容掌握的更加牢固。
致谢
感谢石朝毅老师对我的悉心教导,使我对这门课产生了浓厚的兴趣。
硬件编程语言VHDL和高级语言有区别但很接近,通过这门课让我对硬件方面有了更深层次的了解,这将对我以后学习高级语言编程有很大的帮助,也必定有所突破。
在此,谨向石老师表示崇高的敬意和由衷的感谢。