xilinx FPGA 除法器ip核(divider)的学习和仿真(Vivado)
创始人
2024-12-27 07:43:52
0

在设计中,经常出现除法运算,实现方法
1、移位操作
2、取模取余
3、调用除法器IP核
4、查找表

简单学习除法器IP。
网上很多IP翻译文档,不详细介绍,记录几个重要的点:
1、三种算法模式(不同模式所消耗的资源类型不同)
在这里插入图片描述
2、分清除数和被除数;余数模式的选择
在这里插入图片描述
3、延迟输出的周期可配置
在这里插入图片描述


除法器IP的关键信号:
可以看到仍然是axis接口,所以在给数据时候,仍遵循tready和tvaild握手则数据有效的原则
在这里插入图片描述
给定输入的除数以及被除数有效信号和数据,由于握手,所以只有在输出的对应tready信号准备好,才能给定输入的相关信号

代码如下:

`timescale 1ns / 1ps  module DIVIDE_IP(     input                CLK                         ,     input                RST                         ,     output      [15:0]   REMINDER                    ,     output      [17:0]   QUOEITINR          );          reg           r_axis_divisor_tvalid  = 'b0      ;       reg  [15:0]   r_axis_divisor_tdata   = 'b0      ;            reg           r_axis_dividend_tvalid = 'b0     ;      reg  [23:0]   r_axis_dividend_tdata  = 'b0     ;          wire [15:0]   s_axis_divisor_tdata             ;     wire [23:0]   s_axis_dividend_tdata            ;         wire [39:0]   m_axis_dout_tdata                ;          assign        s_axis_divisor_tvalid =  r_axis_divisor_tvalid ;     assign        s_axis_divisor_tdata  =  r_axis_divisor_tdata  ;     assign        s_axis_dividend_tvalid=  r_axis_dividend_tvalid;     assign        s_axis_dividend_tdata =  r_axis_dividend_tdata ;          assign        REMINDER              =  m_axis_dout_tdata[15:0]; //余数     assign        QUOEITINR             =  m_axis_dout_tdata[39:16]; //商         div_gen_0 u_div_gen_0 (        .aclk                  (CLK                   ),    // input wire aclk        .s_axis_divisor_tvalid (s_axis_divisor_tvalid ),    // input wire s_axis_divisor_tvalid        .s_axis_divisor_tready (s_axis_divisor_tready ),    // output wire s_axis_divisor_tready        .s_axis_divisor_tdata  (s_axis_divisor_tdata  ),    // input wire [15 : 0] s_axis_divisor_tdata        .s_axis_dividend_tvalid(s_axis_dividend_tvalid),    // input wire s_axis_dividend_tvalid        .s_axis_dividend_tready(s_axis_dividend_tready),    // output wire s_axis_dividend_tready        .s_axis_dividend_tdata (s_axis_dividend_tdata ),    // input wire [23 : 0] s_axis_dividend_tdata        .m_axis_dout_tvalid    (m_axis_dout_tvalid    ),    // output wire m_axis_dout_tvalid        .m_axis_dout_tdata     (m_axis_dout_tdata     )     // output wire [39 : 0] m_axis_dout_tdata );       always @(posedge CLK)      begin          if(RST)          begin              r_axis_divisor_tvalid     <= 'b0;              r_axis_divisor_tdata      <= 'd0;           end          else if(s_axis_divisor_tready)          begin              r_axis_divisor_tvalid     <= 'b1;              //r_axis_divisor_tdata      <= r_axis_divisor_tdata + 'd1; //除数              r_axis_divisor_tdata      <= r_axis_divisor_tdata + 'd4; //除数          end          else          begin              r_axis_divisor_tvalid     <= 'b0;              r_axis_divisor_tdata      <= 'd0;           end      end       always @(posedge CLK)      begin          if(RST)          begin              r_axis_dividend_tvalid     <= 'b0;              r_axis_dividend_tdata      <= 'd0; //被除数          end          else if(s_axis_dividend_tready)          begin              r_axis_dividend_tvalid     <= 'b1;              r_axis_dividend_tdata      <= r_axis_dividend_tdata + 'd5; //被除数          end          else           begin              r_axis_dividend_tvalid     <= 'b0;              r_axis_dividend_tdata      <= 'd0; //被除数          end      end endmodule 

TB:

`timescale 1ns / 1ns  module DIVIDE_IP_TB;      reg         CLK        ;     reg         RST        ;      DIVIDE_IP u_DIVIDE_IP(         .CLK   (CLK       ),         .RST   (RST       )     );      initial                    CLK = 1'b1;     always    #10              CLK = ~CLK;          initial begin         RST           = 'b1;         #100;         RST           = 'b0;     end endmodule  

