繁体   English   中英

fpga(14位)vhdl块到NIos II系统(16位)之间的数据传输

[英]Data transfer between fpga (14 bits) vhdl block to NIos II system (16 bits)

我正在编写C代码以在Cyclone IV E中对Altera Nios II系统进行编程。NiosII系统用于控制Quartus II中用VHDL编写的一些自定义FPGA模块。

在vhdl块“ a”中,“数据”定义如下,其中共有14位,msb为有符号位,随后的7位为整数,最后6位为小数。

data <= to_slv(resize(scale*to_sfixed(in, 0, -11), 7, -6));

“刻度”是代表峰值的任何数字,“输入”是正弦波形。 “数据”是Nios II的输入。

首先,在C代码中,我使用以下C代码从vhdl块读取数据:

int16_t data=0;
data =  IORD_ALTERA_AVALON_PIO_DATA(data_base);

在C代码中,由于Altera编译器仅支持数据长度的“ 8”,“ 16”或“ 32”位,因此在读取“数据”后,我必须检查“数据”是否为负,是否需要,用位“ 1”填充MSB,如以下代码所示:

if (data & 0x2000) 
     data |= 0xC000;

此后,Nios系统进行一些计算(例如,乘以“ a”)以得出“ data”的新值,将其命名为“ data_new”。

data_new=((float)data/ 64.0f)*(a);

计算之后,我想将“ data_new”分配回vhdl中的另一个自定义块,例如“块b”。 因此,我需要使用以下代码将“ data_new”格式化为14位而不是16位:

if (data_new & 0x2000) 
      data_new &= 0x3fff;

最后,我将“ data_new”写回到vhdl中的另一个自定义块,即“ block b”。

IOWR_ALTERA_AVALON_PIO_DATA(data_new_base, (int16_t)data_new);

我确信上面的方法有问题,因为我期望获得恒定的输出电压和电流,但是我一直得到的输出电压和电流每秒都在变化。 如果我将data_new直接从一个vhdl块直接馈送到另一个vhdl块,我没有这个问题。

你能给我一些提示吗? 已经尝试了一个星期仍然无法弄清楚。 我正在尽力澄清这个问题,如果可以提供更多信息,请告诉我,非常感谢。

也许您应该避免在

 data_new = ((float)data/64.0f) * (a);

除以64是6位移位:

 data_new = (data >> 6) * (a);

我希望即使a为64 ,data_new和data也不会相同,不要感到惊讶。 还是这就是为什么要使用浮点运算的原因?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM