【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~

相关推荐
安妮细水长流1 小时前
ad7124
c语言·单片机
花月mmc3 小时前
【FPGA】神经网络内容简介预告
嵌入式硬件·深度学习·神经网络·fpga开发
Zwawa18 小时前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
Evand J19 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
心仪久了会沦陷1 天前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
Severus_black1 天前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
希和20271 天前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Zwawa2 天前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake2 天前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
田甲2 天前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言