移位相加乘法器
- 格式:doc
- 大小:12.50 KB
- 文档页数:1
实验报告
一、实验目的
通过设计8位乘法器,进一步掌握VHDL语言的设计P182 二、实验内容
设计移位相加硬件乘法器
三、实验环境
计算机、QuartusII软件
四、实验步骤
(1)子模块SREG8BT程序
功能描述:将乘数A的八位依次用QB输出。
(2)子模块AND8B程序
功能描述:如果子模块(1)输出的一位乘数是‘1’,即ABIN=‘1’时,输出DOUT为被乘数B,否则输出0.
(3)子模块ADDER8BT程序
(4)子模块REGSHT程序
(5)综合电路:
仿真结果:
五、实验结果与讨论
子模块SEG8BT的功能是依次由QB输出乘数的每一位;子模块AND8B 的功能是判断由QB输出的是‘1’还是‘0’,如果是‘1’则DOUT输出被乘数,否则输出0;子模块ADDER8BT的功能则是带有进位信号S 【8】的全加器;子模块RGSHT的功能是进行移位,锁存。
六、总结
综合电路实现了8位移位相加乘法器的功能;之前自己写了一个只有一个模块的8位乘法器,但实现不了。
代码如下。
乘法器的verilog实现(并⾏、移位相加、查找表)并⾏乘法器,也就是⽤乘法运算符实现,下⾯的代码实现8bit⽆符号数的乘法。
代码:1module mult_parrell(rst_n,2 clk,3 a,4 b,5 p6 );7parameter DATA_SIZE = 8;89input rst_n;10input clk;11input [DATA_SIZE - 1 : 0] a;12input [DATA_SIZE - 1 : 0] b;1314output [2*DATA_SIZE - 1 : 0] p;1516reg [DATA_SIZE - 1 : 0] a_r;17reg [DATA_SIZE - 1 : 0] b_r;1819wire [2*DATA_SIZE - 1 : 0] p_tmp;20reg [2*DATA_SIZE - 1 : 0] p;2122//输⼊数据打⼀拍23always@(posedge clk)24if(!rst_n)25begin26 a_r <= 8'd0;27 b_r <= 8'd0;28end29else30begin31 a_r <= a;32 b_r <= b;33end3435assign p_tmp = a*b; //只能做⽆符号数的相乘,若要做有符号数乘法,需将数据声明为signed类型3637//输出数据打⼀拍38always@(posedge clk)39if(!rst_n)40begin41 p <= 16'd0;42end43else44begin45 p <= p_tmp;46end4748endmodule移位相加乘法器,下⾯的代码可实现8bit有符号数的相乘,注意符号扩展以及MSB位的处理://输⼊数据取反assign a_r_inv = ~a_r + 1;assign a_shift0 = b_r[0] ? {{8{a_r[7]}},a_r} : 0;assign a_shift1 = b_r[1] ? {{7{a_r[7]}},a_r,1'b0} : 0;assign a_shift2 = b_r[2] ? {{6{a_r[7]}},a_r,2'b0} : 0;assign a_shift3 = b_r[3] ? {{5{a_r[7]}},a_r,3'b0} : 0;assign a_shift4 = b_r[4] ? {{4{a_r[7]}},a_r,4'b0} : 0;assign a_shift5 = b_r[5] ? {{3{a_r[7]}},a_r,5'b0} : 0;assign a_shift6 = b_r[6] ? {{2{a_r[7]}},a_r,6'b0} : 0;assign a_shift7 = b_r[7] ? {{1{a_r_inv[7]}},a_r_inv,7'b0} : 0; //被乘数为⽆符号数时,特别处理代码:1module mult_shift_add(rst_n,2 clk,3 a,4 b,5 p6 );7parameter DATA_SIZE = 8;89input rst_n;10input clk;11input [DATA_SIZE - 1 : 0] a;12input [DATA_SIZE - 1 : 0] b;1314output [2*DATA_SIZE - 2 : 0] p;1516//输⼊数据打⼀个时钟节拍17reg [DATA_SIZE - 1 : 0] a_r;18reg [DATA_SIZE - 1 : 0] b_r;1920//输⼊数据取反21wire [DATA_SIZE - 1 : 0] a_r_inv;2223//输⼊数据移位24wire [2*DATA_SIZE - 1 : 0] a_shift0;25wire [2*DATA_SIZE - 1 : 0] a_shift1;26wire [2*DATA_SIZE - 1 : 0] a_shift2;27wire [2*DATA_SIZE - 1 : 0] a_shift3;28wire [2*DATA_SIZE - 1 : 0] a_shift4;29wire [2*DATA_SIZE - 1 : 0] a_shift5;30wire [2*DATA_SIZE - 1 : 0] a_shift6;31wire [2*DATA_SIZE - 1 : 0] a_shift7;3233//输出数据打⼀个时钟节拍34wire [2*DATA_SIZE - 1 : 0] p_tmp;35reg [2*DATA_SIZE - 1 : 0] p;3637//输⼊数据打⼀个时钟节拍38always@(posedge clk)39if(!rst_n)40begin41 a_r <= 8'd0;42 b_r <= 8'd0;43end44else45begin46 a_r <= a;47 b_r <= b;48end49//输⼊数据取反50assign a_r_inv = ~a_r + 1;5152//输⼊数据移位,注意符号扩展,不仅仅是最⾼位扩展53//对每⼀个bit都需扩展54assign a_shift0 = b_r[0] ? {{8{a_r[7]}},a_r} : 0;55assign a_shift1 = b_r[1] ? {{7{a_r[7]}},a_r,1'b0} : 0;56assign a_shift2 = b_r[2] ? {{6{a_r[7]}},a_r,2'b0} : 0;57assign a_shift3 = b_r[3] ? {{5{a_r[7]}},a_r,3'b0} : 0;58assign a_shift4 = b_r[4] ? {{4{a_r[7]}},a_r,4'b0} : 0;59assign a_shift5 = b_r[5] ? {{3{a_r[7]}},a_r,5'b0} : 0;60assign a_shift6 = b_r[6] ? {{2{a_r[7]}},a_r,6'b0} : 0;61assign a_shift7 = b_r[7] ? {{1{a_r_inv[7]}},a_r_inv,7'b0} : 0; //被乘数为⽆符号数时,特别处理6263assign p_tmp = a_shift0 + a_shift1 + a_shift2 + a_shift3 + a_shift464 + a_shift5 + a_shift6 + a_shift7;6566always@(posedge clk)67if(!rst_n)68begin69//p <= 16'd0;70 p <= 15'd0;71end72else73begin74//p <= p_tmp[15:0];75 p <= p_tmp[14:0];76end7778endmoduletestbench:1module mult_shift_add_tb;23// Inputs4reg rst_n;5reg clk;6reg [7:0] a;7reg [7:0] b;89// Outputs10wire [14:0] p;1112// Instantiate the Unit Under Test (UUT)13 mult_shift_add uut (14 .rst_n(rst_n),15 .clk(clk),16 .a(a),17 .b(b),18 .p(p)19 );2021parameter CLK_PERIOD = 10;2223initial begin24 rst_n = 0;25 clk = 0;2627 #100;28 rst_n = 1;29end3031always #(CLK_PERIOD/2) clk = ~clk;3233always@(posedge clk)34if(!rst_n)35begin36 a = 8'd0;37 b = 8'd0;38end39else40begin41 a = a + 1;42 b = b - 1;43end4445endmoduleISIM仿真结果:移位相加乘法器树:将assign p_tmp = a_shift0 + a_shift1 + a_shift2 + a_shift3 + a_shift4 + a_shift5 + a_shift6 + a_shift7;换为:assign sum_01 = a_shift0 + a_shift1;assign sum_23 = a_shift2 + a_shift3;assign sum_45 = a_shift4 + a_shift5;assign sum_67 = a_shift6 + a_shift7;assign sum_0123 = sum_01 + sum_23;assign sum_4567 = sum_45 + sum_67;assign p_tmp = sum_0123 + sum_4567;就成为乘法器树。
移位乘法器的设计一.设计要求。
乘法器的输入为两个四位二进制数a 和b ,闸门信号STB 启动乘法操作,时钟信号提供系统定时。
乘法结果为8位二进制信号RESULT, 乘法结束后置信号DONE 为1。
框图如下:二.算法思路如下:采用原码移位算法,即对两操作数进行逐位的移位相加,迭代四次后获得乘法结果。
1. 在被乘数和乘数的高位补0后扩展成8位。
2. 乘数依次向右移位,并检查其最低位,如果该位为1,则将被乘数与部分积的和相加,然后被乘数向左端移位;如果最低位为0,则仅仅对被乘数进行移位操作。
移位时,乘数的高端和被乘数的低端都移入0。
3. 当乘数变成全0后,乘法结束。
三. 模块划分和进程设计:把乘法器电路映射为控制器进程CONTROLLER、锁存移位进程SRA和SRB、加法进程ADDER以及锁存结果的进程ACC。
四. 移位乘法器的进程模块图五. 按照书本上的代码仿真后的波形如下:得出的是错误的结果。
经分析,可知道是由于在第三周期是shift 的值出现错误,才导致结果错误。
为此修改源代码。
如下(红色为修改的部分):library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shift_mul isport (a,b :in std_logic_vector(3 downto 0);stb,clk :in std_logic;done :out std_logic;result :out std_logic_vector(7 downto 0));end shift_mul;architecture behav of shift_mul issignal init,shift,stop,add :std_logic;signal sraa,srbb,accout,addout:std_logic_vector(7 downto 0); begincontroller :processbeginwait until clk'event and clk='1' and stb='1';done<='0';init<='1';shift<='0';add<='0';result<="00000000";wait until clk'event and clk='1';init<='0';wait until clk'event and clk='1';wait until clk'event and clk='1';run_loop: while (stop/='1') loopwait until clk'event and clk='1';if sraa(0)='1' thenwait until clk'event and clk='1';add<='1';wait until clk'event and clk='1';add<='0';shift<='1';wait until clk'event and clk='1';elsewait until clk'event and clk='1';shift<='1';wait until clk'event and clk='1';end if;shift<='0';end loop run_loop;done<='1'; result<=accout;end process controller;sral:processbeginwait until clk'event and clk='1';if init='1'thensraa<="0000"&a;elsif shift='1'thensraa<='0'&sraa(7 downto 1);end if;stop<=not (sraa(3) or sraa(2) or sraa(1) or sraa(0) );end process sral;srar:processbeginwait until clk'event and clk='1';if init='1'thensrbb<="0000"&b;elsif shift='1'thensrbb<=srbb(6 downto 0)&'0';end if;end process srar;adder: process(accout,srbb)variable sum,tmp1,tmp2:std_logic_vector(7 downto 0);variable carry:std_logic;begintmp1:=accout;tmp2:=srbb;carry:='0';for I in 0 to 7 loopsum(I):=tmp1(I) xor tmp2(I) xor carry;carry:=(tmp1(I) and tmp2(I)) or (tmp1(I) and carry) or (tmp2(I) and carry);end loop;addout<=sum;end process adder;acc:processbeginwait until clk'event and clk='1';if init='1' thenaccout<=(others =>'0');elsif add='1' thenaccout<=addout;end if;end process acc;end behav;七。
基于FPGA的8位移位相加型硬件乘法器的设计作者:张建妮来源:《智能计算机与应用》2014年第04期摘要:乘法器是数字信号处理中非常重要的模块。
本文首先介绍了硬件乘法器的原理,在此基础上提出了硬件乘法器的设计方法,最后再利用EDA技术,在FPGA开发平台上,通过VHDL编程和图形输入对其进行了实现,具有实用性强、性价比高、可操作性强等优点。
关键词:硬件乘法器;加法器; VHDL中图分类号:TP2 文献标识码:A文章编号:2095-2163(2014)04-0087-04Abstract:Multiplier is very important in digital signal processing module. In this paper, the principle of the hardware multiplier is introduced at first. Based on it, a design method is put forward.Finally , using EDA technology,the hardware -multiplier is implemented through VHDL programming combining with the input mode of schematic diagram on the FPGA development platform. The design has strong practicability ,high cost-effective, strong operability, etc.Key words:Hardware-Multiplier; Adder; VHDL0引言在数字信号处理中,经常会遇到卷积、数字滤波、FFT等运算,而在这些运算中则存在大量类似ΣA(k)B(n-k)的算法过程。
因此,乘法器是数字信号处理中必不可少的一个模块。
沈阳工程学院课程设计设计题目:乘法器系别自控系班级测控本082班学生姓名吴唯科学号 2008310211指导教师黄硕/于源职称讲师/讲师起止日期:2010 年 8 月 30 日起——至 2010 年 9 月 3 日止沈阳工程学院课程设计任务书课程设计题目:乘法器系别自控系班级测控本082班学生姓名吴唯科学号 2008310211指导教师黄硕/于源职称讲师/讲师课程设计进行地点: B426任务下达时间: 2010 年 8 月 28 日起止日期: 2010年8月30日起——至2010年9月3日止教研室主任秦宏 2010年 8 月 28 日批准乘法器1 设计主要内容及要求:1.1 设计目的:(1)掌握乘法器的构成、原理与设计方法;(2)熟悉集成电路的使用方法。
1.2 基本要求:(1)设计一个3bit二进制数的乘法器,乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全0相加,直至被乘数的最高位;(2)掌握虚拟仪器——字信号发生器——用以检验电路;(3)设计加法运算电路;(4)设计BCD码转换以及显示电路;1.3 发挥部分:(1)拓展4bit;(2)其他。
2 设计过程及论文的基本要求:2.1 设计过程的基本要求:(1)基本部分必须完成,发挥部分可任选2个方向:(2)符合设计要求的报告一份,其中包括逻辑电路图、实际接线图各一份;(3)设计过程的资料、草稿要求保留并随设计报告一起上交;报告的电子档需全班统一存盘上交。
2.2 课程设计论文的基本要求:(1)参照毕业设计论文规范打印,文字中的小图需打印。
项目齐全、不许涂改,不少于3000字。
图纸为A3,附录中的大图可以手绘,所有插图不允许复印。
(2)装订顺序:封面、任务书、成绩评审意见表、中文摘要、关键词、目录、正文(设计题目、设计任务、设计思路、设计框图、各部分电路及参数计算(重要)、工作过程分析、元器件清单、主要器件介绍)、小结、参考文献、附录(逻辑电路图与实际接线图)。
实验五四位移位乘法器一、实验目的1. 学会用层次化设计方法进行逻辑设计;2. 设计一个八位乘法器。
二、实验原理1)乘法器工作原理:四位二进制乘法采用移位相加的方法。
即用乘数的各位数码, 从高位开始依次于被乘数相乘, 每相乘一次得到的积称为部分积, 将第一次得到的部分积左移一位并与第二次得到的部分积相加, 将加得的和左移一位再与第三次得到的部分积相加, 再将相加的结果左移一位与第四次得到的部分积相加,……直到所有的部分积都被加过一次。
最后的结果以十进制的形式通过三个数码管进行显示。
2)设计整体思路:主要分两大模块,乘法器模块和主模块。
第一步:乘法器通过一个function实现,该函数输出为八位二进制数的积;第二步:把八位二进制数转化为三位十进制数,分别为个位、十位、百位,由主模块实现。
第三步:依次选通三个数码管,让这三个数码管分别显示第二步中的个、十、百位,由主模块实现。
3)轮换显示工作原理:因为硬件对数码管的显示控制只有8个管口,所以同一时间只能控制一个数码管的显示。
我们利用视觉暂留的原理,采用一个时钟信号(除lhz以外均可)控制是三个数码管的依次轮换选通,可以达到三个数码管同时显示的视觉效果。
我们采用一个2位的二进制数的累加来选通数码管,同时让数码管显示个、时、百位。
三、思路流程图四、实验流程图注意:时钟clk 给1M Hz六、实验心得1、把八位二进制数转化为三位十进制数,分别为个位、十位、百位:result1=out/100; //求出百位 result3=out%10; //求出个位 result2=(out%100)/10; //求出十位 2、个位、十位、百位必须用三个变量来存储,不能用一个三位的变量来存储,因为要存储的是十进制数,而一个三位的变量中的某一位只能是0或者1,无法表示一个十进制数。
3、看了很多同学的代码后发现大家用了模块调用,在这里我没有用调用,用一个FOR 循环,实现了代码简单。
什么是硬件乘法器导读:我根据大家的需要整理了一份关于《什么是硬件乘法器》的内容,具体内容:硬件乘法器你听过吗?哈哈,我也是最近才听过这个词的。
下面将由我带大家一起来学习学习下吧,希望对大家有所收获!硬件乘法器,其基础就是加法器结构,它已经是现代计算机中必不...硬件乘法器你听过吗?哈哈,我也是最近才听过这个词的。
下面将由我带大家一起来学习学习下吧,希望对大家有所收获!硬件乘法器,其基础就是加法器结构,它已经是现代计算机中必不可少的一部分。
[1] 乘法器的模型就是基于"移位和相加"的算法。
在该算法中,乘法器中每一个比特位都会产生一个局部乘积。
第一个局部乘积由乘法器的LSB产生,第二个乘积由乘法器的第二位产生,以此类推。
如果相应的乘数比特位是1,那么局部乘积就是被乘数的值,如果相应的乘数比特位是0,那么局部乘积全为0。
每次局部乘积都向左移动一位。
乘法器可以用更普遍的方式来表示。
每个输入,局部乘积数,以及结果都被赋予了一个逻辑名称(如A1、A2、B1、B2),而这些名称在电路原理图中就作为了信号名称。
在原理图的乘法例子中比较信号名称,就可以找到乘法电路的行为特性。
在乘法器电路中,乘数中的每一位都要和被乘数的每一位相与,并产生其相应的乘积位。
这些局部乘积要馈入到全加器的阵列中(合适的时候也可以用半加器),同时加法器向左移位并表示出乘法结果。
最后得到的乘积项在CLA电路中相加。
注意,某些全加器电路会将信号带入到进位输入端(用于替代邻近位的进位)。
这就是一种全加器电路的应用;全加器将其输入端的任何三个比特相加。
随着乘数和被乘数位数的增加,乘法器电路中的加法器位树也要相应的增加。
通过研究CLA电路的特性,也可以在乘法器中开发出更快的加法阵列。
DSP中的专用硬件乘法器在DSPs中具有硬件连线逻辑的高速"与或"运算器(乘法器和累加器),取两个操作数到乘法器中进行乘法运算,并将乘积累加到累加器中,这些操作都可以在单个周期内完成。
电子技术课程设计----移位相加8位硬件乘法器电路计学院: 华科学院专业: 通信工程班级:通信052201H姓名: 张茹学号:200522080122指导教师:柴婷婷2007年12月30日一,设计任务与要求--------------------(3)1,内容2,要求二,总体框图---------------------------(3)1,电路的总体框图2,框图的说明3,设计思路4,方案设计三,选择器件与功能模块-----------------(5)1,选择器件各功能模块及功能说明四,功能模块----------------------------(8)1,ADDER8B的模块2,ANDARITH的模块3,ARICTL的模块4,REG16B的模块5,SREG8B的模块五,总体设计电路图----------------------(14)1,总体原理图2,仿真波形图3,管脚分配图4,硬件验证情况六,心得体会--------------------------------------(18)移位相加8位硬件乘法器一.设计任务与要求1.内容: 由8位加法器构成的以时序逻辑方式设计的8位乘法器乘法通过逐向移位加原理来实现,从被乘数的最低位开始,若为1,则乘数左移与上一次和相加;若为0,左移后以全零相加,直至被乘数的最高位。
2.要求: (1) 重点掌握VHDL设计电路模块(2)在掌握8位加法器设计的基础上,进一步掌握8×8位乘法器的设计;(3)进一步学习开发系统,掌握MAX+PLUS II的设计流程。
二.总体框图(电路的总体框图)1,说明:此电路由五部分组成2,它们分别是控制器,锁存器,寄存器,乘法器,加法器。
1控制器是一个乘法器的控制模块,用来接受实验系统上的连续脉冲。
2锁存器起锁存的作用,它可以锁存8位乘数。
3移位寄存器起移位的作用,便于被乘数可以逐位移出。
4乘法器功能类似一个特殊的与非门。
32位乘法器逻辑原理图:
实验原理:乘法可以通过逐渐项相加原理来实现。
从被乘数的最低位开始,若为1则乘数左移后与上一次的和相加;若为0左移后以全零相加,直至被乘数的最高位。
32位移位相加乘法器运算数据时序图:
工作原理:clr信号的上跳沿及其高电平有两个功能,即模块regsht清零和被乘数dina[31.。
0]向移位寄存器shft加载;它的低电平则作为乘法使能信号,clk为乘法时钟信号。
当被乘数加载于32位右移寄存器shft后,随着每一时钟节拍,最低位在前,由低位到高位逐位移出。
当为1时,4位乘法器and32打开,32位乘数din[31..0]在同一节拍进入加法器,与上一次存在regsht的数相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,此and32全零输出。
如此反复,直至32个时钟脉冲后,最后乘积完整出现在regsht端口。