verilog实现除法器运算
创始人
2025-05-28 14:15:42
0

verilog实现除法器运算

本文通过verilog实现了一个位宽参数可配置的除法运算模块

1, 设计思路

我们要计算 a_data/b_data = div_data ----remain_data;

  • 🌿 确定位宽:若a_data的位宽为A_WIDTH, b_data的位宽为B_WIDTH;则div_data的最大位宽为A_WIDTH, remain_data的位宽为B_WIDTH;

  • 🍃 计算div_data的最高位:若a_data >= (b_data<<(A_WIDTH-1)), 则div_data的最高位div_data[A_WIDTH-1]为1,否则div_data[A_WIDTH-1]为0; 即div_data[A_WIDTH-1] = a_data > (b_data<<(A_WIDTH-1)) ? 1‘b1 : 1’b0;

  • 🌾 计算div_data的次高位:若div_data的最高位div_data[A_WIDTH-1]为1,则a_data_tmp = a_data – (b_data<<(A_WIDTH-1)); 否则a_data_tmp = a_data; 次高位div_data[A_WIDTH-2] = a_data_tmp >= (b_data<<(A_WIDTH-2)) ? 1‘b1 : 1’b0;

  • 🌴 依次类推,可 计算出完整的div_data;

  • 🌲. 计算完div_data后,可用 remain_data = a_data – b_data*div_data获取余数

举个例子,计算8/3 也就是 4’b1000/3’b011 = 3’b010;

  • 🥝 div_data[3] = 4’b1000 > (3’b011 << 3) ? 1’b1 : 1’b0 ; 由于div_data[3]为0,所以a_data_tmp为4‘b1000;

  • 🥑 div_data[2] = 4’b1000 > (3’b011 << 2) ? 1’b1 : 1’b0; 由于div_data[2]为0,所以a_data_tmp为4‘b1000;

  • 🍇 div_data[1] = 4’b1000 > (3’b011 << 1) ? 1’b1 : 1’b0; 由于div_data[1]为1,所以a_data_tmp为4‘b1000-(3’b011 << 1) = 4’b0010;

  • 🍒 div_data[0] = 4’b0010 > (3’b011 << 0) ? 1’b1 : 1’b0;

  • 🍐所以 div_data = 4‘b0010 = 2;

  • 🌼 remain_data = a_data – b_data*div_data = 8 – 3 * 2 = 2 = 3’b010;

2, Verilog代码

