【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 小时前
C++类和对象完全指南:从封装继承多态到内存布局的面向对象宝典(雨夜论道)
c语言·开发语言·c++·visual studio
三品吉他手会点灯2 小时前
C语言学习笔记 - 27.C编程预备计算机专业知识 - 什么是字节
c语言·开发语言·笔记·学习
邪修king5 小时前
C++ 继承超全详解:核心语法、作用域、默认函数、菱形继承与避坑指南
c语言·c++
nature_forest6 小时前
vivado2018.2固化程序方法之.bin文件固化法
windows·fpga开发
m0_46644103詹湛6 小时前
FPGA时序优化与高速接口实战手册
笔记·学习·fpga开发·硬件架构·verilog
upper20206 小时前
从零开始做Verilog实验--01--4位计数器
fpga开发
upper20206 小时前
从零开始动手做Verilog实验--02--模为60的BCD加法器
fpga开发
djarmy6 小时前
C 标准库 `<stdio.h>` 完整函数清单(官方标准 + 常用全部函数)
c语言·c++·算法
机器学习之心7 小时前
基于CPO-VMD冠豪猪优化优化变分模态分解与最小包络熵的自适应变分模态分解方法,附MATLAB代码
开发语言·matlab·cpo-vmd·冠豪猪优化优化变分模态分解
nbwenren7 小时前
基于AD9250数据接收的FPGA纯Verilog实现JESD204B协议及三套工程源码支持
fpga开发