首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无限HDL综合

无限HDL综合
EN

Stack Overflow用户
提问于 2014-04-03 02:05:44
回答 1查看 103关注 0票数 0

当我试图合成我的代码时,它陷入了一个无限循环,即它被HDL合成卡住了。我没有使用任何循环。但问题依然存在。

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


entity mat is
  port(
    start,clck,start4,add4,check4,delete3,start3,add3,final3,load,load3,load4,search3:in std_logic;
    data1,data2,newitem:in std_logic_vector(0 to 8);
    completeload4tocontroller,completeadd3,search3cmplt,completeload3tocontroller,
    completeloadtocontroller,discerncomplete,complete4add,completedel3,step4comptocntrl:out bit;
    data4,data6:out std_logic_vector(0 to 15));
end mat;

architecture Behavioral of mat is

  type positiveelem is array (0 to 255) of std_logic_vector(0 to 18);
  type negativeelem is array (0 to 255) of std_logic_vector(0 to 18);
  signal poselem:positiveelem ;
  signal negelem:negativeelem ;
  signal pospointer:integer range 0 to 255:=0;
  signal negpointer:integer range 0 to 255:=0;
  signal jpst:integer range 0 to 255 := 0;
  signal jnst:integer range 0 to 255 := 0;
  signal jp1st:integer range 0 to 255 := 0;
  signal jp2st:integer range 0 to 255 := 0;
  signal jn4st:integer range 0 to 255 := 0;
  signal jp4st:integer range 0 to 255 := 0;
  signal j3pntr:integer range 0 to 255 := 0;
  signal j3npntr:integer range 0 to 255 := 0;
  signal j3ptr:integer range 0 to 255 := 0;
  type list12 is array(0 to 65535) of integer range 0 to 31;
  signal clist:list12;
  signal limitcount:integer range 0 to 255 :=0;
  signal flag1:std_logic :='0';
  signal position:integer range 0 to 255;

