【问题标题】:VHDL when else doesnt workVHDL什么时候不工作
【发布时间】:2012-07-02 06:29:42
【问题描述】:

我是 VHDL 编程 FPGA 的新手,我的模块(见下面的完整代码)不起作用。

该模块应该根据用户可用的寄存器来处理用户 I/O 设置(因此可以通过寄存器更改模式,而无需接触 FPGA 固件)。有 8 个输入引脚和 8 个输出引脚,以及 4 种操作模式:1x8、2x8、4x8、8x8。输出进入延迟/门发生器模块,然后输出。该模块的另一个功能是转换 32 位输入向量,其中实际上只分配了 8 个引脚并携带一个值(特定于 FPGA 板交互)到更有意义的东西。

现在,无论clockcontrolREG 的值是多少,对应1x8 模式的else catch all (00) 模式都在工作。 (我在示波器上观察到正确的输出),所以引脚分配没有问题。由于某种原因,我的所有 when 子句似乎都被忽略了。

我确实将 clockcontrolREG 的初始值设置为“00000011”(应该将模式设置为 8x8),并且我确实访问了寄存器并检查了该值确实存在。

我尝试了 2 种不同的语法方式来描述相同的内容(行:signalforclkgen(1)),但没有效果。

看起来我错过了一些非常基本的东西......但这是我坐在它上面的第三天没有结果。感谢您提前提供的所有帮助。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity clkgencontrol is
    port(
        clockcontrolREG : in  std_logic_vector(31 downto 0);
        signalinput     : in  std_logic_vector(31 downto 0);
        signalforclkgen : out std_logic_vector(7 downto 0)

        );
end clkgencontrol;


architecture rtl of clkgencontrol is

begin


    signalforclkgen(0) <= signalinput(31);

    signalforclkgen(1) <= signalinput(15) when (clockcontrolREG(0) = '1' and clockcontrolREG(1) = '1') else
                          signalinput(31);

    signalforclkgen(2) <= signalinput(30) when (clockcontrolREG = "00000011") else
                          signalinput(15) when (clockcontrolREG = "00000010") else
                          signalinput(31);

    signalforclkgen(3) <= signalinput(14) when (clockcontrolREG = "00000011") else
                          signalinput(15) when (clockcontrolREG = "00000010") else
                          signalinput(31);

    signalforclkgen(4) <= signalinput(19) when (clockcontrolREG = "00000011") else
                          signalinput(30) when (clockcontrolREG = "00000010") else
                          signalinput(15) when (clockcontrolREG = "00000001") else
                          signalinput(31);

    signalforclkgen(5) <= signalinput(3) when (clockcontrolREG = "00000011") else
                          signalinput(30)when (clockcontrolREG = "00000010") else
                          signalinput(15)when (clockcontrolREG = "00000001") else
                          signalinput(31);


    signalforclkgen(6) <= signalinput(18) when (clockcontrolREG = "00000011") else
                          signalinput(14) when (clockcontrolREG = "00000010") else
                          signalinput(15) when (clockcontrolREG = "00000001") else
                          signalinput(31);

    signalforclkgen(7) <= signalinput(2) when (clockcontrolREG = "00000011") else
                          signalinput(14) when (clockcontrolREG = "00000010") else
                          signalinput(15) when (clockcontrolREG = "00000001") else
                          signalinput(31);
end rtl;

【问题讨论】:

  • 我确实确认所有 WHEN 子句都被忽略了,方法是修改 signalforclkgen(7) 分配,将所有其他内容设为 0,而不是有效信号(并添加 reg 值为“00000000”的选项")。确实有一个 0 输出。
  • 这是在什么工具链上编译的?
  • Quartus II v 11.0 Web,FPGA 是 Cyclone,如果这就是你要问的。

标签: vhdl


【解决方案1】:

您是否打算在比较中使用十六进制常量?您应该在编译中收到有关长度不匹配的警告,并且如果您期望clockcontrolREG(b00000000_00000000_00000000_00010000)中的十六进制值为0x00000010,则与您要比较的二进制值不匹配:bxxxxxxxx_xxxxxxxx_xxxxxxxx_00000010

尝试使用 32 位十六进制常量进行 clockcontrolREG 比较,看看是否有帮助:

signalforclkgen(2)  <= signalinput(30) when ( clockcontrolREG = x"00000011" ) else 
                  signalinput(15) when ( clockcontrolREG = x"00000010" ) else 
                  signalinput(31);

【讨论】:

  • 你是我的英雄查尔斯,非常感谢你,这帮助了你,现在就像一个魅力。虽然编译中没有这样的警告......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多