我正在编写C代码来在Cyclone IV E中对Altera Nios II系统进行编程。Nios II系统用于控制Quartus II中用VHDL编写的一些自定义FPGA模块。
在vhdl block “a”中,“data”定义如下,总共14位,msb为有符号位,后面7位是整数,最后6位是小数。
data <= to_slv(resize(scale*to_sfixed(in, 0, -11), 7, -6));
“scale”是表示峰值的任意数字,“in”是正弦波形。 “data”是Nios II的输入。
在C代码中,最初,我使用下面的C代码从vhdl block 读取数据:
int16_t data=0;
data = IORD_ALTERA_AVALON_PIO_DATA(data_base);
在C代码中,由于Altera编译器仅支持“8”,“16”或“32”位数据长度,因此在读取“data”后,我必须检查“data”是否为负数,如果是,我需要用位“1”填充 msb,如以下代码所示:
if (data & 0x2000)
data |= 0xC000;
此后,Nios 系统会进行一些计算(例如乘以“a”)以给出“data”的新值,例如将其命名为“data_new”。
data_new=((float)data/ 64.0f)*(a);
计算后,我想将“data_new”分配回vhdl中的另一个自定义 block ,例如“ block b”。因此,我需要使用以下代码将“data_new”格式化回 14 位而不是 16 位:
if (data_new & 0x2000)
data_new &= 0x3fff;
最后,我将“data_new”写回 vhdl 中的另一个自定义 block ,即“block b”。
IOWR_ALTERA_AVALON_PIO_DATA(data_new_base, (int16_t)data_new);
我确信我上面的方法有问题,因为我期望获得恒定的输出电压和电流,但我不断获得每秒都在变化的输出电压和电流。如果我将 data_new 直接从一个 vhdl block 传送到另一个 vhdl block ,则不会出现此问题。
你能给我一些提示吗?尝试了一个星期还是没搞明白。我正在尝试尽可能清晰地提出问题,请告诉我是否需要提供其他信息,非常感谢。
最佳答案
也许你应该避免浮点计算
data_new = ((float)data/64.0f) * (a);
除以 64 是 6 位移位:
data_new = (data >> 6) * (a);
我希望您不会对 data_new 和 data 不相同感到惊讶,即使 a 是 64。或者这就是您想要使用浮点运算的原因?
关于c - fpga(14 位)vhdl 模块与 NIos II 系统(16 位)之间的数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30705618/