// Filename      : div.v
// Author        : ppkuan
module div(/*autoarg*///Inputsclk, rst_n, in_vld, a_data, b_data, //Outputsout_vld, remain_data, div_data
);parameter   A_WIDTH = 10;
parameter   B_WIDTH = 5;
// a_data/b_data = div_data------remain_datainput                             clk         ;
input                             rst_n       ;
input                             in_vld      ;
input       [A_WIDTH - 1 : 0]     a_data      ;
input       [B_WIDTH - 1 : 0]     b_data      ;output reg                        out_vld     ;
output reg  [B_WIDTH - 1 : 0]     remain_data ;
output reg  [A_WIDTH - 1 : 0]     div_data    ;wire   [A_WIDTH - 1 : 0]                             div_data_tmp    ;
wire   [A_WIDTH - 1 : 0] [A_WIDTH + B_WIDTH - 1 : 0] ab_data_tmp     ;
wire   [A_WIDTH - 1 : 0] [A_WIDTH - 1 : 0]           a_data_tmp      ; 
wire   [B_WIDTH - 1 : 0]                             remain_data_tmp ;assign  ab_data_tmp[A_WIDTH - 1]   = b_data << (A_WIDTH - 1);
assign  div_data_tmp[A_WIDTH - 1]  = {{B_WIDTH{1'b0}}, a_data} >= ab_data_tmp[A_WIDTH - 1] ? 1'b1 : 1'b0;
assign  a_data_tmp[A_WIDTH - 1]    = div_data_tmp[A_WIDTH - 1] ? {{B_WIDTH{1'b0}},a_data} - ab_data_tmp[A_WIDTH - 1] : a_data;genvar i;
generate for(i = A_WIDTH - 2; i >= 0; i--)begin:divassign ab_data_tmp[i]  = (b_data << i);assign div_data_tmp[i] = {{B_WIDTH{1'b0}}, a_data_tmp[i+1]} >= ab_data_tmp[i] ? 1'b1 : 1'b0;assign a_data_tmp[i]   = div_data_tmp[i] ? {{B_WIDTH{1'b0}},a_data_tmp[i+1]} - ab_data_tmp[i] : a_data_tmp[i + 1];end
endgenerateassign remain_data_tmp = {{B_WIDTH{1'b0}}, a_data} - div_data_tmp * b_data;always@(posedge clk or negedge rst_n)if(!rst_n)beginout_vld     <= 'b0            ;remain_data <= 'd0            ;div_data    <= 'd0            ;endelse if(in_vld)beginout_vld     <= 'b1            ;remain_data <= remain_data_tmp;div_data    <= div_data_tmp   ;endelse beginout_vld     <= 'b0            ;end
endmodule

3, 测试用例:

module test;wire         clk         ;
wire         rst_n       ;
wire         in_vld      ;
wire [9 : 0] a_data      ;
wire [4 : 0] b_data      ;
wire         out_vld     ;
wire [9 : 0] div_data    ;
wire [4 : 0] remain_data ;reg         clk_r       ;
reg         rst_n_r     ;
reg         in_vld_r    ;
reg [9 : 0] a_data_r    ;
reg [4 : 0] b_data_r    ;assign clk    = clk_r    ;
assign rst_n  = rst_n_r  ;
assign in_vld = in_vld_r ;
assign a_data = a_data_r ;
assign b_data = b_data_r ;div#(.A_WIDTH(10),.B_WIDTH(5)) u_div(/*autoinst*/// a_data/b_data = div_data------remain_data.clk                            (clk                                        ), // input .rst_n                          (rst_n                                      ), // input .in_vld                         (in_vld                                     ), // input .a_data                         (a_data[9 : 0]                              ), // input .b_data                         (b_data[4 : 0]                              ), // input .out_vld                        (out_vld                                    ), // output.remain_data                    (remain_data[4 : 0]                         ), // output.div_data                       (div_data[9 : 0]                            )  // output
);initial
begin
clk_r =    0;
in_vld_r = 0;
rst_n_r =  1;
#10
rst_n_r =  0;
#10
rst_n_r =  1;
#10
in_vld_r = 1;
a_data_r = 10'd57;
b_data_r = 5'd8;
#10
in_vld_r = 0;
$finish;
endalways #5 clk_r = !clk_r;endmodule

测试结果如图所示

请添加图片描述

57/8 = 7—1;计算正确;

相关内容

热门资讯

央企名录更新中国长安汽车集团入... 新京报贝壳财经讯(记者王琳琳)7月29日,国务院国资委网站中央企业名录更新,中国长安汽车集团有限公司...
A股午评:三大指数分化,沪指跌... 格隆汇7月29日|A股主要指数涨跌不一,截至午间收盘,沪指跌0.08%报3595.19点,深成指跌0...
2025年基金二季报划重点!泓... 来源:新浪基金 2025年第二季度泓德睿享一年持有期混合A基金净值增长率为3.09%,同期业绩比较基...
美团发文:绝不自营,浣熊食堂只... 来源:猎云网 7月29日,美团官方公众号发文称,经过半年多的试运营,7月初正式推出“浣熊食堂”品牌以...
独角兽疫苗企业三冲港股IPO:... 疫苗行业独角兽三冲港股IPO了! 在国产疫苗行业持续升级转型的浪潮中,一家坚持技术创新的企业正蓄势待...
A股站上新台阶,看好科技非银接... |2025年7月28日 星期一| NO.1中信建投:A股站上新台阶,看好科技非银接力 中信建投研报表...
中国长安汽车集团挂牌成立,朱华... 7月29日上午,中国长安汽车集团有限公司(以下简称“中国长安”)在重庆挂牌成立。这既是国内第三家汽车...
原创 扒... 懂车帝一场测试,成了智驾领域的“照妖镜”。测试结果触目惊心,无一车型全优通过!那些被吹上天的“遥遥领...
2025年LNG船拆解创纪录,... 2025年,LNG运输船拆解市场迎来爆发式增长,待拆解船成交量创下纪录——这凸显出在现货费率低迷的背...
中国押注电力无限的未来 文|小卢鱼 编辑|杨旭然 中国第99家央企中国雅江集团横空出世,序列号22,位于中国长江三峡集团有限...
多地消协发布上半年消费者投诉情... 7月以来,多地消协陆续发布了2025年上半年消费者投诉情况,从受理情况来看,消费欺诈、虚假宣传、预付...
7.28纯碱日评:纯碱市场交投... 纯碱市场分析 今日国内纯碱市场整体呈现稳中震荡走势,价格跌多涨少。截至目前,华北地区轻质纯碱价格在1...
国家税务总局:我国税收的调节分... 7月28日,国务院新闻办公室举行高质量完成“十四五”规划系列主题新闻发布会,介绍“十四五”时期税收改...
7.29黄金首现四连阴 交易有两个悲剧,一是万念俱灰,另一则是踌躇满志,美丽属于自信者,从容属于有备者,单边属于布局者,这本...
“吃药”行情再爆发,药ETF上... 7月29日早盘,A股“吃药”行情再爆发,制药、医疗联袂拉涨。 国内首只跟踪制药指数的药ETF(562...
上海谊众:7月28日融券卖出2... 证券之星消息,7月28日,上海谊众(688091)融资买入1424.3万元,融资偿还9642.78万...
凌晨重磅,又创新高! 【导读】标普500指数和纳斯达克指数双双创新高,英伟达市值突破4.3万亿美元 见习记者 储是 美东时...
贬值!人民币中间价单日调降48... 北京商报讯(记者 廖蒙)7月28日,中国人民银行授权中国外汇交易中心公布,当日银行间外汇市场人民币汇...
ETF盘中资讯|“吃药”行情再... 7月29日早盘,A股“吃药”行情再爆发,制药、医疗联袂拉涨。 国内首只跟踪制药指数的药ETF(562...
拓山重工连续5涨停后现&quo... 7月29日,拓山重工股价出现剧烈波动。该股以涨停价开盘,延续此前连续涨停态势。开盘后不久,股价突然出...