【发布时间】:2015-06-08 09:33:13
【问题描述】:
我正在编写 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”位数据长度,所以在我读取“data”后,我必须检查“data”是否为负数,如果是,我需要用位 '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 块,则不会出现此问题。
你能给我一些提示吗?已经尝试了一个星期仍然无法弄清楚。我正在尝试尽可能清楚地提出问题,如果应提供其他信息,请告诉我,非常感谢。
【问题讨论】:
标签: c variables vhdl transfer bits