仿真情况:
无余数的情况,可以看到m_axis_dout_tvalid高时,对应的余数都是0
在这里插入图片描述

有余数的情况:
在这里插入图片描述

出现的问题:
IP输入信号出现高阻态。
如下图所示,给了正确的r_axis_divisor_tvalid、r_axis_divisor_tdata、r_axis_dividend_tvalid、r_axis_dividend_tdata信号,并将其赋值给除法器IP的输入s_axis_divisor_tvalid、s_axis_divisor_tdata、s_axis_dividend_tvalid、s_axis_dividend_tdata。
可以看到tvalid信号正常赋值,tdata却出现高阻态。
原因:赋值时,tvalid位宽1bit,可不定义直接赋值;但等于多bit位宽的tdata来说,赋值assign之前,需要先定义。

wire [15:0]   s_axis_divisor_tdata              wire [23:0]   s_axis_dividend_tdata             

在这里插入图片描述


以上简单记录除法器IP的使用方法,后续可应用。比如A / B的操作,若有余数则在商的基础上加1.若没有余数就是商。
这样我们就可以先调用除法器IP,得到商和余数。
判断,当余数==0时,r_tmp = 商,否则r_tmp = 商 + 'b1

相关内容

热门资讯

黑科技好牌"wepo... 黑科技好牌"wepoke有吗!外挂透明挂辅助工具(黑科技)黑科技教程"确实存在有挂1、超多福利:超高...
总结黑科技!wepoke软件下... 总结黑科技!wepoke软件下载(透视)太坑了有挂(详细教程黑科技教程)wepoke软件下载辅助器中...
黑科技智能ai!红龙扑克插件(... 黑科技智能ai!红龙扑克插件(wePOke)外挂透明挂辅助工具(必备教程黑科技软件)关于红龙扑克插件...
游戏黑科技!德扑ai智能机器人... 游戏黑科技!德扑ai智能机器人平台安装(透视)太坑了存在有挂(曝光教程黑科技脚本);1、德扑ai智能...
黑科技智能ai"微扑... 黑科技智能ai"微扑克辅助机器人!外挂透明挂辅助助手(黑科技)专业教程"原来真的是有挂1、该软件可以...
黑科技私人局!微扑克如何让系统... 黑科技私人局!微扑克如何让系统发好牌(wepOke)软件透明挂辅助脚本(程序员教你黑科技攻略)是一款...
好友房黑科技!wpk胜率跟号有... 好友房黑科技!wpk胜率跟号有关么(透视)太坑了真的是有挂(必备教程黑科技解密);1、玩家可以在wp...
黑科技辅助"wpk透... 黑科技辅助"wpk透视辅助购买渠道!外挂透明挂辅助下载(黑科技)必胜教程"一贯是有挂;1、每一步都需...
黑科技脚本!德扑数据分析软件(... 1、黑科技脚本!德扑数据分析软件(wEpOke)外挂黑科技辅助软件(实测教程黑科技技巧);详细教程。...
教学黑科技!德扑ai自定义设置... 教学黑科技!德扑ai自定义设置数据(透视)太坑了是真的有挂(必胜教程黑科技详情)1、德扑ai自定义设...