目的:使用加法器,将两个输入数据相加输出,并且在matlab中验证计算误差。

数据的获取

由于人工设定数据量小,而大批量数据设定麻烦,因此要提前做处理。思路是利用两块RAM来存储起始数据,输入到加法器进行相加。Quartus可以使用mif文件进行RAM的初始化,vivado则可使用coe文件进行初始化。

为了使数据有一定的随机性又不失规律性,我们对正弦波进行采样,以获取位宽为8,位深为1024的数据,实际上这并不是最佳建议,因为位宽为8而位深为1024意味着有很大部分的数据会重叠,但从验证角度而言我们选择忽略这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <math.h>

#define PI 3.141592
#define depth 1024 /*数据深度,即存储单元的个数*/
#define width 8 /*存储单元的宽度*/
int main(void)
{
int i,temp;
float s;

FILE *fp;
fp = fopen("Rand.coe","w"); /*文件名随意,但扩展名必须为.coe*/
if(NULL==fp)
printf("Can not creat file!\r\n");
else
{
printf("File created successfully!\n");
/*
* 生成文件头:注意不要忘了“;”
*/
fprintf(fp,"memory_initialization_radix=16;\n");
fprintf(fp,"memory_initialization_vector=\n");
/*
* 以十六进制输出地址和数据
*/
for(i=0;i<depth-1;i++)
{
/*周期为1024个点的正弦波*/
s = sin(PI*i/512);
/*将-1~1之间的正弦波的值扩展到0-255之间*/
temp = (int)((s+1)*255/2);
/*以十六进制输出地址和数据*/
fprintf(fp,"%x,\n",temp);
}//end for
fprintf(fp,"ff;");

fclose(fp);
}
}

RAM IP核配置与说明(Block Memory Generator v8.4)

  • Interface Type

    • Native
      普通接口类型
    • AXI4
      AXI4接口是AMD和Xilinx常用的高速接口协议,简单而言是为了给高速外设定制的接口协议,能够高速地交换数据。
  • Memory Type

    • 单端口RAM:处理器暂存RAM、查找表
    • 简单双端口RAM:内容可寻址存储器、FIFO
    • 真正的双端口RAM:多处理器存储
    • 单端口ROM:程序代码存储、初始化ROM
    • 双端口ROM:两个处理器/系统之间共享的单ROM
  • ECC Options
    纠错选项,不关心

  • Write Enable

    • Byte Write Enable字节写使能,勾选则可以单独把数据的某个字节写入RAM/Rom中
  • Algorithm

    • 最小面积算法:使用最少数量的基元生成核心。
    • 低功耗算法:生成内核,以便在读取或写入操作期间启用最小数量的块RAM基元。
    • 固定基元算法:生成一个核心,连接单个基元类型以实现内存。在下拉列表中选择要使用的基元类型。
  • Memory Size

    • Write Width:写入数据宽度
    • Read Width:读数据位宽
    • Write Depth:写数据深度
    • Read Depth:读数据深度
    • Operating Mode:
      • 先写模式:在Write_First模式下,输入数据同时写入内存并在数据输出上驱动,如图所示。这种透明模式提供了在同一端口上进行写入操作期间使用数据输出总线的灵活性。 先写模式

      • 读取优先模式:在Read_First模式下,当输入数据存储在内存中时,先前存储在写入地址的数据会显示在数据输出上。这种先读后写的行为如图所示。 读取优先模式

      • 无更改模式:在No_Change模式下,输出锁存器在写入操作期间保持不变。如图3-11所示,数据输出仍然是以前的读取数据,不受同一端口上的写入操作的影响。 无更改模式

    • Enable Port Type:端口A的使能端
  • Port A Optional Output Registers:配置输出寄存器,如果有时序上会延迟一个周期。其余关心再查。

  • Port A Output Reset Options

  • READ Address Change A:是否需要复位引脚

  • Memory Initialization:初始化文件,我们使用C程序生成的coe文件进行初始化。

本实验RAM配置: 配置页1 配置页2 配置页3