首页 文章

VHDL什么时候不起作用

提问于
浏览
1

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

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

就像现在一样,无论clockcontrolREG的值是什么,else catch捕获对应于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 回答

  • 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);
    

相关问题