begin

  P1:process(load,load4,clck,load3,check4,start,add4,start4,start3,delete3,add3)
    variable temp4:std_logic_vector(0 to 15);
    variable temp5:std_logic_vector(0 to 15);
    variable temp1:std_logic_vector(0 to 15);
    variable tempp3:std_logic_vector(0 to 15);

  begin 
    if(rising_edge(clck))then

      if(load='1')then                           
        poselem(pospointer) <= data1;
        negelem(negpointer) <= data2;
        pospointer <= pospointer + 1;
        negpointer <= negpointer + 1;
        limitcount <= limitcount + 1;

        if(limitcount = 10)then      
          completeloadtocontroller <= '1'; 
        end if;  

      elsif((load4 = '1') and (load ='0'))then
        poselem(pospointer) <= newitem;
        pospointer <= pospointer + 1;
        completeload4tocontroller <= '1';

      elsif((load3 = '1') and (load = '0'))then
        negelem(negpointer) <= newitem;
        negpointer <= negpointer + 1;
        completeload3tocontroller <= '1';              

      elsif(start = '1')then 
        if((jpst <= pospointer) and (jnst <= negpointer))then
          temp4 := poselem(jpst)(0 to 15) xor negelem(jnst)(0 to 15);  
          clist(conv_integer(temp4)) <= clist(conv_integer(temp4)) + 1;

          if((jnst = (negpointer - 1)) and (jpst < (pospointer - 1)))then
            jnst <= 0;
            jpst <= jpst + 1;
          elsif(jnst < (negpointer - 1) and (jpst < (pospointer - 1)))then
            jnst <= jnst + 1;
          elsif(jpst = (pospointer - 1) and (jnst < (negpointer - 1)))then
            jnst <= jnst + 1;
          elsif((jp1st = pospointer) and (jp2st = pospointer) and
            (jpst = pospointer) and (jnst =  negpointer))then
            discerncomplete <= '1';
          end if;

        end if;    


      elsif(start4 = '1')then 
        if(add4 = '1')then
          temp1 := newitem(0 to 15) xor negelem(jn4st)(0 to 15);
          if(clist(conv_integer(temp1)) = 0)then
            data4 <= temp1;
          end if;

          clist(conv_integer(temp1)) <= clist(conv_integer(temp1)) + 1; 

          if(jn4st < (negpointer - 1))then
            jn4st <= jn4st + 1;
          elsif((jp4st = pospointer - 1) and (jn4st = negpointer - 1))then
            complete4add <= '1';
          end if;    
        end if;

      elsif(start3 = '1')then
        if(delete3 = '1')then
          if((poselem(position)(0 to 15) /= poselem(j3pntr)) 
              and (poselem(position)(16 to 18) /= poselem(j3pntr)(16 to 18)))then
            tempp3 := poselem(position)(0 to 15) xor poselem(j3pntr)(0 to 15);         
            if(clist(conv_integer(tempp3)) = 1)then
              data6 <= tempp3;
            end if;
            if(clist(conv_integer(tempp3)) /= 0)then
              clist(conv_integer(tempp3)) <= clist(conv_integer(tempp3)) - 1;
            end if;

            if(j3pntr < (pospointer - 1))then
              j3pntr <= j3pntr + 1;
            elsif((j3pntr = pospointer - 1) and (j3npntr = negpointer - 1))then
              completedel3 <= '1';
              poselem(position) <= "0000000000000000000";  
            end if;
          end if;

        elsif(search3 = '1')then 
          if((poselem(position)(16 to 18) /= newitem(16 to 18)) 
            and (poselem(position)(0 to 15) = newitem(0 to 15)))then 
            flag1 <= '1';
          end if;
          if((position < pospointer) and (flag1 = '0'))then
            position <= position + 1;
          elsif(flag1 = '1')then                
            search3cmplt <= '1';
          end if;   

        elsif(add3 = '1')then
          tempp3 := newitem(0 to 15) xor poselem(j3ptr)(0 to 15);
          if(clist(conv_integer(tempp3)) = 0)then
            data4 <= tempp3;
          end if;
          clist(conv_integer(tempp3)) <= clist(conv_integer(tempp3)) + 1;
          if(j3ptr < pospointer - 1 and (j3ptr = (position - 1)))then
            j3ptr <= j3ptr + 2;
          elsif(j3ptr = (pospointer - 1))then 
            completeadd3 <= '1';
          else
            j3ptr <= j3ptr + 1;                       
          end if;
        end if;    
      end if;
    end if;
    if(falling_edge(clck))then
      if(start = '1')then      
        if((jp1st /= pospointer) and (jp2st /= pospointer) and   (poselem(jp1st)(16 to 18) /= poselem(jp2st)(16 to 18)) 
            and (poselem(jp1st)(0 to 15) /= poselem(jp2st)(0 to 15))) then
          temp5 := poselem(jp1st)(0 to 15) xor poselem(jp2st)(0 to 15);
          clist(conv_integer(temp5)) <= clist(conv_integer(temp5)) + 1;           
        end if;

        if(jp1st < (pospointer - 1) and jp2st = (pospointer-1))then
          jp1st <= jp1st + 1;
          jp2st <= 0;
        elsif(jp1st = (pospointer - 1) and jp2st < (pospointer-1))then
          jp2st <= jp2st + 1;
        elsif(jp1st < (pospointer - 1) and jp2st < (pospointer-1))then
          jp2st <= jp2st + 1;
        elsif((jp1st = pospointer) and (jp2st = pospointer) and (jpst = pospointer) and (jnst = negpointer))then
          discerncomplete <= '1';
        end if;


    elsif(start4 = '1')then
      if(add4 = '1')then
        if((poselem(jp4st)(0 to 15) /= "0000000000000000"))then
          if(poselem(jp4st)(0 to 15) /= newitem(0 to 15)) 
              and (poselem(jp4st)(16 to 18) /= newitem(16 to 18)))then
            temp1 := newitem(0 to 15) xor poselem(jp4st)(0 to 15);
            if(clist(conv_integer(temp1)) = 0)then
              data4 <= temp1;
            end if;

            clist(conv_integer(temp1)) <= clist(conv_integer(temp1)) + 1; 
          end if;

          if(jp4st < (pospointer - 1))then
            jp4st <= jp4st + 1;
          elsif((jp4st = pospointer - 1) and (jn4st = negpointer - 1))then
            complete4add <= '1';
          end if;
        end if;     

      elsif(start3 = '1')then
        if(delete3 = '1')then
          tempp3 := newitem(0 to 15) xor negelem(j3npntr)(0 to 15);          
          if(clist(conv_integer(tempp3)) = 1)then
            data6 <= tempp3; 
          end if;
          if(clist(conv_integer(tempp3)) = 0)then
            clist(conv_integer(tempp3)) <= clist(conv_integer(tempp3)) - 1; 
          end if;
          if(j3npntr < negpointer - 1 )then     
            j3npntr <= j3npntr + 1;
          elsif((j3pntr = pospointer - 1) and (j3npntr = negpointer - 1))then
            completedel3 <= '1';
            poselem(position) <= "0000000000000000000";               
          end if;
        end if;
      end if;
    end if;

  end process P1;
end Behavioral;
EN

回答 1

Stack Overflow用户

发布于 2014-04-03 03:55:57

我的评论解决了其中的一些问题,但我想我应该把它们键入作为答案,以添加更多的细节和澄清。

合成软件在某个步骤被卡住并锁定,这与你正在使用的任何特定语言结构几乎没有关系,可能意味着软件在解析你的代码时遇到了问题。虽然我会将其称为软件中的错误,但您可能可以通过查找语法错误来绕过它(如果您有访问权限,使用其他编译器,如ModelSim或其他编译器也可能会有所帮助)。例如,您似乎有一个if循环,您没有在if falling_edge(clck)下的某个地方关闭。您的代码行中还缺少一个(

代码语言:javascript
复制
if(poselem(jp4st)(0 to 15) /= newitem(0 to 15)) 
    and (poselem(jp4st)(16 to 18) /= newitem(16 to 18)))then

将9位向量data1赋值给19位向量poselem(pospointer) (以及其他类似的赋值)。检查您的端口和信号定义。

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

https://stackoverflow.com/questions/22819524

复制
相关文章

相似问题

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