首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:无法合成信号signal_led,同步描述错误

错误:无法合成信号signal_led,同步描述错误
EN

Stack Overflow用户
提问于 2015-10-15 07:39:09
回答 1查看 409关注 0票数 0

我不明白为什么这个错误:

警告:Xst:819 "C:/Users/aa/Desktop/tools/MycourseDesign/control.vhd“行52:进程敏感性列表中缺少一个或多个信号。为了便于FPGA/CPLD硬件的综合,XST将假设所有必要的信号都在灵敏度列表中。请注意,合成的结果可能与最初的设计规范不同。缺失的信号是: ,,,,, 错误:Xst:827- "C:/Users/aa/Desktop/tools/MycourseDesign/control.vhd“行52:无法合成信号signal_led,同步描述错误.用于描述同步元素(寄存器、内存等)的描述样式。在当前的软件版本中不支持。

代码语言:javascript
复制
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL;



entity control is
    Port ( clkadd,clksub: in  STD_LOGIC;--脉冲
              --模式
           model : in  STD_LOGIC;
           r : in  STD_LOGIC;--置0端
              --led端输出  3位对应
           led : out  STD_LOGIC_VECTOR (2 downto 0);
              --q0-q4实现5个数码管的BCD码输出
           q0 : out  STD_LOGIC_VECTOR (3 downto 0);
           q1 : out  STD_LOGIC_VECTOR (3 downto 0);
           q2 : out  STD_LOGIC_VECTOR (3 downto 0);
           q3 : out  STD_LOGIC_VECTOR (3 downto 0);
           q4 : out  STD_LOGIC_VECTOR (3 downto 0));


end control;

architecture Behavioral of control is
    --signal 是全局量(只支持逻辑运算)
    --  variable是局部进程变量




    --满位标志
    signal isFull:std_logic_vector(4 downto 0);

    --0位标志
    signal isZero:std_logic_vector(4 downto 0);

    --数码管中继信号
    signal signal_q0,signal_q1,signal_q2,signal_q3,signal_q4:std_logic_vector(3 downto 0);


    --led灯表示选中状态    
    signal signal_led:std_logic_vector(2 downto 0);

