首页 > 编程语言 >正的浮点数相加的示例程序 Verilog

正的浮点数相加的示例程序 Verilog

时间:2023-04-24 14:23:10浏览次数:39  
标签:begin 22 val 示例 pow 浮点数 Verilog rst reg

module float_adder(   input                clk,   input              rst_n,   input                 en,   input      [31:0]    aIn,   input      [31:0]    bIn,   output reg          busy,   output reg       out_vld,     output reg [31:0]    out ); //运算过程:对阶、尾数求和、规格化、舍入、溢出判断 //分离阶数、尾数 wire signal_bit = aIn[31]; wire [7:0] pow_a = aIn[30:23]; wire [7:0] pow_b = bIn[30:23];
wire [22:0] val_a = aIn[22:0]; wire [22:0] val_b = bIn[22:0];
//找到输入指数阶数较大,和阶数差 //对阶:在计算机中,采用小阶向大阶看齐的方法,实现对阶。即右移 reg [22:0] pow_max ; reg [23:0] pow_dif ; reg [22:0] val_max ; reg [22:0] val_min ; reg en_dly0; always @(posedge clk or negedge rst_n) begin   if(rst_n==0)begin     pow_max <= 'd0;     val_max <= 'd0;     val_min <= 'd0;     pow_dif <= 'd0;     en_dly0 <= 'd0;   end   else if( en == 1 && busy == 0)begin     if(pow_a >= pow_b)begin       pow_max <= pow_a;       val_max <= val_a;       val_min <= val_b;       en_dly0 <= 'd1;       if ( pow_a - pow_b > 'd23) begin         pow_dif <= 'd23;       end       else begin         pow_dif <= pow_a - pow_b;       end     end     else begin       pow_max <= pow_b;       val_max <= val_b;       val_min <= val_a;       en_dly0 <= 'd1;       if ( pow_b - pow_a > 'd23) begin         pow_dif <= 'd23;       end       else begin         pow_dif <= pow_b - pow_a;       end     end   end   else begin     pow_max <= pow_max;     val_max <= val_max;     val_min <= val_min;     pow_dif <= pow_dif;     en_dly0 <= 'd0;   end end
//移位忙指示信号 reg shift_busy; reg [4:0] shift_cnt; always @(posedge clk or negedge rst_n) begin   if (rst_n==0) begin     shift_busy<='d0;   end   else if(en_dly0 == 1 )begin     shift_busy <='d1;   end   else if(shift_cnt == pow_dif)begin     shift_busy <=  0;   end end
//移位计数
always @(posedge clk or negedge rst_n) begin   if(rst_n == 0)begin     shift_cnt <= 'd0;   end   else if (shift_busy ==1) begin     if (shift_cnt == pow_dif) begin       shift_cnt <= shift_cnt;     end     else begin       shift_cnt <= shift_cnt + 1'b1;     end   end   else begin     shift_cnt <= 'd0;   end end reg [22:0] val_shift; always @(posedge clk or negedge rst_n) begin   if(rst_n == 0)begin     val_shift <= 'd0;   end   else if (en_dly0==1'b1) begin     val_shift <= val_min;   end   else if (shift_busy == 1) begin     val_shift <= {1'b0,val_shift[22:1]};   end   else begin     val_shift <= val_shift;   end end
//尾数求和 wire val_add_flag = (shift_cnt == pow_dif)&&(shift_busy ==1); reg [23:0] val_sum; reg val_sum_vld; always @(posedge clk or negedge rst_n) begin   if (rst_n==0) begin     val_sum<='d0;     val_sum_vld<='d0;   end   else if(val_add_flag == 1)begin     val_sum <= val_max + val_shift;     val_sum_vld<='d1;   end   else begin     val_sum <= val_sum;     val_sum_vld<='d0;   end end
//规范 always @(posedge clk or negedge rst_n) begin   if (rst_n==0) begin     out<='d0;     out_vld<='d0;   end   else if(val_sum_vld == 1)begin     //尾数求和有溢出     out_vld<='d1;     out[31]<= signal_bit;     if(val_sum[23] == 1 && out[30:23] == 8'hFF)begin       out[30:23]<= 8'hFF;       out[22:0] <= 23'h7F_FFFF;     end     else if(val_sum[23] == 1)begin       out[30:23]<= pow_max + 1;       out[22:0] <= val_sum[23:1];     end     else begin       out[30:23]<= pow_max;       out[22:0] <= val_sum[22:0];   end   end   else begin     out <= out;     out_vld<='d0;   end end
//运算忙指示 always @(posedge clk or negedge rst_n) begin   if (rst_n==0) begin     busy<='d0;   end   else if(en == 1 && busy == 0)begin     busy<='d1;   end   else if(out_vld == 1 )begin     busy<='d0;   end   else begin     busy <= busy;   end end //00000100100000000000000 //00000100100000000000000 //0111100001110101110000101
endmodule

