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

标签 c variables vhdl transfer bit

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

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

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

“scale”是表示峰值的任意数字,“in”是正弦波形。 “data”是Nios II的输入。

C代码中,最初,我使用下面的C代码从vhdl block 读取数据:

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中的另一个自定义 block ,例如“ block b”。因此,我需要使用以下代码将“data_new”格式化回 14 位而不是 16 位:

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

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

IOWR_ALTERA_AVALON_PIO_DATA(data_new_base, (int16_t)data_new);

我确信我上面的方法有问题,因为我期望获得恒定的输出电压和电流,但我不断获得每秒都在变化的输出电压和电流。如果我将 data_new 直接从一个 vhdl block 传送到另一个 vhdl block ,则不会出现此问题。

你能给我一些提示吗?尝试了一个星期还是没搞明白。我正在尝试尽可能清晰地提出问题,请告诉我是否需要提供其他信息,非常感谢。

最佳答案

也许你应该避免浮点计算

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

除以 64 是 6 位移位:

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

我希望您不会对 data_new 和 data 不相同感到惊讶,即使 a 是 64。或者这就是您想要使用浮点运算的原因?

关于c - fpga(14 位)vhdl 模块与 NIos II 系统(16 位)之间的数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30705618/

相关文章:

c++ - 我应该在 C++ 中为这个 600851475143 使用哪种数据类型?

vhdl - 无法将 .sof 文件加载到 Cyclone II fpga 板

android - 为多种架构生成优化的 NDK 代码?

从 COBOL 程序调用 C(公开的)函数

jquery - 更改字符串

javascript - 循环改变变量

c - 段错误/列表初始化

c - 有关命令终止这一事实的信息,C 中的 Shell

events - std_logic_vector 上的 VHDL 事件关键字

VHDL:将数值放入 STD_LOGIC_VECTOR 变量的代码