FPGA----IP核float(定点数转浮点数)使用

1、本文紧接上一篇文章,因为我们计算设定的32位的单精度浮点数,但是cordic IP核输出的是32位定点数x(符号位)_x(整数位)_xx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx(小数位),为了方便使用float IP核的计算,因此我们需要将定点数转为浮点数。本片文章为全网第一篇带小数的定点数转浮点数的例程。

2、Floating-point IP核使用

实验任务:实现sin(±120°)32位定点数转浮点数操作,具体值怎么算的请参考上一篇文章

实验软硬件:ZCU106、Vivado 2019.1

实验过程:

①建立test_fix_to_float项目,并添加top、testbench文件,添加Floating-point IP核(这一步如果还不会,真别往下看了,好好复习以下前面的东西)

②Floating-point IP核做如下设置

 

 

 

 

 ③复制以下代码到对应文件中,并点击

`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
// 
// Create Date: 2021/12/31 22:57:23
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module top(
    input   clk,
    input   [31:0]  s_axis_a_tdata_sin_cos_a,
    input           s_axis_a_tvalid_sin_cos_a,
    output  [31:0]  m_axis_result_tdata_sin_cos_a,

    input   [31:0]  s_axis_a_tdata_sin_cos_b,
    input           s_axis_a_tvalid_sin_cos_b,
    output  [31:0]  m_axis_result_tdata_sin_cos_b,

    input   [31:0]  s_axis_a_tdata_sin_cos_c,
    input           s_axis_a_tvalid_sin_cos_c,
    output  [31:0]  m_axis_result_tdata_sin_cos_c,

    output m_axis_result_tvalid_sin_cos_a,
    output m_axis_result_tvalid_sin_cos_b,
    output m_axis_result_tvalid_sin_cos_c
    );
    floating_point_fix_float_sin_cos uut_floating_point_fix_float_sin_cos_a(
        .aclk(clk),
        .s_axis_a_tvalid(s_axis_a_tvalid_sin_cos_a),
        .s_axis_a_tdata(s_axis_a_tdata_sin_cos_a),
        .m_axis_result_tvalid(m_axis_result_tvalid_sin_cos_a),
        .m_axis_result_tdata(m_axis_result_tdata_sin_cos_a)
    );
    floating_point_fix_float_sin_cos uut_floating_point_fix_float_sin_cos_b(
        .aclk(clk),
        .s_axis_a_tvalid(s_axis_a_tvalid_sin_cos_b),
        .s_axis_a_tdata(s_axis_a_tdata_sin_cos_b),
        .m_axis_result_tvalid(m_axis_result_tvalid_sin_cos_b),
        .m_axis_result_tdata(m_axis_result_tdata_sin_cos_b)
    );
    floating_point_fix_float_sin_cos uut_floating_point_fix_float_sin_cos_c(
        .aclk(clk),
        .s_axis_a_tvalid(s_axis_a_tvalid_sin_cos_c),
        .s_axis_a_tdata(s_axis_a_tdata_sin_cos_c),
        .m_axis_result_tvalid(m_axis_result_tvalid_sin_cos_c),
        .m_axis_result_tdata(m_axis_result_tdata_sin_cos_c)
    );
endmodule
`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
// 
// Create Date: 2021/12/31 23:00:20
// Design Name: 
// Module Name: testbench
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module testbench(

    );
    reg clk;
    reg a_valid_a = 1'b0;
    reg [31:0] a_a = 32'b0;
    wire [31:0] result_a;

    reg a_valid_b = 1'b0;
    reg [31:0] a_b = 32'b0;
    wire [31:0] result_b;

    reg a_valid_c = 1'b0;
    reg [31:0] a_c = 32'b0;
    wire [31:0] result_c;
    top uut_top(
        .clk(clk),
        .s_axis_a_tdata_sin_cos_a(a_a),
        .s_axis_a_tvalid_sin_cos_a(a_valid_a),
        .m_axis_result_tdata_sin_cos_a(result_a),

        .s_axis_a_tdata_sin_cos_b(a_b),
        .s_axis_a_tvalid_sin_cos_b(a_valid_b),
        .m_axis_result_tdata_sin_cos_b(result_b),

        .s_axis_a_tdata_sin_cos_c(a_c),
        .s_axis_a_tvalid_sin_cos_c(a_valid_c),
        .m_axis_result_tdata_sin_cos_c(result_c),
        
        .m_axis_result_tvalid_sin_cos_a(m_axis_result_tvalid_sin_cos_a),
        .m_axis_result_tvalid_sin_cos_b(m_axis_result_tvalid_sin_cos_b),
        .m_axis_result_tvalid_sin_cos_c(m_axis_result_tvalid_sin_cos_c)
    );
    always #5 clk=~clk;
    
    initial begin
       clk  =   1'b0;
        #100;
        a_valid_a <=   1'b1;
        a_a <= 32'h376CF5D0;
        a_valid_b <=   1'b1;
        a_b <= 32'h376CF5D0;
        a_valid_c <=   1'b1;
        a_c <= 32'h376CF5D0;
        #500;
        a_valid_a <=   1'b1;
        a_a <= 32'hc8930a30;
        a_valid_b <=   1'b1;
        a_b <= 32'hc8930a30;
        a_valid_c <=   1'b1;
        a_c <= 32'hc8930a30;
    end
    always @(posedge clk) begin
        if (m_axis_result_tvalid_sin_cos_a == 1'b1
        && m_axis_result_tvalid_sin_cos_b == 1'b1
        && m_axis_result_tvalid_sin_cos_c == 1'b1) begin
            a_valid_a <=   1'b0;
            a_valid_b <=   1'b0;
            a_valid_c <=   1'b0;
        end
        
    end

endmodule

④结果分析

可以看到,结果在6个周期后输出

注意:例化模块时,输出端口我们一般设置位wire类型变量,千万不要对其赋值,因为这样会造成输出结果的xxxx(不定状态) 

  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发光的沙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值