标签:begin,22,val,示例,pow,浮点数,Verilog,rst,reg
From: https://www.cnblogs.com/qinyang110/p/17349364.html

相关文章

  • 【Verilog HDL】常量的参数化及跨模块传递
    申明变量Verilog中申明常量主要有两种方式:parameter localparamlocalparam用法与parameter基本一致,只是localpara定义的参数通常只在所在模块范围内使用,其赋值无法被模块之外的参数定义所改变。parameter的跨模块传递parameter在同一个模块中的赋值通常有两种方式,......
  • 浮点数规格化的目的,方式,和形式
        ......
  • 设计模式-原型模式-Java中使用示例-节日发送邮件活动
    场景设计模式-原型模式-浅克隆和深克隆在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127576328上面初步记录了原型模式的使用示例,下面再记录一个银行节假日或者搞活动时发送邮件的例子。原型模式原型模式(PrototypePattern)的简单程度仅次......
  • golang中sync.Pool的使用示例
    先上代码:packagemainimport( "fmt" "sync")varpoolsync.Pooltypepersonstruct{ Namestring Ageint}funcinit(){ pool=sync.Pool{New:func()any{ returnnew(person) }}}funcmain(){ p:=pool.Get().(*person) p......
  • Google Guava常用的代码示例
    GoogleGuava谷歌出品的,非常实用。包含集合、并发、I/O、散列、缓存、字符串等。依赖:<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version></dependency>JoinerJoiner可以连接字符串。常用方法:Joine......
  • MKL稀疏矩阵运算示例及函数封装
    IntelMKL库提供了大量优化程度高、效率快的稀疏矩阵算法,使用MKL库的将大型矩阵进行稀疏表示后,利用稀疏矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩阵运算。0稀疏矩阵稀疏矩阵是指矩阵......
  • thinkphp在模型中自动完成session赋值示例代码
    相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证、自动完成等,今天在开发中遇到自动完成中需要获取session值然后自动赋值的功能,具体看代码;classArticlelModelextendsModel{protected$_auto=array(array('addtime','time',1,'function'......
  • MKL普通矩阵运算示例及函数封装
    本示例将介绍MKL中的矩阵乘法和求逆,使用MKL进行此类大型矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩阵运算。1MKL矩阵乘法案例所用示例如下,矩阵A、B分别为\[A={\left[{\begin{array......
  • python matplotlib 散点图的拟合直线的简单示例
     #samplepointsX=[0,5,10,15,20]Y=[0,7,10,13,20]#solveforaandbdefbest_fit(X,Y):xbar=sum(X)/len(X)ybar=sum(Y)/len(Y)n=len(X)#orlen(Y)numer=sum([xi*yiforxi,yiinzip(X,Y)])-n*xbar*y......
  • SPI机制的简单示例?
    我们现在需要使用一个内容搜索接口,搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。    可以看到输出结果:文件搜索helloworld如果在com.cainiao.ys.spi.learn.Search文件里写上两个实现类,那最后的输出结果就是两行了。这就是因为ServiceLoader.lo......