begin


    --规定model为0时为移位操作,为1时为调数操作

    --加减数
    p_main:process(clkadd,clksub,r)


    begin
        --清0
        if(r='1')then

            signal_led<="000";  
            signal_q0<="0000";
            signal_q1<="0000";
            signal_q2<="0000";
            signal_q3<="0000";
            signal_q4<="0000";


         --加信号
        elsif(clkadd'event and clkadd='1')then

            --左移模式
            if(model='0')then
                if(signal_led="100")then
                    signal_led<="000";
                else
                    signal_led<=signal_led+1;
                end if;

            --加数模式
            elsif(model='1')then
                    signal_led<=signal_led;
                    if(signal_led="000")then
                            --进位
                            if(signal_q0="1001")then
                                if(isFull="11111")then
                                    signal_q0<=signal_q0;
                                --处理进位
                                else
                                    signal_q0<="0000";
                                    --二次进位
                                    if(signal_q1="1001")then
                                        signal_q1<="0000";
                                        --三次进位
                                        if(signal_q2="1001")then
                                            signal_q2<="0000";
                                            --四次进位
                                            if(signal_q3="1001")then
                                                signal_q3<="0000";
                                                signal_q4<=signal_q4+1;

                                            else
                                            signal_q3<=signal_q3+1;
                                            end if;

                                        else
                                            signal_q2<=signal_q2+1;
                                        end if;

                                    else
                                        signal_q1<=signal_q1+1;
                                    end if;


                                end if;
                            else
                            --加数
                                signal_q0<=signal_q0+1;
                            end if;

                    elsif(signal_led="001")then
                            --进位
                            if(signal_q1="1001")then
                                if(isFull(4 downto 1)="1111")then
                                    signal_q1<=signal_q1;
                                else
                                    signal_q1<="0000";
                                    --处理进位
                                    if(signal_q2="1001")then
                                        signal_q2<="0000";
                                        --二次进位
                                        if(signal_q3="1001")then
                                            signal_q3<="0000";
                                            signal_q4<=signal_q4+1;

                                        else
                                            signal_q3<=signal_q3+1;
                                        end if;

                                    else
                                        signal_q2<=signal_q2+1;
                                    end if;

                                end if;
                            else
                            --加数
                                signal_q1<=signal_q1+1;
                            end if;


                    elsif(signal_led="010")then
                            --进位
                            if(signal_q2="1001")then
                                if(isFull(4 downto 2)="111")then
                                    signal_q2<=signal_q2;
                                else
                                    signal_q2<="0000";
                                    if(signal_q3="1001")then
                                        signal_q3<="0000";
                                        signal_q4<=signal_q4+1;

                                    else
                                        signal_q3<=signal_q3+1;
                                    end if;

                                end if;
                            else
                            --加数
                                signal_q2<=signal_q2+1;
                            end if;


                    elsif(signal_led="011")then
                            --进位
                            if(signal_q3="1001")then
                                if(isFull(4 downto 3)="11") then
                                    signal_q3<=signal_q3;
                                else
                                signal_q3<="0000";
                                signal_q4<=signal_q4+1;

                                end if;
                            else
                            --加数
                                signal_q3<=signal_q3+1;
                            end if;


                    elsif(signal_led="100")then
                            --进位
                            if(signal_q4="0001")then
                                signal_q4<=signal_q4;
                            else
                            --加数
                                signal_q4<=signal_q4+1;
                            end if;

                    end if;


            end if;

            --减信号
        elsif(clksub'event and clksub='1')then
            --右移模式
            if(model='0')then
                if(signal_led="000")then
                    signal_led<="100";
                else
                    signal_led<=signal_led-1;
                end if;



            --减数模式
            elsif(model='1')then
                    signal_led<=signal_led;
                    if(signal_led="000")then
                        if(signal_q0="0000")then
                            if(isZero(4 downto 0)="11111")then
                                signal_q0<=signal_q0;
                            else
                                --借位
                                if(signal_q1="0000")then
                                    signal_q1<="1001";
                                    --二次借位
                                    if(signal_q2="0000")then
                                        signal_q2<="1001";
                                        --三次借位
                                        if(signal_q3="0000")then
                                            signal_q3<="1001";
                                            signal_q4<=signal_q4-1;
                                        else
                                            signal_q3<=signal_q3-1;
                                        end if;

                                    else
                                        signal_q2<=signal_q2-1;
                                    end if;


                                else
                                    signal_q1<=signal_q1-1;
                                end if;

                            end if;
                        else
                            signal_q0<=signal_q0-1;
                        end if;

                    elsif(signal_led="001")then
                        if(signal_q1="0000")then
                            if(isZero(4 downto 1)="1111")then
                                signal_q1<=signal_q1;
                            else
                                --借位
                                if(signal_q2="0000")then
                                    signal_q2<="1001";
                                    --二次借位
                                    if(signal_q3="0000")then
                                        signal_q3<="1001";
                                        signal_q4<=signal_q4-1;

                                    else
                                        signal_q3<=signal_q3-1;
                                    end if;

                                else
                                    signal_q2<=signal_q2-1;
                                end if;

                            end if;

                        else
                            signal_q1<=signal_q1-1;
                        end if;

                    elsif(signal_led="010")then
                        if(signal_q2="0000")then
                            if(isZero(4 downto 2)="111")then
                                signal_q2<=signal_q2;
                            --借位
                            else
                                signal_q2<="1001";
                                if(signal_q3="0000")then
                                    signal_q3<="1001";
                                    signal_q4<=signal_q4-1;

                                else
                                    signal_q3<=signal_q3-1;
                                end if;

                            end if;
                        else
                            signal_q2<=signal_q2-1;
                        end if;

                    elsif(signal_led="011")then
                        if(signal_q3="0000")then
                            if(isZero(4 downto 3)="11")then
                                signal_q3<=signal_q3;
                            else
                                signal_q3<="1001";
                                signal_q4<=signal_q4-1;

                            end if;
                        else
                            signal_q3<=signal_q3-1;
                        end if;


                    elsif(signal_led="100")then
                        if(signal_q4="0000")then
                            signal_q4<=signal_q4;
                        else
                            signal_q4<=signal_q4-1;
                        end if;

                    end if;

            end if;

        end if;



        led<=signal_led;
        q0<=signal_q0;
        q1<=signal_q1;
        q2<=signal_q2;
        q3<=signal_q3;
        q4<=signal_q4;
    end process p_main;



    --数位监控
    level0:process(signal_q0)
        begin
        if(signal_q0="0000")then
            isZero(0)<='1';
        else
            isZero(0)<='0';
        end if;

        if(signal_q0="1001")then
            isFull(0)<='1';
        else
            isFull(0)<='0';
        end if;
    end process level0;


    level1:process(signal_q1)
        begin
        if(signal_q1="0000")then
            isZero(1)<='1';
        else
            isZero(1)<='0';
        end if;

        if(signal_q1="1001")then
            isFull(1)<='1';
        else
            isFull(1)<='0';
        end if;
    end process level1;

    level2:process(signal_q2)
        begin
        if(signal_q2="0000")then
            isZero(2)<='1';
        else
            isZero(2)<='0';
        end if;

        if(signal_q2="1001")then
            isFull(2)<='1';
        else
            isFull(2)<='0';
        end if;
    end process level2;


    level3:process(signal_q3)
        begin
        if(signal_q3="0000")then
            isZero(3)<='1';
        else
            isZero(3)<='0';
        end if;

        if(signal_q3="1001")then
            isFull(3)<='1';
        else
            isFull(3)<='0';
        end if;
    end process level3;


    level4:process(signal_q4)
        begin
        if(signal_q4="0000")then
            isZero(4)<='1';
        else
            isZero(4)<='0';
        end if;

        if(signal_q4="0001")then
            isFull(4)<='1';
        else
            isFull(4)<='0';
        end if;
    end process level4;

end Behavioral;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-15 08:31:24

你的问题归结为:

代码语言:javascript
复制
process (clk_add, clk_sub, r)
begin
  if (r = '1') then
    -- reset
  elsif (rising_edge(clk_add)) then
    -- assign signal_led
  elsif (rising_edge(clk_sub)) then
    -- assign signal_led
  end if;
end process;

这里的基本问题是,在一个进程中,signal_led由两个不同时钟的边分配。在FPGA中没有任何东西可以复制这一点;在FPGA中没有像双时钟寄存器这样的东西,因此这是一个“糟糕的同步描述”。您需要重写代码,以便在每个进程中只使用一个时钟,但是如何做到这一点取决于clk_addclk_sub和其他输入之间的时间安排。

这方面的一个例子可能如下所示:

代码语言:javascript
复制
process (clk, r)
begin
  if (r = '1') then
    -- reset
    some_signal <= 0;
  elsif (rising_edge(clk)) then
    if (add = '1') then
      some_signal <= some_signal + 1;
    elsif (sub = '1') then
      some_signal <= some_signal - 1;
    end if;
  end if;
end process;

我还没有包含所有声明,也没有试图匹配代码的预期函数,但希望这会给您正确的想法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33142630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档