1

我是 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 种不同的语法方式来描述相同的内容( 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;
4

1 回答 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);
于 2012-07-02T11:32:04.627 回答