【FPGA】关于两个数相加的“坑”

【FPGA】关于两个数相加的"坑"

调试生成校验位的时候,发现在FPGA中计算出的校验byte和使用matlab 计算出的校验byte。对不上,最终检查,发现是FPGA中计算正确,而MATLAB的计算有问题。

1、校验byte的计算方法

一系列数据相加,然后取最终相加结果的低8bit.

c 复制代码
A=[XX XX XX ... XX];
check_byte=bitand(sum(A(:)),hex2dec('FF'));

2、FPGA计算两个数相加

RTL design

c 复制代码
//RTL design
module top  (
   input            clk,
   input      [7:0] a,
   input      [7:0] b,
   output reg [7:0] c='d0
    );

    always@(posedge clk)
        c<=a+b;

endmodule

testbench:

c 复制代码
//testbench
module tb_top();
    reg        clk;
    reg  [7:0] a;
    reg  [7:0] b;
    wire [7:0] c;
    
    top u_top(
    .clk(clk),
    .a (a),
    .b (b),
    .c (c)
    );
    
    initial begin
        clk = 0;
        forever #5 clk = ~clk; // 产生周期为10单位时间的时钟信号
    end
    
    integer i;
    initial begin
        a='d252;
        b='d0;
        for(i=0;i<100;i=i+1)begin
            #10
            b=b+'d1;
            $display("at time %t, data_in = %d", $time,  b);
        end
    end
 
endmodule

仿真波形

3、MATLAB计算两个数相加

c 复制代码
a=uint8(240);
b=uint8(0);
for b=0:20
    c=a+b;
    fprintf("c=%d\n",c);
end
whos c

溢出之后,直接是clip到255;

3、C计算两个数相加

c 复制代码
#include <stdio.h>
#include <stdint.h>

int main() {
    uint8_t a = 240;
    uint8_t b = 0;
    uint8_t c = 0;
    for (b = 0; b < 30; b++)
    {
        c = a + b;
        printf("a[%d]+b[%d]=c=%d\n",a,b, c);
    }

    return 0;
}

溢出之后为0,然后再在0~255中循环。

4、总结

对比C语言和RTL的处理结果是一致的,但是MATLAB不一致。

这点一定要注意。

MATLAB的溢出机制是不一样的。

所以,如上所述,要计算校验byte,所有数据加起来之后取低8bit.

加起来就不要让数据溢出。

所以先不要用uint8型,强制转成double型,不会溢出的。

c 复制代码
A=double(A);
check_byte=bitand(sum(A(:)),hex2dec('FF'));

THE END~

相关推荐
南宫萧幕13 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
charlie11451419114 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler0114 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
神仙别闹17 小时前
基于 MATLAB 实现的 DCT 域的信息隐藏
开发语言·matlab
三品吉他手会点灯18 小时前
STM32 VSCode 开发-C/C++的环境配置中,找不到C/C++: Edit Configurations选项
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
三品吉他手会点灯19 小时前
C语言学习笔记 - 1.C概述 - 本讲内容概述
c语言·笔记·学习
沅_Yuan21 小时前
基于高斯径向基函数GRBF的多输入单输出神经网络模型【MATLAB】
神经网络·matlab·多输入单输出·rbf·高斯·grbf
水饺编程1 天前
第5章,[标签 Win32] :获取设备环境的信息
c语言·c++·windows·visual studio
lhbian1 天前
C++、C与易语言:编程语言对比解析
c语言·开发语言·c++
꧁细听勿语情꧂1 天前
数据结构概念和算法、时间复杂度、空间复杂度引入
c语言·开发语言·数据结构·算法