加减乘除是运算的基础,也是我们在小学课堂里的重点必修课。乘除运算虽然对于我们今天来说还是小菜一碟,让计算机做起来也是九牛一毛不足挂齿,但是要真探究一下计算机是如何完乘除运算的,可还真有些学问和技巧,并不是人脑那么9*9一闪而过81出来了,计算机虽然得到结果的时间可能比人要快上不知道多少个数量级,但它怎么说还是需要一个过程的。可能不同的CPU内部的运算原理和机制略有差异,我们也无法完全去把这些运算方式搞清楚,这个例程我们就老老实实的用移位累加的方式完成两个8位无符号数的乘法运算。这里先随便举个例子来说明我们的运算原理,例如8位无符号数189和25相乘。因为计算机只认识0和1,因此一切运算的基础都是0和1,所以我们的运算也必须是基于2进制来进行的。因此,我们首先要完成机制的转换。乘数189对应的2进制数为10111101,被乘数25对应的2进制数为00011001。按照我们最常用的10进制乘法运算的方式,我们可以得到如图1所示的2进制乘法。在这个运算过程中,我们从被乘数的最低位到最高位依次判断其取值是1还是0,如果是1则对乘数累加,否则不累加(即取0),需要累加的乘数根据当前被乘数位需要进行相应的移位,如被乘数的bit3为1,则乘数相应左移3次(即放大8倍)作为累加数。依据此原理,我们要设计的8位无符号乘法也是通过对被乘数进行逐位判断后累加进行左移的乘数而得到最终的结果。
图1 2进制乘法在我们的8位无符号乘法运算中,一些基本的接口信号及其功能为:8位无符号数ain和bin是需要进行运算的两个乘数;输出的结果用16位无符号数yout表示;enable信号为运算使能信号;ready信号为运算完成标志位。用户先给ain和bin赋值,然后将enable信号拉高后即开始运算,大约8个时钟周期后运算输出结果,ready信号输出高电平表示运算结果有效,此后如果enable信号被用户拉低则ready信号也随后拉低,表示完成一次运算。接着用户可以给ain和bin赋新的运算值,然后拉高enable信号继续一次新的运算。Verilog参考实例module mux( clk,rst_n, enable,ain,bin,yout,ready );input clk;input rst_n;input enable; (1)input[7:0] ain; (2)input[7:0] bin; (3)output reg[15:0] yout; (4)output reg ready; (5)reg[4:0] i; (6)always@(posedge clk) if(!rst_n) begin ready <= 1'b0; yout <= 16'h0000; i <= 4'd0; end else if(enable)begin if(i < 4'd8) i <= i+1'b1; else ; if(i < 4'd7) begin (7) ready <= 1'b0; if(ain[i]) yout <= (yout+{1'b0,bin,7'd0})>>1; (8) else yout <= yout>>1; (9) end else if(i == 4'd7) begin (10) if(ain[i]) yout <= yout+{1'b0,bin,7'd0}; (11) else ; (12) ready <= 1'b1; (13) end else ready <= 1'b0; end else begin i <= 4'd0; yout <= 16'h0000; endendmodule
运算使能信号。0表示无 *** 作;1表示将对当前输入的ain和bin进行乘法运算。
8位无符号数,他将和bin进行相乘 *** 作。
8位无符号数,他将和ain进行相乘 *** 作。
16位的无符号数,用于存储2个8位无符号数相乘的运算结果。
乘法运算完成标志位。当前运算完成后输出高电平,此后如果enable信号拉低则该信号也拉低无效。
移位计数器,在enable=1时,每个时钟周期i会递增直到i=8停止。i=0~7时,对应进行移位累加计算。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)