实质是根据被乘数(1011_1011)根据乘数(1101)进行移位相加,具体来说,data_out[11:0] = 1011_1011<<3 + 1011_1011<<2 + 1011_1011。
用加法实现a*5/16功能(要求四舍五入),输入为a,10bit位宽,输出结果为result。请写出下面add_temp、result信号的位宽
wire[10:0] add_temp; //位宽判断时取a=10'b11_1111_1111带入时得到add_temp=11'b111_1111_1011 wire[6:0] result; assign add_temp = a<<2 + a<<0; //左移n位=*2^n assign result = add_temp>>4;
运算单元的设计,实现A[7:0]*1111_1011
reg [7:0] A; reg [14:0] B; //最大左移7位,故最高位为第[14]位 assign B = A; wire [15:0] C; //直接加一位,或者令A=8'b1111_1111带入得C=16'b1111_1010_0000_0101故最大位宽为16 assign C = B<<7 + B<<6 + B<<5 + B<<4 + B<<3 + B<<1 + B<<0;
// ******************* // INFORMATION // ******************* // 0.0556 ≈ 7/128 = (2^2 + 2^1 + 2^0)/(2^7) // 0.0556 ≈ 14/256 // 0.0556 ≈ 28/512 // 0.0556 ≈ 57/1024 = (2^5 + 2^4 + 2^3 + 2^0)/(2^10) module MULTI ( input [15:0] din , output [16:0] dout ); //WIRES wire [16:0] a; wire [16:0] b; wire [16:0] c; wire [16:0] d; //********************* //MAIN CORE //********************* assign a = din << 2; assign b = din << 1; assign c = din << 0; assign d = a + b + c; assign dout = d >> 7; //********************* endmodule
B=1024,A=57
//********************* //MAIN CORE //********************* assign a = din << 5; assign b = din << 4; assign c = din << 3; assign d = din << 0; // 'd57=2'b11_1001 assign e = a + b + c + d; assign dout = e >> 10; // 右移除以1024