【FPGA】:ip核--Divider(除法器)

 2023-09-05 阅读 94 评论 0

摘要:文章目录二、 Divider(除法器)2.1 概述2.2 端口说明2.3 ip核的生成2.4 测试代码2.5 仿真结果2.6 参考资料 二、 Divider(除法器) 2.1 概述    除法器顾名思义,用来做除法运算。 2.2 端口说明 2.3 ip核的生成 (1)在ip catalog里面选择Divders (2)chann

文章目录

  • 二、 Divider(除法器)
    • 2.1 概述
    • 2.2 端口说明
    • 2.3 ip核的生成
    • 2.4 测试代码
    • 2.5 仿真结果
    • 2.6 参考资料

二、 Divider(除法器)

2.1 概述

   除法器顾名思义,用来做除法运算。

2.2 端口说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 ip核的生成

(1)在ip catalog里面选择Divders
在这里插入图片描述
(2)channel setting,具体如下所述:
Algorithm type: 选择不同的算法模式,其中Radix2为常用的模式(位宽12到16时优先考虑),LutMult当时数较小的时候使用(数据宽度小于等于12时,优先考虑),High Radix是当数很大的时候使用(数据位宽大于16时)。常用的是Radix2。
Dividend Width:被除数的位数。
Has TLAST: 指定此通道是否具有 tlast 端口。 除法器不使用此信息。 该项用于简化系统设计。tlast信息以和数据路径相同的延迟传送到输出通道。
Has TUSER: 指定此通道是否具有 tuser 端口。 与 tlast 一样, 除法器不使用此信息。 该项用于简化系统设计。 tuser 位以和数据路径相同的延迟传送到输出。
TUSER Width: 当 Has tuser 为 TRUE 时可用,这将设置此通道的 tuser 端口的宽度。
Divisor Width:除数的位数。
Remainder Type:选择余数的模式。
有两种模式:Remainder:余数,以及Fractional分数模式。
   Remainder模式的余数模式位数固定,由系统根据除数自动设定。,计算公式为
在这里插入图片描述
比如:6/-4 = -1 REMD 2 -6/4 = -1 REMD –2。 其中商的位宽和被除数的位宽一致,位于高位,余数的位宽和除数的位宽一致,位于低位。
   而选择Fractional Width(f分数模式)模式,则可以在Fractional Width那一栏选择自己想要的余数位数。对于带分数输出的带符号模式,符号位同时存在于商和分数域中。例如,对于一个5位被除数、除数和分数输出:
-9/4 = 9/-4 = -(2 1/4),对应的为10111/00100 or 01001/11100,其结果为
Quotient(商) = 11110 (= -2)
Remainder (余数)= 11100 (= -1/4)

在这里插入图片描述
常用模式为Remainder模式。本文也应选则Remainder模式。
在这里插入图片描述

(3)option的设置,具体如下所述:
ACLKEN :确定内核是否具有时钟使能输入 (ACLKEN)。信号ARESETn始终优先于ACLKEN,即无论ACLKEN的状态如何,ARESETn都生效。
ARESETn :确定内核是否具有低电平有效同步清零输入 (ARESETn)。为低电平有效。信号 ARESETn 应保持有效至少两个时钟周期。 这是因为,为了性能,ARESETn 在被馈送到原语的重置端口之前在内部注册。
在这里插入图片描述

2.4 测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/01/16 15:00:44
// Design Name: 
// Module Name: divider_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module divider_tb();reg               aclk;reg               s_axis_divisor_tvalid;reg   [15:0]     s_axis_divisor_tdata;reg   [23:0]     s_axis_dividend_tdata;reg              s_axis_dividend_tvalid; wire             m_axis_dout_tuser;wire             m_axis_dout_tvalid;wire  [39:0]     m_axis_dout_tdata;wire [23:0] quoeitnt;  //除数wire [15:0]  intrmd ;  //余数assign quoeitnt = m_axis_dout_tdata[39:16];assign intrmd   = m_axis_dout_tdatac[15:0];div_gen_0 div_gen_0_inst0 (.aclk(aclk),                                      // input wire aclk.s_axis_divisor_tvalid(s_axis_divisor_tvalid),    // input wire s_axis_divisor_tvalid.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_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_tuser(m_axis_dout_tuser),            // output wire [0 : 0] m_axis_dout_tuser.m_axis_dout_tdata(m_axis_dout_tdata)            // output wire [39 : 0] m_axis_dout_tdata
);initial aclk=1;
always #5 aclk=~aclk;initial begins_axis_dividend_tvalid=0;s_axis_divisor_tvalid =0;#20;s_axis_dividend_tdata = 24'd6;s_axis_divisor_tdata  = 16'd4;s_axis_dividend_tvalid=1;s_axis_divisor_tvalid =1;#50;s_axis_divisor_tdata  = 16'd0;
endendmodule

2.5 仿真结果

在这里插入图片描述
   从图中可以看出,输出m_axis_dout_tdata滞后于输入2个时钟周期,这与ip核设置的一致,当除数位0时,发现m_axis_dout_tuser信号拉高,说明输入的除数为0,此时输出结果无效。

2.6 参考资料

[1]数字信号处理-04- FPGA常用运算模块-除法器
[2]vivado 除法器ip核的使用

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/521.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息