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

合集下载

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点阵_列选_显示

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设计十六路彩灯控制器程序仿真图报告

用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位全加器

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-实验

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位加法器设计参数:*输入两个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 设计

[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 用来说明连接各个原件之间的信号类型。

16位乘法器

16位乘法器

乘法器是众多数字系统中的基本模块。

从原理上说它属于组合逻辑范畴;但从工程实际设计上来说,它往往会利用时序逻辑设计的方法来实现,属于时序逻辑范畴。

通过这个实验使大家能够掌握利用FPGA/CPLD设计乘法器的思想,并且能够将我们设计的乘法器应用到实际工程中。

下面我们分别列举了十进制乘法运算和二进制乘法运算的例子。

下面这种计算乘法的方式是大家非常熟悉的:乘积项与乘数相应位对齐(即将乘积项左移),加法运算的数据宽度与被乘数的数据位宽相同。

下面例子中的被乘数和乘数都是无符号的整数,对于有符号数的乘法,可以将符号与数据绝对值分开处理,即绝对值相乘,符号异或。

乘法器的设计方法有两种:组合逻辑设计方法和时序逻辑设计方法。

采用组合逻辑设计方法,电路事先将所有的乘积项全部计算出来,最后加法运算。

采用时序逻辑设计方法,电路将部分已经得到的乘积结果右移,然后与乘积项相加并保存和值,反复迭代上述步骤直到计算出最终乘积。

在本次实验中我们就利用时序逻辑设计方法来设计一个16位乘法器,既然是利用时序逻辑设计方法那么我们就得利用时钟信号控制乘法器运算,那么这样用时序逻辑设计方法与用组合逻辑设计方法比较,它有什么好处呢?利用时序逻辑设计方法可以使整体设计具备流水线结构的特征,能适用在实际工程设计中。

IO口定义:clk:芯片的时钟信号。

rst_n:低电平复位、清零信号。

定义为0表示芯片复位;定义为1表示复位信号无效。

start: 芯片使能信号。

定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。

ain:输入a(被乘数),其数据位宽为16bit.bin:输入b(乘数),其数据位宽为16bit.yout:乘积输出,其数据位宽为32bit.done:芯片输出标志信号。

定义为1表示乘法运算完成,yout端口的数据稳定,得到最终的乘积;定义为0表示乘法运算未完成,yout端口的数据不稳定。

数据吞吐量的计算:数据吞吐量使指芯片在一定时钟频率条件下所能处理的有效数据量。

VHDL-16

VHDL-16

组合运算电路的结构设计: 组合运算电路的结构设计:基本单元 从基本逻辑运算考虑, 从基本逻辑运算考虑,运算电路的基本逻辑 单元为半加器和全加器; 单元为半加器和全加器;这些逻辑单元可以 用简单赋值语句实现. 用简单赋值语句实现. 半加器: 半加器:s <= a xor b; c0 <= a and b; 全加器: 全加器:s <= a xor b xor ci; c0 <= (a and b) or (a and ci) or (b and ci);
组合运算模块的VHDL设计 组合运算模块的VHDL设计 VHDL
在硬件逻辑电路中, 在硬件逻辑电路中,实际面对的数据对象总 是逻辑量,能够直接形成的运算是逻辑运算. 是逻辑量,能够直接形成的运算是逻辑运算.
算术运算可以看作是一种抽象的行为描述. 算术运算可以看作是一种抽象的行为描述. 组合运算电路主要包括加法器(adder) 组合运算电路主要包括加法器(adder)和 乘法器(multipliers). 乘法器(multipliers).
组合运算模块的行为设计
entity fir4 is port (x0,x1,x2,x3: in integer; h0,h1,h2,h3: in integer; y: out integer); end fir4; architecture beh of fir4 is begin y<=x3*h0+x2*h1+x1*h2+x0*h3; end beh; 综合结果:需要使用 综合结果:需要使用15800个LUT ! 个
组合运算模块的行为设计
直接利用VHDL中的加法运算和乘法运算可以 直接利用VHDL中的加法运算和乘法运算可以 VHDL integer类型的数据进行运算 类型的数据进行运算. 对integer类型的数据进行运算. 一个4抽头的FIR滤波器的直接实现. FIR滤波器的直接实现 例:一个4抽头的FIR滤波器的直接实现.

利用VHDL设计乘法器

利用VHDL设计乘法器

在计算机结构里加,减,乘,除是常被用到的运算,本文提出以非常高速积体电路硬体描述语言(VHDL)来描述硬体,说明如何将两个运算元作相乘的运算。

我们首先以无号数整数做乘法运算来说明其原理,设计其电路结构。

其实在VHDL 程式中,我们更可以载入STD_LOGIC_ARITH与STD_LOGIC_UNSIGNED元件盒之后,直接进行乘法运算,既简单又容易扩充。

最后,我们将以4-bit X 4-bit的例子来做电路描述、电路合成、电路模拟并以七段显示器将其结果显示出来。

关键字:非常高速积体电路硬体描述语言、电路描述、电路合成、电路模拟Abstract We have known operation that perform addition, subtraction, multiplication, and division. In this paper we are presented primarily to describe hardware using by VHDL. We can explain how multiplication may be performed for two operand. Multiplication of unsigned numbers illustrates the main issues involved in the design of multiplier circuit. In fact, after the STD_LOGIC_ARITH and STD_LOGIC_UNSIGNED packages were added to the VHDL program, it became not only simple but also easy to extended. Next, consider a 4 x 4 example to circuit description, circuit synthesis, and circuit simulation by using VHDL. Finally, this approach can also be displayed by 7-segment.Keyword : VHDL , circuit description , circuit synthesis, circuit simulation利用VHDL 设计乘法器一.简介VHDL是V ery High Speed Integrated Circuit Hardware Description Language 的英文缩写。

16位(8x8)硬件乘法器设计报告

16位(8x8)硬件乘法器设计报告

EDA课程设计16位(8x8)硬件乘法器设计学校:华侨大学学院:信息与工程学院班级:10集成姓名:项传煜学号:1015251031老师:凌朝东目录摘要一.设计要求二.正文2.1. 系统设计2.1.1 系统设计方案 (3)2.1.2 系统设计原理 (4)2.2. 各子模块设计2.2.1 十进制加计数器设计 (5)2.2.2 BCD码转二进制码BCD_B的设计 (5)2.2.3 8位移位寄存器reg_8的设计 (6)2.2.4 8位加法器adder_8的设计 (7)2.2.5 1位乘法器multi_1的设计 (7)2.2.6 16位移位寄存器reg_16的设计 (8)2.2.7 16位二进制转BCD码B_BCD的设计 (9)2.3. 软件设计2.3.1 设计平台和开发工具 (10)2.3.2 程序流程方框图 (10)2.3.3 实现功能 (11)2.3.4 8位乘法器的顶层设计 (11)2.4. 系统测试2.4.1 乘法器使用 (13)2.4.2 仪器设备 (13)2.4.3 测试数据 (14)2.5. 结论 (14)三.测试结果仿真图 (14)四.参考文献 (15)五.附录:设计说明书及使用说明书 (15)摘要本设计通过对一个8×8的二进制乘法器的设计,学习利用VHDL语言来描述简单的算法,掌握利用移位相加方法实现乘法运算的基本原理。

在此次设计中该乘法器是由十进制计数器,BCD码(输入)转二进制码,8位寄存器,8位加法器,16位寄存器,8x1乘法器,二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。

设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。

基于VHDL语言的16阶线性相位滤波器设计

基于VHDL语言的16阶线性相位滤波器设计

基于VHDL 语言的16阶线性相位滤波器设计(一)设计要求及设计原理设计一个16阶低通FIR 滤波器,采样频率s F =80KHz ,截止频率c F =10KHz ,输入输出皆为10位带符号数。

(1) FIR 滤波器的基本原理FIR 滤波器的I/O 关系如下:∑=-=*=Nk k n h k x n h n x n y 0][][][][][其中,][n x 、][n y 分别为输入输出序列。

N 为滤波器的阶数。

当冲击响应满足()()n N h n h --=1时,FIR 滤波器具有对称结构,即为线性相位滤波器。

(2) 偶数阶线性相位滤波器的网络结构(3) 16阶线性相位滤波器的原理图根据偶数阶线性相位滤波器的网络结构就能很容易得到16阶线性相位滤波器的原理图,如下:(4)滤波器系数的获得在Response Type 中选择Lowpass ,在Design Method 中选FIR Window ,因为是16阶的滤波器,所以在Specify order 中输入15,采样频率s F 设为80KHz ,截止频率c F 设为10KHz 。

Kaiser 窗口,Beta 为0.5。

参数输入完毕点击Design Filter 即完成滤波器参数设置。

点击即可获得滤波器的系数,如下图:在MATLAB 里面对所有数乘以2^11,即可得到各个乘法系数滤波器系数分别为:31)3(-h,54)4(=h,=h,70=)0(-)2(-=h,88h,106=)1(-)7(=h。

h,499239)6(=)5(=h,401(二)模块电路设计设计的滤波器由17个VHDL文件和一个总体BDF文件组成。

VHDL文件所包含的模块有三种:寄存器、加法器和乘法器。

(1)寄存器1 寄存器原理及功能寄存器用于寄存一组二进制代码,由15个D触发器组成。

每个D触发器具有时钟输入端、复位端、一个10位数据输入端和一个10位数据输出端。

触发器在复位端为高电平时全部清零。

16位双译码器的VHDL实现

16位双译码器的VHDL实现

16位双译码器的VHDL实现软件:Quartus ii 8.1设计思路:先设计一个2-4译码器,在2-4译码器的基础上设计一个8-256双译码器,然后在8-256双译码器的基础上设计出16-65536双译码器。

双译码器需要与门阵列,而且与门阵列的设计才是此次设计的难点。

为简化设计,与门阵列单独设计,本文先设计了4*4的与门阵列,然后将4*4的与门阵列扩展成4*16的与门阵列,然后又将4*16的与门阵列扩展成16*16的与门阵列,然后又将16*16的与门阵列扩展成了16*256的与门阵列,最后又将16*256的与门阵列扩展成了256*256的与门阵列。

首先,先设计一个2-4译码器,代码如下:library ieee;use ieee.std_logic_1164.all;entity decoder2to4 isport(en:in std_logic;x:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end decoder2to4;architecture rtl of decoder2to4 isbeginprocess(en,x)beginif(en='1')thencase x iswhen "00" => y<="0001";when "01" => y<="0010";when "10" => y<="0100";when "11" => y<="1000";when others => y<="0000";end case;elsey<="0000";end if;end process;end rtl;由2-4译码器扩展得到4-16双译码器需要用到4*4的与门阵列,所以需要设计一个4*4的与门阵列,代码如下:library ieee;use ieee.std_logic_1164.all;entity and4mul4 isport(x:in std_logic_vector(3 downto 0);y:in std_logic_vector(3 downto 0);z:out std_logic_vector(15 downto 0));end and4mul4;architecture structure of and4mul4 is component and2to1port(a,b: in std_logic;y: out std_logic);end component;beging1:for i in 3 downto 0 generateu1:and2to1 port map (x(0),y(i),z(i));end generate;g2:for i in 3 downto 0 generateu2:and2to1 port map (x(1),y(i),z(4+i));end generate;g3:for i in 3 downto 0 generateu3:and2to1 port map (x(2),y(i),z(8+i));end generate;g4:for i in 3 downto 0 generateu4:and2to1 port map (x(3),y(i),z(12+i));end generate;end structure;其中,与门and2to1的代码如下:library ieee;use ieee.std_logic_1164.all;entity and2to1 isport(a,b: in std_logic;y: out std_logic);end and2to1;architecture rtl of and2to1 isbeginprocess(a,b)variable comb : std_logic_vector(1 downto 0);begincomb := a & b;case comb iswhen "00" => y <= '0';when "01" => y <= '0';when "10" => y <= '0';when "11" => y <= '1';when others => y <= 'X';end case;end process;end rtl;由2-4译码器及4*4的与门阵列,扩展成4-16双译码器,代码如下:library ieee;use ieee.std_logic_1164.all;entity dec4to16 isport(en:in std_logic;x:in std_logic_vector(1 downto 0);y:in std_logic_vector(1 downto 0);z:out std_logic_vector(15 downto 0));end dec4to16;architecture structure of dec4to16 iscomponent decoder2to4port(en:in std_logic;x:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end component;component and4mul4port(x:in std_logic_vector(3 downto 0);y:in std_logic_vector(3 downto 0);z:out std_logic_vector(15 downto 0));end component;signal c1:std_logic_vector(3 downto 0);signal c2:std_logic_vector(3 downto 0);beginu1:decoder2to4 port map(en,x,c1);u2:decoder2to4 port map(en,y,c2);u3:and4mul4 port map(c1,c2,z);end structure;然后,为了将4-16双译码器扩展成8-256双译码器,需要16*16的与门阵列。

16位ALUVHDL实现源程序

16位ALUVHDL实现源程序

思考题:编写十六位运算器的VHDL程序——MYALU实验任务:用CPT16 的扩展实验板上的开关K3 、K2、K1、K0做为输入、八段数码管LED0..LED3做为输出,用VHDL语言编写程序,下载到EP1C6中,实现十六位模型机的MY ALU 功能见下表。

实验说明:在MY ALU.VHD程序设计中,定义A 为16位累加器,其值由K3 、K2 两组开关输入;W 为16位工作寄存器,其值由K1、K0 两组开关共输入;S2、S1、S0 为运算功能控制位,接在K4开关的第2、1、0个开关上,根据S2、S1、S0 的不同,MY ALU 实现不同功能D为运算结果输出,显示在四位八段管LED3..LED0上;CIn 为进位输入,由K4 开关组的第3 个开关输入;COut 为进位输出,用发光二极管L0 显示其状态。

逻辑功能:library ieee; ------库程序包调用use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity asanxia is ------实体:电路外观配置port(inA : IN UNSIGNED(15 DOWNTO 0); -- K3, K2 inAinW : IN UNSIGNED(15 DOWNTO 0); -- K1, K0 inWoutLED : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); -- LED3~LED0 outLEDinC : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --Control Input inCCin:IN STD_LOGIC; --C Input k4.3 CinCout: OUT STD_LOGIC -- C Output L0 Cout);end asanxia;architecture arch of asanxia is ------结构体:电路功能描述--中间变量signal c:std_logic_vector(15 downto 0); --暂存进位信号signal q:UNSIGNED(15 downto 0); --暂存各位数值beginprocess(inC,inA,inW,Cin)begincase inC iswhen "000"=> ------加法:A+B ;A+B+1q(0)<=inA(0)xor inW(0)xor Cin;c(0)<=(inA(0) and inW(0))or (inW(0)and Cin)or (inA(0)and Cin);--inA(0),inW(0),Cin有两个以上为1即产生进位。

基于VHDL的简易16位模型机设计与实现

基于VHDL的简易16位模型机设计与实现

基于VHDL 的简易16位模型机设计与实现收稿日期:2017-09-18基金项目:南昌航空大学教改资助项目(“计算机组成与结构”创新创业教育课程培育项目,KCPY1518)作者简介:张胜(1968-),男(汉族),湖北罗田人,南昌航空大学,博士,副教授,研究方向:无线传感器网络、人工智能、数据挖掘、GPS/GIS 等。

近年来,随着电子设计自动化技术的不断发展,基于现场可编程(FPGA )技术设计嵌入式CPU 突破了原有的技术瓶颈,使产品的开发周期大为缩短,性价比也大幅提高。

特别是随着硬件描述语言(VHDL )综合工具功能和性能的提高,计算机中许多重要的元器件,甚至是整个CPU 都用硬件描述语言来设计和表达,形成了所谓的单片系统———SOC 和SOPC 。

本文是计算机组成原理课程中综合实验的内容之一,以计算机基本组成和原理为基础,利用EDA 中的VHDL 技术在Cyclone Ⅱ系列的FPGA 芯片上设计、实现一个16位模型计算机,主要侧重于CPU 设计,要求能够实现加减乘除算术运算、与或非逻辑运算以及左右移运算等基本功能。

一、模型机的硬件设计简易16位模型机模块设计如图1所示,包括的部件有存储器(RAM )、内存缓存寄存器(MBR )、内存地址寄存器(MAR )、控制器(CU )、程序计数器(PC )、指令寄存器(IR )、缓冲寄存器(BR )、累加器(ACC )、乘法寄存器(MR )和运算器(ALU )。

图中带箭头的粗线表示模型机的数据流,带箭头的细线表示模型机中的控制信息(CS )。

系统将累加器和乘法寄存器一并设计在运算器中。

张胜,李方云,曹家庆(南昌航空大学信息工程学院,江西南昌330063)摘要:在QuartusII6.0的IDE 环境下利用VHDL 技术设计并实现了一个基于Cyclone Ⅱ系列的FPGA 芯片的16位模型机,能够实现加减乘除算术运算、与或非逻辑运算以及进行算术左右移运算。

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

LCD1602显示源程序如下:module lcd1602(input clk, //60Minput rst_n,output lcd_p, //Backlight Source + lcd屏幕背光output lcd_n, //Backlight Source -output reg lcd_rs, //0:write order; 1:write dataoutput lcd_rw, //0:write data; 1:read dataoutput reg lcd_en, //negedge 在lcd_en下降沿需保证数据有效output reg [7:0] lcd_data);mux16mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done));//端口名称关联//--------------------lcd1602 order----------------------------parameter Mode_Set = 8'h31, //功能设置,Cursor_Set = 8'h0c, //光标设置Address_Set = 8'h06, //输入模式设置Clear_Set = 8'h01; //清屏设置/****************************LCD1602 Display Data****************************/ wire [7:0] data_r0,data_r1,data_r2; //乘数、被乘数wire [15:0]data0,data1; //结果显示wire [31:0]data2;wire [7:0] addr; //write addresswire start,done;assign data_r0 = 8'h30 + data0[7:0] ; // 8'h30在LCD1602上显示值为0。

VHDL加法器与乘法器

VHDL加法器与乘法器
多位加法器设计
串行进位加法器( 串行进位加法器(CRA) )
A0 B0 A1 B1 A2 B2 A3 B3
CI S
A
B CO
CI S
A
B CO
CI S
A
B CO
CI S
A
B CO
S0
S1
S2
S3
CO
设计方法:原理图、元件例化; 函数表达式
多位加法器设计
选择进位加法器( 选择进位加法器(CSLA) )
移位相加乘法器
BEGIN IF ST = '1' THEN -REGA := "00000000" & A; REGB := B; RESULT <= (OTHERS => '0'); SOUT <= '0'; REGRES := (OTHERS => '0'); CNT := (OTHERS => '0'); ELSIF CLK'EVENT AND CLK='1' THEN -IF REGB(0)='1' THEN -REGRES := REGRES + REGA; END IF; REGA(15 DOWNTO 1) := REGA(14 DOWNTO 0); -REGA(0):= '0'; -REGB(6 DOWNTO 0) := REGB(7 DOWNTO 1); -CNT := CNT + 1; -IF CNT="000" THEN -RESULT <= REGRES; -SOUT <= '1'; REGA := "00000000" & A; REGB := B;-REGRES := (OTHERS => '0'); -END IF; END IF; END PROCESS; END ARCHITECTURE; 初始化, 初始化,置位

用verilog编写16位加法器乘法器自动售货机

用verilog编写16位加法器乘法器自动售货机

Verilog课程实验报告实验1十六位超前进位加法器系统设计要求用超前进位加法器实现一个有符号位的16位加法器,并且考虑溢出的情况详细设计根据超前进位加法器的原理Co = G | ( P & Ci ) S = P ^ Ci 设计出4位加法器的子模块,然后通过4个4位加法器的相连来得到十六位的加法器。

原理如下图所示。

溢出用flag=0表示。

F A F A F A F AP 0G 1P 0G1P 2G2P 3G 3C o ,3C o ,2Co ,1Co ,0C i ,0F A F A F A F AP 0G1P 0G1P 2G2P 3G 3Co ,2C o ,1Co ,0C i,0C o ,3M u l t i p l e x e rB P =P o P 1P 2P 3Id e a : If (P 0 a n d P 1 a n d P 2 a n d P 3 = 1)th e n C o 3 = C 0, e ls e “k ill” o r “g e n e r a te ”.程序"module sixteenaddertest;wire [15:0] s;reg [15:0]a,b;wire flag;parameter times=5;a=-10743,,b==11372没有溢出,sto=0.通过这个实验验证了s=a+b,实现了带符号位的加法器。

实验二十六位加减法器系统设计要求将加法器和减法器结合到一起,实现带符号位的16位加减法运算,并考虑溢出。

详细设计在16位加法器的基础上,加上一条判断语句,如果出现减的操作,被减数取反加一,这样就实现了减的运算,用add_sub来表示加减运算符,当add_sub=0时候实现的是减运算,add_sub=1的时候实现的是加运算。

程序"module adder_sub_test;wire [15:0] s;reg [15:0]a,b;reg add_sub;wire flag;initial当a=-4659 b=12817 add_sub=0,减操作,输出s=-17476,无溢出,flag=0.当a=562 b=-24223 add_sub=1,加操作,输出s=-23661,无溢出,flag=0.通过以上的结果分析,此程序实现了带符号位的加减法的功能。

十六进制eda程序设计仿真原理图

十六进制eda程序设计仿真原理图

十六进制7段数码显示译码器设计实验目的:学习7段数码显示译码器的VHDL设计和硬件验证。

实验内容:将设计好的VHDL译码器程序在QuartusII上进行编辑,编译,综合,适配,仿真,给出其所有信号的时序仿真波形。

提示:设仿真激励信号是用输入总线的方式给出输入信号仿真数据。

仿真原理图7段译码器真值表编译码程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY smq7s ISPORT(A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END;ARCHITECTURE ONE OF DECL7S ISBEGINPROCESS(A)BEGINCASE A ISWHEN"0000"=> LED7S <="0111111"; WHEN"0001"=> LED7S <="0000110"; WHEN"0010"=> LED7S <="1011011"; WHEN"0011"=> LED7S <="1001111"; WHEN"0100"=> LED7S <="1100110"; WHEN"0101"=> LED7S <="1101101"; WHEN"0110"=> LED7S <="1111101"; WHEN"0111"=> LED7S <="0000111"; WHEN"1000"=> LED7S <="1111111"; WHEN"1001"=> LED7S <="1101111"; WHEN"1010"=> LED7S <="1110111"; WHEN"1011"=> LED7S <="1111100"; WHEN"1100"=> LED7S <="0111001"; WHEN"1101"=> LED7S <="1011110"; WHEN"1110"=> LED7S <="1111001"; WHEN"1111"=> LED7S <="1110001";WHEN OTHERS=> NULL;END CASE;END PROCESS;END;实验原理图:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档