赞
踩
目录
题目:除法器的verilog实现,16bit A,8bit B。C = A/B;
摘自别的博客,这里除法器的原理其实就是模拟人进行除法的过程,如下图以4bit数为例,抓要从以下几个方面考虑:
(1)为什么要扩展呢?
个人理解,因为后面涉及到左移,会将实际参与运算的位数一位一位移到扩展位上参数运算,然后将每次运算的商通过+1/+0的操作,移到最低的bit位上,这也是后来取结果和余数的时候,为什么是低4位为商,高四位为最终的余数。
(2)a=a-b+1,是什么操作
a-b其实就是模拟,人每次除法的操作,当a>b,就+1.将商移到LSB位,当a<b.其实就是那个位是0,就将0移到LSB位,每次右移操作,每次运算的商也会随之左移就依次得到0110,的结果。
- module division (
- input wire [15:0] A,
- input wire [7:0] B,
- output wire [15:0] result,
- output wire [15:0] odd
- );
- reg [15:0] a_reg;
- reg [7:0] b_reg;
-
-
- reg [31:0] temp_a;
- reg [31:0] temp_b;
-
- integer i;
-
- //
- always @(*) begin
- a_reg = A;
- b_reg = B;
- end
-
-
- always @(*) begin
- temp_a ={16'h0,a_reg};
- temp_b ={b_reg,16'h0};
-
- for(i =0;i < 16;i=i+1) begin
- temp_a = temp_a <<1;
- if(temp_a >= temp_b) begin
- temp_a = temp_a-temp_b +1;
- end
- else begin
- temp_a = temp_a;
- end
- end
- end
-
-
-
- assign odd = temp_a[31:16];
- assign result = temp_a[15:0];
-
- endmodule
- `timescale 1ns/1ps
- module tb_division;
-
-
- reg [15:0] A;
- reg [7:0] B;
- wire [15:0] result;
- wire [15:0] odd;
-
- integer i;
-
- initial begin
- A=1;
- B=1;
- #100;
- for(i= 0;i <15;i=i+1) begin
- #20;
- A = {$random}% 65536;
- B = {$random}% 256;
- end
-
-
- end
- division division_inst (
- .A(A),
- .B(B),
- .result(result),
- .odd(odd)
- );
-
-
-
- endmodule
分析一下仿真结果,
第一组: 123604/129=105......59
第二组:54793/99 = 553......46
第三组:........
仿真结果,与实际计算结果一致
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。