VHDL:无法合成信号

时间:2016-03-10 08:47:36

标签: vhdl

  

第62行:信号s无法合成,同步描述不良。   用于描述同步元素的描述样式   (当前软件不支持(寄存器,内存等)   释放。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clock is
    Port ( start : in  STD_LOGIC;                       
           reset : in  STD_LOGIC;                       
           CLOCK : in  STD_LOGIC;                       
           setH, setM, setS : in  STD_LOGIC;            
           alarmH, alarmM, alarmS : in  STD_LOGIC; 
           Alarm_On : in  STD_LOGIC;                    
           Buzzer_Stop : in  STD_LOGIC;                 
           BUZZER : out STD_LOGIC;                      
           hh, mm, ss : out INTEGER);                   
end clock;

architecture Behavioral of clock is

signal h, m, s : INTEGER range 0 to 60 := 0;
signal hA, mA, sA : INTEGER range 0 to 60 := 0;
signal clk : std_logic :='0';
signal count : integer :=1;

begin

Frequency_Reducer : process(CLOCK)  --Reducing Frequency From 40MHz to 1Hz
begin
    if rising_edge(CLOCK) then
            count <= count + 1;
        if(count = 20000000) then
            clk <= not clk;
            count <=1;
        end if;
    end if;
end process;

Clock_Logic : process(start, reset, clk)
begin
    if reset = '1' then  
        h <= 00;
        m <= 00;
        s <= 0;
    end if;

    if start = '1' then   
        if rising_edge(clk) then        --Clock Logic Start
            s <= s + 1; 
        end if;
    end if;

        if s = 60 then
            s <= 0;
            m <= m + 1;
        end if; 
        if m = 60 then 
            m <= 0;
            h <= h + 1;
        end if; 
        if h = 24 then
            h <= 0;
        end if;                             --Clock Logic End

    if setH = '1' then                  --Set Time Logic Start
        h <= h + 1;
    end if;
    if setM = '1' then
        m <= m + 1;
    end if;
    if setS = '1' then
        s <= s + 1;
    end if;                                 -- Set Time Logic End
end process;

hh <= h;
mm <= m;
ss <= s;

end Behavioral;

1 个答案:

答案 0 :(得分:3)

让我们来看看信号s的分配:

Clock_Logic : process(start, reset, clk)
begin
    if reset = '1' then  
        s <= 0;
    end if;

    if start = '1' then   
        if rising_edge(clk) then        --Clock Logic Start
            s <= s + 1; 
        end if;
    end if;

    if s = 60 then
        s <= 0;
    end if; 

    if setS = '1' then
        s <= s + 1;
    end if;                                 -- Set Time Logic End
end process;

在上一次分配中,当s为高并且执行(恢复)进程时,您正在请求setS递增。最初在系统启动后以及每次灵敏度列表中的一个信号发生变化时执行该过程。因此,您要求在三个信号startresetclock的两个边沿上提供时钟的触发器。我怀疑,这个增量应该只在时钟的上升沿完成:

    if rising_edge(clk) then        --Clock Logic Start
        if setS = '1' then
            s <= s + 1;
        end if;                                 -- Set Time Logic End
    end if;

s达到60时,s的异步复位是可能的,但由于毛刺而容易出错。 s是硬件中的多位信号。因此,当它增加时,即使最终值低于60,它也可以在短时间内等于60!当前值为59时,您应将同步重置为0。

s为高并且时钟上升沿发生时start的增量是可以的,但是综合工具经常要求重新排列这个以便外部if阻止检查上升沿:

    if rising_edge(clk) then        --Clock Logic Start
        if start = '1' then   
            s <= s + 1; 
        end if;
    end if;

最后,触发器上的异步复位(或置位)输入始终比同步数据输入具有更高的优先级。因此,您必须以这种方式安排它:

Clock_Logic : process(reset, clk)
begin
    if reset = '1' then
        -- asynchronous part
        s <= 0;
    elsif rising_edge(clk) then
        -- synchronous part (add more conditions if required)
        s <= s + 1;
    end if;
end process;

或者这样:

Clock_Logic : process(reset, clk)
begin
    if rising_edge(clk) then
        -- synchronous part (add more conditions if required)
        s <= s + 1;
    end if;
    if reset = '1' then
        -- asynchronous part
        s <= 0;
    end if;
end process;

同步分配可能更复杂。例如,如果您希望同步在计数器达到59时重置计数器,并在信号setS为高时以其他方式递增计数器:

Clock_Logic : process(reset, clk)
begin
    if reset = '1' then
        -- asynchronous part
        s <= 0;
    elsif rising_edge(clk) then
        -- synchronous part
        if s = 59 then
            s <= 0;
        elsif setS = '1' then
            s <= s + 1;
        end if;
    end if;
end process;