循环型的除法器(实现两个8位整数的除法)
来源:互联网 发布:薛之谦抄袭 知乎 编辑:程序博客网 时间:2024/04/27 19:40
循环型的除法器,如果用笔者的话来说,就是位操作的除法器。循环型的除法器是典型的硬件除法器,假设除数和被除数的位宽为N 位,那么除法器就需要循环N 次完成除法操作,结果取得“N 位商和N 位余”。假设被除数A =10,除数B = 3,为了使除数B大于除数A,让B‘ = B*2^m, 假设m = 6,R为余数,Q为商。
循环结束,R = 64*2 =128 ,正确的R '= R/2^(m+1) = 128/128 =1,Q = 0000011
/*************************************************************************************************************
作者:冬瓜
时间:2015.7.16
功能:两个8位数(整数)的除法,
************************************************************************************************************/
module cycle_divider
(
clk,rst_n,
a,b,c,d,
is_start_sig,
is_done_sig
);
input clk,rst_n;//时钟,复位信号
input [ 7:0 ]a;//被除数
input [ 7:0 ]b;//除数
output [ 7:0 ]c,d;//商,余数
input is_start_sig;//开始信号
output is_done_sig;//结束信号
reg [ 3:0 ]state;
reg [ 7:0 ]s;
reg [ 7:0 ]q;
reg [ 15:0 ]_s;
reg rDone,rNeg;
reg [ 15:0 ]r;
always @( posedge clk or negedge rst_n )
if( !rst_n )
begin
state <= 'd0;
s <= 'd0;
_s <= 'd0;
r <= 'd0;
q <= 'd0;
rDone <= 'd0;
rNeg <= 'd0;
end
else if( is_start_sig )
case( state )
'd0: begin
rNeg <= a[ 7 ]^b[ 7 ];
s <= b[ 7 ]? ( ~b + 1'b1 ): b;//取除数的绝对值
state <= state + 1'b1;
_s <= b[ 7 ]?{ 8'hff,b }:{ 8'hff,~b + 1'b1 };
r <= a[ 7 ]?{ 8'd0,~a + 1'b1 }:{ 8'd0,a }; end
'd1,'d2,'d3,'d4, 'd5,'d6,'d7,'d8: if( r < ( s<<7 ) ) begin q[ 8-state ] <= 1'b0; r <= r<<1; state <= state + 1'b1; end else begin q[ 8-state ] <= 1'b1; r <= ( r + ( _s<<7) )<<1; state <= state + 1'b1; end 'd9: begin rDone <= 1'b1; state <= state + 1'b1; end 'd10:begin rDone <= 1'b0; state <= 'd0; end default: state <= 'd0; endcase
assign c = rNeg ? ( ~q + 1'b1 ): q;
assign d = r[ 15:8 ];
assign is_done_sig = rDone;
endmodule
//激励文件
`timescale 1ns / 1ns
module cycle_divider_test();
reg [ 7:0 ]a,b;
reg clk,rst_n;
reg is_start_sig;
wire [ 7:0 ]c,d;
wire is_done_sig;
cycle_divider I1
(
.clk( clk ),
.rst_n( rst_n ),
.a( a ),
.b( b ),
.c( c ),
.d( d ),
.is_start_sig( is_start_sig ),
.is_done_sig( is_done_sig )
);
initial
begin
clk = 0;
rst_n = 1;
#200;
rst_n = 0;
#200;
rst_n = 1;
forever #20 clk = ~clk;
end
reg [ 3:0 ]i;
always @( posedge clk or negedge rst_n )
if( !rst_n )
begin
i <= 'd0;
is_start_sig <= 'd0;
a <= 'd0;
b <= 'd0;
end
else
case( i )
'd0: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end
else begin is_start_sig <= 1'b1; a <= 'd12; b <= 'd3; end
'd0: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= -'d25; b <= 'd5; end 'd1: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= 'd36; b <= 'd6; end 'd2: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= 'd12; b <= 'd5; end 'd3: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= -'d34; b <= -'d3; end 'd4: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= 'd67; b <= 'd7; end 'd5: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= -'d19; b <= 'd8; end 'd6: if( is_done_sig ) begin is_start_sig <= 1'b0; i <= i+ 1'b1; end else begin is_start_sig <= 1'b1; a <= -'d19; b <= 'd38; end 'd7: i <= 'd7; default: i <= 'd0; endcase
endmodule
- 循环型的除法器(实现两个8位整数的除法)
- verilog--除法器的简单实现(1)
- 用移位实现两个整数的除法
- 数字集成电路设计-2-除法器的verilog简单实现
- 数字集成电路设计-2-除法器的verilog简单实现
- 数字集成电路设计-3-除法器的verilog简单实现
- 数字电路设计之恢复余数除法器的verilog实现
- 寻找两个整数相除后的循环节
- 数字集成电路设计-3-除法器的verilog简单实现(续)
- 数字集成电路设计-3-除法器的verilog简单实现(续)
- 数字集成电路设计-9-除法器的verilog简单实现(续2)
- 除法器FPGA实现
- 一种FPGA整数除法器
- 基于FPGA的高效硬件除法器
- 大整数除法的实现
- 求两个不超过100位的非负整数的和,差,乘,除
- 求两个整数相除的结果
- java中两个整数相除得到小数点并保留两位小数的方法
- 双链表一系列操作
- UART(串口发送模块)
- [LeetCode] Gray Code
- Win7 64位系统 php运行出现undefined function curl_init()解决方法
- 【Code_Vs_1014】解题报告与总结
- 循环型的除法器(实现两个8位整数的除法)
- Rank of Tetris
- MYSQL双机热备、主从热备
- c 函数模块
- 玲珑杯Unity开发心得——进度条界面(异步加载游戏场景)
- DAVE SDK 4.1.2 Help content (翻译)——manifest 结构
- LeetCode(90) Subsets II
- JRE System Library [jdk1.7]和Server Library [Apache Tomcat v6.0]未绑定错误解决方案
- MFC:程序标题修改