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

时间:2015-06-08 09:33:13

标签: c variables vhdl transfer bits

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

在vhdl块“a”中,“data”定义如下,其中总共有14位,msb作为有符号位,后面的7位是整数,后6位是小数。

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

“scale”是表示峰值的任何数字,“in”是正弦波形。 “数据”是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中的另一个自定义块,说“块b”。

IOWR_ALTERA_AVALON_PIO_DATA(data_new_base, (int16_t)data_new);

我确信上面的方法有问题,因为我希望得到恒定的输出电压和电流,但我不断得到输出电压和电流,每秒都在变化。如果我将data_new直接从一个vhdl块提供给另一个vhdl块,我就没有这个问题。

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

1 个答案:

答案 0 :(得分:0)

也许你应该避免

中的浮点计算
 data_new = ((float)data/64.0f) * (a);

除以64是6位移位:

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

我希望您对data_new和数据不一样并不感到惊讶,即使a是64 。或者这就是你想要使用浮点运算的原因吗?

相关问题