VHDL什么时候不起作用

时间:2012-07-02 06:29:42

标签: vhdl

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

如果用户I / O设置基于用户可用的寄存器,则该模块应该小心(因此可以通过寄存器更改模式,而无需触及FPGA固件)。有8个输入引脚和8个输出引脚,以及4种工作模式:1x8,2x8,4x8,8x8。输出进入延迟/门生成器模块,然后输出。该模块的另一个功能是转换32位输入向量,其中实际上只分配了8个引脚,并将值(特定于FPGA - 电路板交互)转换为更有意义的值。

就像现在一样,无论clockcontrolREG的值是什么,else赶上对应于1x8模式的所有(00)模式都有效。 (我正在观察示波器上的正确输出),因此引脚分配没有任何问题。看起来由于某些原因我的所有when子句都被忽略了。

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

我尝试了两种不同的语法方式来描述相同的内容(line: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;

1 个答案:

答案 0 :(得分:4)

您是否打算在比较中使用十六进制常量?您应该在编译中收到有关不匹配长度的警告,如果您希望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);