无法解析网络“clk_1hz”

时间:2015-07-22 09:07:56

标签: vhdl fpga

!! EDIT !!

好的,所以在完成一些教程后,我现在正在尝试创建一个类似的过程,因为我按一个按钮来改变LED闪烁的频率,但这次使用的是多路复用器。现在的问题是标题中的错误,错误(10028):无法解析网络“clk_1hz”的多个常量驱动程序。现在我已经阅读了所有不同的帖子,但我似乎无法识别我做错了什么......我明白它告诉我,我正在为“clk_1hz”和“clk_4hz”分配多个不同的来源,但是它告诉我这是在代码的端口映射中发生的。我的印象是端口映射相当于“焊接”不同组件的输入和输出?

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

    entity blinking_led is
        port(
            clk_50mhz : in std_logic ;
            btn_one : in std_logic;
            green_led : out std_logic
        );
    end entity;

    architecture behave of blinking_led is

        component MUXii
        port(
                a       : in std_logic;
                b       : in std_logic;
                sel     : in std_logic;
                z       : out std_logic
            );
        end component;

        component PLLii
        port(
                clk : in std_logic;
                y : out std_logic;
                x : out std_logic
            );
        end component;

    signal clk_1hz : std_logic ;
    signal clk_4hz : std_logic ;
    signal scaler : integer range 0 to 25000000 ;
    signal scaler_2 : integer range 0 to 12500000 ;
    signal LED  : std_logic ;
    signal a, b, z, sel, y, x : std_logic;

    begin

        Multiplexer_process : process( a, b, sel, z)
        begin
            if(sel = '1') then 
                z <= a;
            else
                z <= b;
            end if;
        end process Multiplexer_process;

    PLL_1_4_Hz : PLLii port map (
                clk     => clk_50mhz,
                y   => clk_1hz,
                x   => clk_4hz
            );

    MUX1 : MUXii port map (
                a   => clk_1hz,
                b   => clk_4hz,
                sel => btn_one,
                z   => LED
            );

    green_led <= LED;

        clk_1_4_hz_process : process( clk_50mhz )
        begin
            if(rising_edge(clk_50mhz)) then 
                if (scaler < 25000000) then 
                    scaler <= scaler + 1 ;
                    clk_1hz <= '0';
                else
                    scaler <= 0;
                    clk_1hz <= '1';
                end if;
                if (scaler_2 < 12500000) then 
                    scaler_2 <= scaler_2 + 1 ;
                    clk_4hz <= '0';
                else
                    scaler_2 <= 0;
                    clk_4hz <= '1';
                end if;
            end if;
        end process clk_1_4_hz_process;

    end behave;

编辑!!

所以我设法摆脱了我遇到的一些问题,所以代码现在......

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

    entity PLL is port(
        clk : in std_logic;
        y : out std_logic;
        x : out std_logic
    );
    end PLL;

    architecture behaviour of PLL is 

    signal scaler : integer range 0 to 25000000 ;
    signal scaler_2 : integer range 0 to 12500000 ;
    signal clk_1hz : std_logic ;
    signal clk_4hz : std_logic ;

    begin
    clk_1_4_hz_process : process( clk )
    begin 
        if(rising_edge(clk)) then 
            if (scaler < 25000000) then 
                scaler <= scaler + 1 ;
                clk_1hz <= '0';
                x <= clk_1hz;
            else
                scaler <= 0;
                clk_1hz <= '1';
                x <= clk_1hz;
            end if;
        if (scaler_2 < 12500000) then 
            scaler_2 <= scaler_2 + 1 ;
            clk_4hz <= '0';
            y <= clk_4hz;
        else
            scaler_2 <= 0;
            clk_4hz <= '1';
            y <= clk_4hz;
        end if;
    end if;
    end process;

    end behaviour;


    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

    entity MUX2to1 is port(
        A       : in std_logic;
        B       : in std_logic;
        Sel     : in std_logic;
        Z       : out std_logic
        );
    end MUX2to1;

    architecture behavior of MUX2to1 is
    begin
        MUX2to1_p : process (Sel, A, B) 
        begin
            if (Sel = '1') then
                Z <= A;
            else 
                Z <= B;
            end if; -- note that *end if* is two words
        end process;
    end behavior;

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

    entity Com_Connect is port(
            clk_50mhz : in std_logic;
            btn_one : in std_logic;
            green_led : out std_logic
            );
    end Com_Connect;

    Architecture behaviour of Com_Connect is

    component PLL
    port(
        clk : in std_logic;
        y : out std_logic;
        x : out std_logic
    );
    end component PLL;

    component MUX2to1
    port(
        A       : in std_logic;
        B       : in std_logic;
        Sel     : in std_logic;
        Z       : out std_logic
    );
    end component MUX2to1;

    signal wire_one, wire_two : std_logic; 

    begin

    PLL1 :PLL port map (
    clk => Clk_50mhz, 
    y => wire_one, 
    x => wire_two
    );

    MUX2to1_1 : MUX2to1 port map (
    A => wire_two,
    B => wire_one, 
    Sel => btn_one,
    Z => green_led
    );

    end;

