我正在编写 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块,我就没有这个问题。
你可以给我一些提示吗?已经尝试了一个星期仍然无法弄清楚。我想尽可能清楚地形成这个问题,如果应该提供更多信息,请告诉我。非常感谢。答案 0 :(得分:0)
也许你应该避免
中的浮点计算 data_new = ((float)data/64.0f) * (a);
除以64是6位移位:
data_new = (data >> 6) * (a);
我希望您对data_new和数据不一样并不感到惊讶,即使a是64 。或者这就是你想要使用浮点运算的原因吗?