【问题标题】:Data transfer between fpga (14 bits) vhdl block to NIos II system (16 bits)fpga(14 位)vhdl 块到 NIos II 系统(16 位)之间的数据传输
【发布时间】: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


    【解决方案1】:

    也许你应该避免在

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

    除以 64 是 6 位移位:

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

    我希望你不会惊讶 data_new 和 data 不一样即使 a 是 64。或者这就是你要使用浮点运算的原因?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2013-10-31
      • 2015-02-11
      相关资源
      最近更新 更多