VHDL:使用开关选择图像
VHDL: Selection of images using switches
我目前在 Basys3 FPGA 上使用 Vivado 中的 VGA,我遇到了一些问题。我想生成不同的图像(测试泥潭)。我为这些图像中的每一个都有一个单独的 .vhd 文件,还有一个顶级文件,我想在其中对这些图像使用多路复用器,以便将它们中的每一个分配给一个单独的开关。我的问题是:如果每个 .vhd 文件的输出都是三种颜色信号 RGB,我如何将图像分配给开关?
我尝试的是,我为每张图像分别命名这 3 个输出信号,并在开关打开时使用 case 结构将它们分配给最终输出信号。我会把它的一部分贴出来让你们明白:
这是顶级实体
entity VGAdraw is
Port ( CLK : in STD_LOGIC;
cntHor : in integer range 0 to cstHorTotSize - 1;
cntVer : in integer range 0 to cstVerTotSize - 1;
SW : in STD_LOGIC_VECTOR (15 downto 0);
LED : out STD_LOGIC_VECTOR (15 downto 0);
RED : out STD_LOGIC_VECTOR (3 downto 0);
GREEN : out STD_LOGIC_VECTOR (3 downto 0);
BLUE : out STD_LOGIC_VECTOR (3 downto 0)
);
end VGAdraw;
这是其中一张图片:
signal red5, green5, blue5, red7, green7, blue7: STD_LOGIC_VECTOR (3 downto 0);
component Checkers is
Port ( CLK : in STD_LOGIC;
cntHor : in integer range 0 to cstHorTotSize - 1;
cntVer : in integer range 0 to cstVerTotSize - 1;
red7 : out STD_LOGIC_VECTOR (3 downto 0);
green7 : out STD_LOGIC_VECTOR (3 downto 0);
blue7 : out STD_LOGIC_VECTOR (3 downto 0)
);
end component;
component Checkers
port map (CLK => CLK,
cntHor => cntHor,
cntVer => cntVer,
red7 => RED,
green7 => GREEN,
blue7 => BLUE
);
案例结构
process
begin
case SW is
when "0000000000100000" => RED <= red7;
GREEN <= green7;
BLUE <= blue7;
when others => RED <= red5;
GREEN <= green5;
BLUE <= blue5;
end case;
end process;
VGADraw 是顶级实体,我在其中将每个图像声明为不同的组件。就像上面那个。我如何将它们中的每一个分配到我的 FPGA 板上的一个开关,这样我就可以通过打开一个开关来改变我想要的图像?我也尝试了一些 'if generate' 语句,但没有结果。就像在这种情况下,在 Basys3 上有 16 个开关,通过打开 sw5,我想得到 Checkers 组件绘制的图像。
感谢您的帮助。
就在 process
开头你的代码应该是这样的:
signal red1, blue1, green1, red7, green7, blue7 red5, green5, blue5 : STD_LOCIC_VECTOR(3 downto 0);
一般来说,在进行 Structural
设计时,在完成组件后,您应该按照上面给出的方式声明您需要的信号。
我目前在 Basys3 FPGA 上使用 Vivado 中的 VGA,我遇到了一些问题。我想生成不同的图像(测试泥潭)。我为这些图像中的每一个都有一个单独的 .vhd 文件,还有一个顶级文件,我想在其中对这些图像使用多路复用器,以便将它们中的每一个分配给一个单独的开关。我的问题是:如果每个 .vhd 文件的输出都是三种颜色信号 RGB,我如何将图像分配给开关?
我尝试的是,我为每张图像分别命名这 3 个输出信号,并在开关打开时使用 case 结构将它们分配给最终输出信号。我会把它的一部分贴出来让你们明白:
这是顶级实体
entity VGAdraw is
Port ( CLK : in STD_LOGIC;
cntHor : in integer range 0 to cstHorTotSize - 1;
cntVer : in integer range 0 to cstVerTotSize - 1;
SW : in STD_LOGIC_VECTOR (15 downto 0);
LED : out STD_LOGIC_VECTOR (15 downto 0);
RED : out STD_LOGIC_VECTOR (3 downto 0);
GREEN : out STD_LOGIC_VECTOR (3 downto 0);
BLUE : out STD_LOGIC_VECTOR (3 downto 0)
);
end VGAdraw;
这是其中一张图片:
signal red5, green5, blue5, red7, green7, blue7: STD_LOGIC_VECTOR (3 downto 0);
component Checkers is
Port ( CLK : in STD_LOGIC;
cntHor : in integer range 0 to cstHorTotSize - 1;
cntVer : in integer range 0 to cstVerTotSize - 1;
red7 : out STD_LOGIC_VECTOR (3 downto 0);
green7 : out STD_LOGIC_VECTOR (3 downto 0);
blue7 : out STD_LOGIC_VECTOR (3 downto 0)
);
end component;
component Checkers
port map (CLK => CLK,
cntHor => cntHor,
cntVer => cntVer,
red7 => RED,
green7 => GREEN,
blue7 => BLUE
);
案例结构
process
begin
case SW is
when "0000000000100000" => RED <= red7;
GREEN <= green7;
BLUE <= blue7;
when others => RED <= red5;
GREEN <= green5;
BLUE <= blue5;
end case;
end process;
VGADraw 是顶级实体,我在其中将每个图像声明为不同的组件。就像上面那个。我如何将它们中的每一个分配到我的 FPGA 板上的一个开关,这样我就可以通过打开一个开关来改变我想要的图像?我也尝试了一些 'if generate' 语句,但没有结果。就像在这种情况下,在 Basys3 上有 16 个开关,通过打开 sw5,我想得到 Checkers 组件绘制的图像。
感谢您的帮助。
就在 process
开头你的代码应该是这样的:
signal red1, blue1, green1, red7, green7, blue7 red5, green5, blue5 : STD_LOCIC_VECTOR(3 downto 0);
一般来说,在进行 Structural
设计时,在完成组件后,您应该按照上面给出的方式声明您需要的信号。