16位vhdl乘法器详解,加仿真图
16位vhdl乘法器详解,加仿真图

控制模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cont_modu isport(Clk : in std_logic ;Start : in std_logic; //数据输入开始信号en_sig : out std_logic; //控制运算信号,为‘1’运算数据out_sig : out std_logic // 运算完成信号);end entity;architecture rlt_cont_modu of cont_modu issignal cnt :integer range 0 to 15 :=0;//定义从0到15type state is(S_idle,S_work,S_1d,S_2d);//运算状态信号,状态机signal st_ty : state :=S_idle;beginprocess(Clk)beginif rising_edge(Clk) thencase st_ty is 选择语句;S_idle为空闲状态,当输入数据后Start信号为1就开始工作when S_idle => if Start ='1' then 如果为1就跳转到S_work状态,并且使能信号置1st_ty <= S_work;en_sig <='1';else 不然继续在S_idle状态st_ty <= S_idle;en_sig <='0';end if;out_sig <='0';when S_work => if cnt =15 then 在S_work状态下,cnt信号一直加1,加满16个数就跳转到S_1d,然后使能信号en_sig 就为0。
vhdl实验报告_16乘16点阵_列选_显示

综合实践总结报告综合实践名称: EDA技术与实践综合实践地点、时间一.题目功能分析和设计实验的要求有如下三点:1.用16*16点阵的发光二极管显示字符;2.可显示字符为0~9的数字字符与A~F英文字母的大写;3.输入为四位二进制矢量;按照要求可知,LED点阵模块,共由16×16=256个LED发光二极管组成,如何在该点阵模块上显示数字和字母是本实验的关键。
先将要显示的每一幅图像画在一个16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布以数字8为例,点阵分布为:0000000000000000000000000000000000011111111110000001111111111000000110000001100000011000000110000001100000011000000111111111100000011111111110000001100000011000000110000001100000011000000110000001111111111000000111111111100000000000000000000000000000000000考虑到实际物理实验平台上点阵发光二极管的原理,以下为16×16点阵LED外观图,只要其对应的X、Y轴顺向偏压,即可使LED 发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
所以我采用行列扫描的方法,用四位二进制数做列选信号(总共16列),如选中第一列,则扫描第一列之中哪些行是高电平(1),哪些行是低电平(0);为高电平的则点亮,为低电平的不亮。
(列信号都接地)。
如此,列选信号由“0000”变到“1111”时,16列扫描完毕,一个字也就出来了,列选信号重新由“0000”开始扫描。
注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。
用vhdl设计十六路彩灯控制器程序仿真图报告

用v h d l设计十六路彩灯控制器程序仿真图报告-CAL-FENGHAI.-(YICAI)-Company One1课程设计报告题 目 用VHDL 设计十六路彩灯控制器课 程 名 称 创新电子系统设计 院 部 名 称 信息技术学院 专 业 电子信息工程班 级 08电子信息工程(1)班 学 生 姓 名 学 号 课程设计地点 实验楼 课程设计学时 60学时 指 导 教 师金陵科技学院教务处成绩一、课程设计目的与要求 (4)二、课程设计的题目及内容 (4)三、设计过程 (5)3.1 模块设计 (5)3.2时序制电路模块程序及器件原理图 (7)3.3 显示模块电路程序及器件原理图 (9)3.4 顶出模块设计程序及器件原理图 (11)四、设计结果 (12)(1)仿真波形图 (12)①时序控制模块仿真波形: (12)②显示模块仿真波形: (13)③多路彩灯控制仿真波形: (13)(2)管脚连接对应表 (14)(3)硬件实物图 (14)五、总结 (16)一、课程设计目的与要求“创新电子系统设计”课程是专业教学计划中设置的独立实践环节,其主要目的为加强对学生创新意识、创新精神和创新能力的培养,鼓励和倡导学生积极参加学科竞赛、课外科技和科研活动、创造发明活动和各类社会实践活动,提高学生综合素质,促进学生个性发展。
要求学生能在老师的指导下,自主完成一个较复杂综合电子系统设计与制作的全过程,或者通过参加各类各级和通信、电子相关课外科技活动及竞赛得到真正的实战训练。
二、课程设计的题目及内容题目:用VHDL语言设计十六路彩灯控制器内容:1.设计一个多路彩灯控制器,十六种彩灯能循环变化,有清零开关,可以变化彩灯闪动频率即是可以选择快慢两种节拍。
2.整个系统有三个输入信号,分别为控制快慢的信号OPT,复位清零信号CLR,输出信号是16路彩灯输出状态。
系统框图如:图 2.1.1 系统总体框图3.主要模块组成:时序控制电路模块和显示电路模块,时序控制电路是根据输入信号的设置得到相应的输出信号,并将此信号作为显示电路的时钟信号;显示电路输入时钟信号的周期,有规律的输出设定的六种彩灯变化类型。
VHDL实现16位全加器

VLSI电路和系统设计设计题2:CMOS数字集成电路设计用VHDL语言实现十六位全加器:托列吾别克·马杰尼班级:电路与系统01班学号:2012210201412013/11/24基于VHDL的16位全加器的设计1.1设计题目的内容及要求1.1.1目的:CMOS数字集成电路设计流程及数字集成电路自动化设计,包括功能验证、VHDL/Verlog建模、同步电路设计、异步数据获取、能耗与散热、信号完整性、物理设计、设计验证等技术1.1.2内容:主要实验内容是用0.18μm数字CMOS工艺,VHDL或Verlog设计一个16位全加器,用Synthesis 仿真工具验证功能,电路合成,及性能检测。
1.1.3主要测试参数及指标范围:16位的全加器主要的设计指标是高于1GHz的频率,功耗,物理面积大小等参数。
1.2全加器的组成和原理分析全加器是常用的组合逻辑模块中的一种,对全加器的分析和对组合逻辑电路的分析一样。
组合逻辑电路的分析,就是找出给定电路输入和输出之间的逻辑关系,从而了解给定逻辑电路的逻辑功能。
组合逻辑电路的分析方法通常采用代数法,一般按以下步骤进行:〔1〕根据所需要的功能,列出真值表。
〔2〕根据真值表,写出相应的逻辑函数表达式。
〔3〕根据真值表或逻辑函数表达式,画出相应的组合逻辑电路的逻辑图[1]。
〔4〕用VHDL编写程序在QUARTUSⅡ上进行模拟,并分析结果的正确性。
1.3 全加器简介全加器是组合逻辑电路中最常见也最实用的一种,考虑低位进位的加法运算就是全加运算,实现全加运算的电路称为全加器。
它主要实现加法的运算,其中分为并行全加器和串行全加器,所谓并行就是指向高位进位时是并行执行的,而串行就是从低位到高位按顺序执行,为了提高运算,必须设法减小或消除由于进位信号逐级传递所消耗的时间,为了提高运算速度,制成了超前进位加法器,这是对全加器的一种创新[2]。
1.3.1半加器的基本原理如果不考虑有来自低位的进位将两个1位二进制数相加,称为半加。
VHDL-实验

计算机科学与技术学院实验报告(学年度第学期)课程名称EDA技术实验姓名学号专业计算机班级地点教师实验一:八位二进制补码一.实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握八位二进制补码的VHDL设计;3.元件例化语句的使用。
二.实验原理若原码为正,则补码等于原码;若原码为负,则补码为(2+原码)mod2。
三.八位二进制补码程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JACKAN ISPORT(rst:IN STD_LOGIC;din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);dout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ENTITY JACKAN;ARCHITECTURE HAIXIA OF JACKAN ISSIGNAL tmp:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINPROCESS(din,rst)BEGINIF rst='0' THENdout<=(OTHERS=>'0');ELSIF din(7) ='1' THENFOR i IN 0 TO 6 LOOPtmp(i)<=NOT din(i);END LOOP;dout(6 DOWNTO 0) <= tmp+1;dout(7) <= din(7);ELSEdout<= din;END IF;END PROCESS;END ARCHITECTURE HAIXIA;四.实验结果五.总结8位二进制补码:寄存器主要用来存储8位二进制数据。
高8位为符号位,不进行求反运算。
余下7位根据高8位的数据状态进行相应操作。
实验二.一位全减器的VHDL设计一. 实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握一位半减器的VHDL设计;3.掌握一位半减器构建一位全减器的方法;二.实验原理由两个半减器和一个或门构成一个全减器。
数字集成电路课程设计16位加法器

数字集成电路课程设计——16位加法器设计参数:*输入两个16位的补码*输出一个17位的补码*允许采用流水线、单元复用等技术实现设计要求:*使用RTL级Verilog描述加法器架构*使用门级验证加法器功能(ModelSim等仿真)*优化方向:加法器等效总门数最少*等效门数计算示例:INV=1, NOR2=NAND2=2, DFF=4最终优化结果:图1.1单个全加器单元的最终优化方案图1.2 第17位结果的运算电路最终总共等效门数= 16 X 17 + 7 = 279仿真结果:1 2 3 4 5图2. ModelSim仿真结果如图2所示,箭头1所指区域为两个16位全0的加数,无进位,输出和为0;箭头2所指区域为0与1000000000000000(-32768)相加,无进位,输出和为11000000000000000(-32768);箭头3所指区域为0与1111111111111111(-1)相加,无进位,输出和为11111111111111111(-1);箭头4所指区域为-1与1000000000000000(-32768)相加,无进位,输出和为10111111111111111(-32769);箭头4所指区域为-1与1000000000000000(-32768)相加,进位为1,输出和为11000000000000000(-32768)。
可见已正确实现了16位补码加法器的功能。
设计思路:首先,我们需要明确加法器的设计。
按照题目的要求,我们的加法器必须满足以下几个原则:1、16位加法器,且可以计算出第17位的进位;2、可以计算补码;3、设计出的结构门数最少.由上面的要求,我们可以有对应的设计:1.我们假定16位数据本身就是以补码形式储存的,那么最高位就是符号位,0代表正数,1代表负数;由此,我们可以根据二进制加法的规则得知,计算补码不需要对储存的补码进行任何形式的修改,利用正常的全加器结构就可以计算出正确的结论,包括位数扩展的要求也能满足;2.要完成17位的补码计算,需要进行符号位扩展,也就是将加数和被加数的最高位重复一次变成17位的数据,如1000000000000000变为11000000000000000;在编码的时候,需要17个加法器,但是最后一个加法器的加数和被加数重复使用16位的数据,而进位则采用16位得到的进位;3.加法器必须是一般意义上的加法器,除非采用流水线结构,否则不应使用时序逻辑,如下图所示的设计就不合理。
十六位硬件乘法器 设计报告

课程名称电子设计自动化题目十六位乘法器院系班级信息学院09电子信息工程1班姓名崔钦婉学号**********指导老师凌朝东2011 年7 月6 日题目名称:十六位硬件乘法器电路摘要:设计一个16位硬件乘法器电路.要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用Quartus II软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
经软件仿真和硬件测试验证后,以达到实验要求。
目录摘要 (2)1. 系统设计 (3)1.1设计要求 (3)1.2系统设计方案 (3)2. 单元电路设计 (5)3. 软件设计 (8)4. 系统测试 (9)结论 (9)参考文献 (9)附录 (10)1.系统设计1.1设计要求题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出.1.2系统设计方案此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.乘数和被乘数的输入可用数据开关K1~K10分别代表数字1,2,…,9,0,用编码器对数据开关K1~K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是0000~1111,即0H~FH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.乘数和被乘数的输入模块将16进制码的A~F码设计成输出为null.使得减少了无用码的输入.两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.系统总体电路组成原理图如下图所示:2.单元电路设计(1)乘数和被乘数的输入模块:可分为两部分:十位输入和个位输入;十位输入的4位16进制码转换为8位2进制码后输入乘数和被乘数组成模块利用’&’与个位输入的4位16进制数组合而成.模块图如下图所示:此功能模块的仿真图如下图所示:结果显示:当乘数十位(a1)输入4,个位(a0)输入7时,out1能输出4;当被乘数十位(b1)输入8,个位(b0)输入5时,out2能输出85。
EDA与VHDL 实验报告--16位cpu 设计

[EDA与VHDL 实验报告][16位CPU设计]0 / 1916位cpu 设计一、顶层系统设计1.1 组成结构CPU的结构如图所示。
这是一个采用单总线系统架构的复杂指令系统结构的16 位CPU 。
处理器包含了各种基本器件模块。
他们是8个16位的寄存器reg0~ reg7、一个运算器ALU、一个移位寄存器Shifter、一个程序计数器PortCnt、一个指令寄存器InstrReg、一个比较器Comp、一个地址寄存器Addreg、和一个控制单元Control。
这些模块公共用一组16 位的三台数据总线。
系统采用自顶向下的方法进行设计。
顶层设计由微处理器和存储器通过一组双向数据总线连接,它们由一组地址总线和一些控制总线组成。
处理器从外存储器中读取指令,并通过执行这些指令来运行程序。
这些指令存储在指令寄存器中,并由控制单元译码。
控制单元使得相应的信号互相作用,并使处理单元执行这些指令。
1.2. 指令系统设计在设计处理器时首先要确定Cpu 具有哪些功能,并针对这些功能采用哪些指令,然后确定指令的格式。
为了使设计的CPU 具有基本的运算功能,指令将设计成以下形式,可以分为如下几类.●装载指令:指令从其他寄存器或存储器装载数据或是立刻赋值。
●存储指令:指令存储寄存器的值写到存储器●分支指令:指令使处理器转到其它地址,一些分支指令为条件转移,另外一些为无条件转移●移位指令:这些指令用移位寄存器单元执行移位操作,实现数据传递1.2.1 指令格式所有的指令都包含五位操作码。
单字节指令在低6位指令中包含两个3 位寄存器,一个是源操作数寄存器,另一个是目的操作数寄存器。
双字节指令中,第一个字节中包含目标寄存器的地址,第二个字节中包含了指令地址或者操作数。
指令格式如下:(1)单字指令(2)双字指令第一个字中包含目标寄存器的地址,第二个字中包含了指令地址或者操作数。
1.2.2 指令操作码1.3. 顶层结构的VHDL 设计CPU 原件的VHDL 描述CPU_LIB.VHDL 用来说明连接各个原件之间的信号类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
控制模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cont_modu isport(Clk : in std_logic ;Start : in std_logic; //数据输入开始信号en_sig : out std_logic; //控制运算信号,为‘1’运算数据out_sig : out std_logic // 运算完成信号);end entity;architecture rlt_cont_modu of cont_modu issignal cnt :integer range 0 to 15 :=0;//定义从0到15type state is(S_idle,S_work,S_1d,S_2d);//运算状态信号,状态机signal st_ty : state :=S_idle;beginprocess(Clk)beginif rising_edge(Clk) thencase st_ty is 选择语句;S_idle为空闲状态,当输入数据后Start信号为1就开始工作when S_idle => if Start ='1' then 如果为1就跳转到S_work状态,并且使能信号置1st_ty <= S_work;en_sig <='1';else 不然继续在S_idle状态st_ty <= S_idle;en_sig <='0';end if;out_sig <='0';when S_work => if cnt =15 then 在S_work状态下,cnt信号一直加1,加满16个数就跳转到S_1d,然后使能信号en_sig 就为0。
st_ty <= S_1d;cnt <= 0;en_sig <='0';else 如果没到16个数继续加1st_ty <= S_work;cnt <= cnt +1;en_sig <='1';end if;out_sig <='0';when S_1d => st_ty <= S_2d; 这是S_1d状态,主要是用来延迟一个时钟en_sig <='0';out_sig <='0';when S_2d => st_ty <= S_idle; S_2d状态,信号结束,out_sig为1en_sig <='0';out_sig <='1';end case;end if;end process;end rlt_cont_modu;控制RLT图其状态图数据流移位信号模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity data_path isport(Clk : in std_logic;Data_a : in std_logic_vector(15 downto 0); //乘法A数据输入Start : in std_logic; //数据开始信号en_sig : in std_logic;//使能信号shift : out std_logic //输出信号,移位输出);end entity;architecture rlt_data_path of data_path issignal temp_data : std_logic_vector(15 downto 0);定义一个16bit的数beginprocess(Clk)beginif rising_edge(Clk)thenif Start ='1' then 当开始信号为1,即数据进来时,就把乘数A的数据放入temp_data temp_data <= Data_a; 把输入数据A放入temp_dataelsif en_sig ='1' then 上面代码产生的使能信号,en_sig为1时,temp_data就左移动一位,一直会移动16位,一再强调仿真图对照看temp_data <= '0' & temp_data(15 downto 1) ;//数据左移位一次end if;end if;end process;process(Clk)beginif rising_edge(Clk)thenif en_sig ='1' then 当使能信号为1时,把temp_data的最低位输出,因为temp_data一直在移位,所以说shift实际是第一次输出的乘数A的最低位,然后倒数第二、第三位。
shift <= temp_data(0); //移位信号输出elseshift <= '0'; 当没有工作的时候shift保持为0end if;end if;end process;end rlt_data_path;数据流RLT图加法器模块(移位信号为1是做加法)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity add_path isport(Clk : in std_logic;Data_b : in std_logic_vector(15 downto 0);//数据B输入over_sig : in std_logic;//结束信号Start_sig : in std_logic;//开始信号en_sig : in std_logic;//运算有效信号shift : in std_logic;//移位信号tt_data : out std_logic_vector(31 downto 0);//数据B移位后的信号data_o : out std_logic_vector(31 downto 0)//乘法结果数据输出信号);end entity;architecture rlt_add_path of add_path issignal tmep_data : std_logic_vector(31 downto 0);定义32位的数,作为累计的数据signal tmep_da : std_logic_vector(31 downto 0);定义32位的数,作为数据B输入数据的移位signal tmep_da_1d : std_logic_vector(31 downto 0);定义32位的数,作为tmep_da延迟一个时钟后的数据,这里是时钟对齐处理,beginprocess(Clk)beginif rising_edge(Clk) thenif Start_sig ='1' then开始信号时,首先把累加值清零tmep_data <=(others =>'0');elsif shift ='1' then 然后数据A移位的数据为1时,就把数据B对应移位的数据相加tmep_data <= tmep_data + tmep_da_1d;//shift为1然后做加法elsetmep_data <= tmep_data;当数据A移位数据为0时不变end if;end if;end process;process(Clk)beginif rising_edge(Clk) thenif Start_sig ='1' then当开始信号时,把乘数B的数据赋值给tmep_da,高为补0 tmep_da <= x"0000" & Data_b;这个就是赋值,把高16位直接给0tmep_da_1d <= x"00000000";elsif en_sig ='1' then 当使能工作信号为1时,把数据tmep_da的值直接移位操作tmep_da <= tmep_da(30 downto 0) & tmep_da(31);//把数据左移动以位tmep_da_1d <= tmep_da;把数据tmep_da的数据给tmep_da_1d,end if;end if;end process;process(Clk)beginif rising_edge(Clk) thenif over_sig ='1' then 当工作完成后信号,就是乘法运算已经做完后,把数据tmep_data的值输出data_o <= tmep_data;//完成信号,数据输出end if;end if;end process;tt_data <= tmep_da_1d; 这个是测试信号,测试B数据的移位后的值end rlt_add_path;加法器的电路图library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mult_top isport(Clk : in std_logic ;Start : in std_logic;Data_a : in std_logic_vector(15 downto 0);Data_b : in std_logic_vector(15 downto 0);t_shift : out std_logic;t_en_sig : out std_logic;t_out : out std_logic;tt_data : out std_logic_vector(31 downto 0);Data_o : out std_logic_vector(31 downto 0));end entity;architecture rlt_mult_top of mult_top is component cont_modu isport(Clk : in std_logic ;Start : in std_logic;en_sig : out std_logic;out_sig : out std_logic);end component;signal en_sig : std_logic;signal out_sig : std_logic;component data_path isport(Clk : in std_logic;Data_a : in std_logic_vector(15 downto 0);Start : in std_logic;en_sig : in std_logic;shift : out std_logic);end component;signal shift : std_logic;component add_path isport(Clk : in std_logic;Data_b : in std_logic_vector(15 downto 0);over_sig : in std_logic;Start_sig : in std_logic;en_sig : in std_logic;shift : in std_logic;tt_data : out std_logic_vector(31 downto 0);data_o : out std_logic_vector(31 downto 0));end component;begint_shift <= shift;t_en_sig <= en_sig;t_out <= out_sig;这里面全是顶层模块的调用,这个看不懂,就看书就是一个端口的例化过程cont_U : cont_moduport map (Clk => Clk,Start => Start,en_sig => en_sig,out_sig => out_sig);data_U : data_pathport map(Clk => Clk,Data_a => Data_a,Start => Start,en_sig => en_sig,shift => shift);add_U : add_pathport map (Clk => Clk,Data_b => Data_b,over_sig => out_sig,Start_sig => Start,en_sig => en_sig,shift => shift,tt_data => tt_data,data_o => Data_o);end rlt_mult_top;仿真图分析:当输入数据5,15时输出为75。