虽然这没有错误,但它不起作用(没有任何反应,没有LED点亮,模拟是空白等),它确实有几个警告,如

警告(15714):某些引脚的I / O分配不完整。有关详细信息,请参阅I / O分配警告报告

严重警告(332148):未达到时间要求

第一个我不明白,因为它指的是我知道我已经在引脚分配模块中映射的LED。 第二个对我来说有点神秘,仍然试图弄明白。有没有人有任何网站推荐或书籍可以帮助我更好地掌握这些基础知识?

干杯!

2 个答案:

答案 0 :(得分:1)

每个process中的第一个语句应为if rising_edge (clk),以便该进程中的所有内容都被视为注册。如果没有这个,你就告诉FPGA软件将内容视为组合逻辑或锁存器。

以下概述了FPGA软件用来决定是生成寄存器,锁存器还是组合逻辑的规则:

  • 注册:流程中的每个分配仅在时钟边缘触发(例如if rising_edge (clk))。

  • 组合逻辑:进程始终分配给它的所有输出。输入不包括任何时钟信号。

  • 锁存:其他任何东西,例如一个信号并不总是被分配。

通常你应该避免产生锁存器的代码。它们不能很好地工作(如果有的话)。您的LED输出是由锁存器生成的,因为它并不总是被分配。

答案 1 :(得分:1)

您的修改完全改变了问题。请不要再这样做了。 你现在似乎总体思路正确,但仍然存在一些问题。

首先,你没有展示你的mux和pll组件的实现,虽然我可以根据他们的名字猜测他们做了什么。您看到多个驱动程序的原因是因为您的组件与您的进程执行相同的操作,并且组件和进程都在尝试驱动慢速时钟和LED输出。删除你的组件;仅这些过程就足够了。

多路复用器进程中使用的信号名称与其他地方使用的信号名称不匹配。

你的“1Hz”时钟将以2Hz运行。 慢速时钟的占空比为1:12-25百万,因为在整个慢速时段内,只有慢速时钟在单个50MHz周期内变高。您需要1:1或50%的占空比。您可以通过在计数器到期时切换慢速时钟来实现这一点。请注意,这也将使频率减半,因此1Hz时钟实际上是1Hz,但4Hz将变为2Hz。

如果您更改为切换并希望它在模拟中工作,则需要设置默认值,或定义重置行为并在模拟中重置。你应该模拟你写的一切!

编辑:跟进您的更新:

  • 你已经适当地去了一个仅限组件的模型(虽然额外的 可能是1-liner的多路复用器的样板不是我的首选 风格),但你的大问题仍然是工作周期真的, 真的很低如此之低,以至于你的LED不能长时间闪烁 人眼看到它。
  • 仍然存在错误的频率问题。
  • I / O警告不是由您的VHDL直接引起的,因为引脚分配 在那里没有处理。
  • 因为这是一个很慢的简单设计,所以你并不需要 过分担心时间安排。你可能没有给它任何 时间限制,这就是它说它不符合时间的原因。如果 你曾经继续做更复杂的数字逻辑或使用 更高的频率(100 + MHz),正确约束和会议 时机变得很重要。

我也有一些非常错误的错误:

  • 名为PLL的组件不是PLL,它只是一个时钟分频器。 更确切地说,它是一个柜台。大多数FPGA,除了实际 锁相环,具有与之类似的时钟分频器 织物内的计数器,但经过加固可以更快地运行并连接到 高速时钟所需的专用时钟路由。
  • 您的Com_Connect架构是 虽然你的名字是在结构上写的,但不是行为上的 behaviour