c语言sscanf函数的用法是什么
355
2022-11-28
booth乘法
booth乘法节省面积、速度较移位相加速度也更快。
一个例子:14乘以-5,乘数和被乘数都用5bit补码表示,结果有10bit表示。
14的补码:01110, -5的补码11011 ,正确结果为-70:11 1011 1010
使用一个状态机实现这个乘法,IDLE下初始化等待数据输入,再进行加法和移位,次数由输入位宽决定,最后数据输出。
程序代码如下:
1: // ************************************************************** 2: 3: 4: // File name : booth.v 5: // Module name : BOOTH 6: // Full name : multiply based on booth's algorithm 7: // 8: // Author : Yang Li 9: // Email : yangli0534@gmail.com 10: // Date : 2013/11/24 11: // Version : V 1.0 12: // 13: //Abstract : an implementation of multiplier based on booth's algorithm 14: // multiplier ,multiplicand :2's complement 15: // 16: // Modification history 17: // ------------------------------------------------------------------------------------------------------ 18: 19: // ********************************************************************* 20: 21: module booth 22: #(parameter WIDTH =8 ) 23: ( 24: 25: input wire sys_clk, 26: input wire sys_rst_n, 27: input wire [WIDTH-1:0] multiplicand, 28: input wire [WIDTH-1:0] multiplier, 29: input wire data_av, 30: output reg rfd, 31: output reg rdy, 32: output reg [2*WIDTH-1:0] product, 33: output reg [2*WIDTH-1:0] product_r 34: ); 35: //********************* 36: //parameter DECLARATION 37: //********************* 38: localparam [3:0] IDLE = 4'b0001, 39: ADD = 4'b0010, 40: // TAP = 5'b00100, 41: SHIFT = 4'b0100, 42: DONE = 4'b1000; 43: 44: //localparam N= log2(WIDTH) ; 45: localparam N=5; 46: localparam WIDTH_PROD = 2*WIDTH; 47: //********************* 48: //INNER SIGNAL DECLARATION 49: //********************* 50: reg [WIDTH-1:0] multiplicand_add, multiplicand_minus;//鍔犺涔樻暟锛屽噺琚箻鏁 51: reg [WIDTH-1:0] upper_r, lower_r;//楂樺崐鍜屼綆鍗 52: reg booth_r; //booth bit 53: reg [3:0] state_curr, state_next; 54: reg [N-1:0] cnt_r;// 55: 56: reg [WIDTH-1:0] upper, lower;//楂樺崐鍜屼綆鍗 57: reg booth; //booth bit 58: reg [N-1:0] cnt;// 59: //reg [WIDTH_PROD-1:0] product; 60: 61: always @(posedge sys_clk or negedge sys_rst_n) 62: begin: MULTIPLICAND 63: if(!sys_rst_n) 64: begin 65: multiplicand_add <= 0; 66: multiplicand_minus <= 0; 67: end 68: else if(rfd) 69: begin 70: multiplicand_add <= multiplicand; 71: multiplicand_minus <= ~multiplicand + 1'b1; 72: end 73: end 74: 75: always @(posedge sys_clk or negedge sys_rst_n) 76: begin: STATE_CTRL 77: if(!sys_rst_n) begin 78: state_curr <= IDLE; 79: upper_r <= 0; 80: lower_r <= 0; 81: booth_r <=0; 82: cnt_r <= 0; 83: end 84: else begin 85: state_curr <= state_next; 86: upper_r <= upper; 87: lower_r <= lower; 88: booth_r <= booth; 89: cnt_r <= cnt; 90: end 91: end 92: 93: always @(*) 94: begin:STATE_NEXT 95: state_next = state_curr; 96: case(state_curr) 97: IDLE: begin 98: if(data_av) 99: state_next = ADD; 100: end 101: ADD: 102: state_next = SHIFT; 103: // TAP: 104: // state_next = SHIFT; 105: SHIFT: begin 106: if(cnt_r==WIDTH) 107: state_next = DONE; 108: else 109: state_next = ADD; 110: end 111: DONE: 112: state_next = IDLE; 113: 114: default: state_next = IDLE; 115: endcase 116: 117: end 118: 119: always @* 120: begin: OUT 121: rfd = 1'b0; 122: rdy = 1'b0; 123: product = 0; 124: cnt = cnt_r; 125: upper = upper_r; 126: lower = lower_r; 127: booth =booth_r; 128: case(state_curr) 129: IDLE: begin 130: rfd = 1'b1; 131: cnt = 0; 132: upper = 0; 133: booth = 1'b0; 134: if(data_av) 135: lower = multiplier; 136: end 137: ADD: begin 138: cnt = cnt_r + 1'b1; 139: case({lower_r[0],booth_r}) 140: 2'b00: upper = upper_r; 141: 2'b01: upper = upper_r + multiplicand_add; 142: 2'b10: upper = upper_r + multiplicand_minus; 143: 2'b11: upper = upper_r; 144: 145: endcase 146: end 147: //TAP: begin 148: 149: // end 150: 151: SHIFT: begin 152: 153: 154: upper = {upper_r[WIDTH-1],upper_r[WIDTH-1:1]}; 155: lower = {upper_r[0],lower_r[WIDTH-1:1]}; 156: booth = lower_r[0]; 157: 158: end 159: 160: DONE: begin 161: product ={upper_r, lower_r}; 162: rdy = 1'b1; 163: end 164: endcase 165: 166: end 167: 168: always @(posedge sys_clk or negedge sys_rst_n) 169: begin: register 170: if(!sys_rst_n) 171: product_r <= 0; 172: else if(rdy) 173: product_r <= product; 174: end 175: 176: endmodule 177:
仿真结果
Do first what you dread the most.
OPTIMISM, PASSION & HARDWORK
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~