我是VHDL的另一个新手,来自软件背景,这可能是我的第一个问题,但......
我是层次结构设计等的粉丝,我正在整理一个SOC示例来了解VHDL等。我在网上使用了很多例子并且搞乱他们以获得VHDL。< / p>
我已经创建了一个顶级主板,然后在主板上添加了组件。但是,看起来主板是UCF文件的唯一连接,这有点限制。我的例子是VGA控制器,我连接各种总线和来自主板的控制信号,但我不希望主板拥有所有视频信号,例如H_Sync,V_Sync和R()G()B()输出。
为了测试这个,我创建了一个非常简单的项目。顶部控制主板上的3个LED和作为组件的level1控制最终的LED。
这是一个ucf文件
NET "CLK_48MHz" LOC = "P56" ;
#KEY
NET "KEY1" LOC = P17;
NET "KEY2" LOC = P21;
NET "KEY3" LOC = P15;
NET "KEY4" LOC = P16;
#LED
NET "LED0" LOC = P97;
NET "LED1" LOC = P95;
NET "LED2" LOC = P94;
NET "LED3" LOC = P98;
顶级档案
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity top is
Port ( clk_48Mhz : in STD_LOGIC;
LED0 : out STD_LOGIC;
LED1 : out STD_LOGIC;
LED2 : out STD_LOGIC;
LED3 : out STD_LOGIC
);
end top;
architecture Behavioral of top is
signal Timer : integer range 0 to 50000000:= 0;
signal s_LED : std_logic :='0';
begin
Inst_Level1: entity work.Level1 PORT MAP(
clk_48MHz =>clk_48MHz,
LED2 => LED2
);
process (clk_48Mhz)
Begin
if rising_edge(clk_48Mhz) then
Timer <= Timer +1;
if Timer > 5000000 then
s_LED <= not(s_LED);
Timer <= 0;
end if;
end if;
end process;
LED0 <= not(s_LED);
LED1 <= s_LED;
-- LED2 <= not(s_LED);
LED3 <= s_LED;
end Behavioral;
和组件
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Level1 is
Port ( clk_48MHz : in STD_LOGIC;
LED2 : out STD_LOGIC);
end Level1;
architecture Behavioral of Level1 is
signal Timer : integer range 0 to 50000000:= 0;
signal s_LED : std_logic :='0';
begin
process (clk_48Mhz)
Begin
if rising_edge(clk_48Mhz) then
Timer <= Timer +1;
if Timer > 5000000 then
s_LED <= not(s_LED);
Timer <= 0;
end if;
end if;
end process;
LED2 <= s_LED;
end Behavioral;
以上作品。现在,如果我从顶部移除LED2并从映射中移除LED2 => LED2
,我原本期望level1在ucf文件中使用LED2,但它看起来不是,只是删除它。
有没有解决方法,因为我希望尽可能保持大项目的清洁和组件的自给自足。
先谢谢。