我有一个连接到我的altera fpga的外设,并且能够使用SPI从中读取数据。我想将此传入数据存储到数组中,最好是作为浮点值。此外,我的计算机上有一个csv文件,想要将该数据存储在另一个数组中,然后在触发'start'信号后,将两个数组相乘,并通过rs-232将输出发送到我的电脑。关于如何解决这个问题的任何建议?从外设读取数据的代码如下:
// we sample on negative edge of clock
always @(negedge SCL)
begin
// data comes as MSB first.
MOSI_reg[31:0] <= {MOSI_reg[30:0], MOSI}; // left shift for MOSI data
MISO_reg[31:0] <= {MISO_reg[30:0], MISO}; // left shift for MISO data
end
谢谢。
答案 0 :(得分:0)
每个元素的32位1024x28矩阵需要FPGA中的917504位RAM,以及SPI数据的另外28 * 32 = 896位。将这两个矩阵相乘将得到一个1024x1元素的向量,从而为结果添加32768位。这将在您的设备中需要951168位。你的FPGA芯片有这个存储器吗?
Asumming you have,yes:您可以在设计中实例化一个ROM并使用$readmemh
或$readmemb
进行初始化(分别为二进制或十六进制形式的值)。
如果精确不成问题,那就去固定点,因为在浮点中实现乘法和加法是一项艰苦的工作。
然后你需要一个FSM用SPI数据填充源向量,进行乘法并将结果存储在目标向量中。您可以考虑实例化一个小型处理器来更轻松地完成工作
答案 1 :(得分:0)
乘法在硬件中并不重要,'assign c = a * b'不一定能产生你想要的东西。
如果您的FPGA具有DSP模块,您可以使用Altera的可定制IP内核之一在DSP模块中进行乘法运算。如果没有,您仍然可以使用IP内核以您想要的方式调整乘数(关于有符号/无符号,延迟等),并可能产生更好的结果。