求问高手一个VHDL的语言出错的问题

2019-03-25 10:20发布

其实是一个比较简单的不同时区的时间转换的程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY srxs4 IS
PORT(clk1 , clk2 , clk3 , clk4 , clk5 ,clk9,clk8:IN STD_LOGIC;
dis_out1 , dis_out2 , dis_out3, dis_out4:out STD_LOGIC_VECTOR(4 DOWNTO 0));
END srxs4;

ARCHITECTURE sq OF srxs4 IS

BEGIN
PROCESS(clk1 , clk2 , clk3 , clk4 , clk5 , clk9,clk8)
variable i1 , i2, i3 ,i4 ,i5 ,a1, a2,b1,b2,c1,c2: integer :=0;
variable X1,X2,X3,X4:STD_LOGIC_VECTOR(4 DOWNTO 0);


BEGIN

                  IF (clk1='1') then
                  i1:=1;
                  else i1:=0;
                  end if;
                 
                     
                  IF (clk2='1') then
                  i2:=8;
                  else i2:=0;
                  end if;
                  
                     
                  IF (clk3='1') then
                  i3:=4;
                  else i3:=0;
                  end if;
                  
                     
                  IF (clk4='1') then
                  i4:=2;
                  else i4:=0;
                  end if;
                  
                     
                  IF (clk5='1') then
                  i5:=1;
                  else i5:=0;
                  end if;
                  
                  
                     
                  if (clk9'event and clk9='1')then
                  a1:=i2 +i3+ i4 +i5;
                  
                   CASE a1 IS
                WHEN 0 => X2:="00000";--显示0 gfedcba
                WHEN 1 => X2:="00001";--显示1
                WHEN 2 => X2:="00010";--显示2
                WHEN 3 => X2:="00011";--显示3
                WHEN 4 => X2:="00100";--显示4
                WHEN 5 => X2:="00101";--显示5
                WHEN 6 => X2:="00110";--显示6
                WHEN 7 => X2:="00111";--显示7
                WHEN 8 => X2:="01000";--显示8
                WHEN 9 => X2:="01001";--显示9
                WHEN 10 => X2:="01010";--显示A
                WHEN 11 => X2:="01011";--显示B
                WHEN 12 =>X2:="01100";--显示C
                WHEN OTHERS => X2:="00000";
              END CASE;
              if i1=1 then X1:="01110";         
              else X2:="10011";                                 
              end if;
     
           c1:=i1;                                         --记录第一次的东时区or西时区
           b1:=a1;                                         --记录第一次的时区
          end if;
             
             if (clk9'event and clk9='0')then
             a2:=(i1*10+ i2 +i3+ i4 +i5);
                  
              CASE a2 IS
                WHEN 0 =>X3:="00000";
                         X4:="00000";--显示00
                WHEN 1 => X3:="00000";
                          X4:="00001";--显示01
                WHEN 2 => X3:="00000";
                          X4:="00010";--显示02
                WHEN 3 => X3:="00000";
                          X4:="00011";--显示03
                WHEN 4 => X3:="00000";
                          X4:="00100";--显示04
                WHEN 5 => X3:="00000";
                          X4:="00101";--显示05
                WHEN 6 => X3:="00000";
                          X4:="00110";--显示06
                WHEN 7 => X3:="00000";
                          X4:="00111";--显示07
                WHEN 8 => X3:="00000";
                          X4:="01000";--显示08
                WHEN 9 => X3:="00000";
                          X4:="01001";--显示09
                WHEN 10 =>X3:="00001";
                          X4:="00000";--显示10
                WHEN 11 =>X3:="00001";
                          X4:="00001";--显示11
                WHEN 12 => X3:="00001";
                           X4:="00010";--显示12
                WHEN 13 => X3:="00001";
                           X4:="00011";--显示13
                WHEN 14 => X3:="00001";
                           X4:="00100";--显示14
                WHEN 15 => X3:="00001";
                           X4:="00101";--显示15
                WHEN 16 => X3:="00001";
                           X4:="00110";--显示16
                WHEN 17 => X3:="00001";
                           X4:="00111";--显示17
                WHEN 18 => X3:="00001";
                           X4:="01000";--显示18
                WHEN 19 => X3:="00001";
                           X4:="01001";--显示19
                WHEN 20 => X3:="00010";
                           X4:="00000";--显示20
                WHEN 21 => X3:="00010";
                           X4:="00001";--显示21
                WHEN 22 => X3:="00010";
                           X4:="00010";--显示22
                WHEN 23 => X3:="00010";
                           X4:="00011";--显示23
                WHEN 24 => X3:="00010";
                           X4:="00100";--显示24
            WHEN OTHERS => X3:="00000";
                           X4:="00000";
              END CASE;
   
             b2:=a2;                                            --记录第一次的时间

             end if;



--第二次开始
IF clk8='1' then
           
          IF (clk1='1') then
                  i1:=1;
                  else i1:=0;
                  end if;
                 
                     
                  IF (clk2='1') then
                  i2:=8;
                  else i2:=0;
                  end if;
                  
                     
                  IF (clk3='1') then
                  i3:=4;
                  else i3:=0;
                  end if;
                  
                     
                  IF (clk4='1') then
                  i4:=2;
                  else i4:=0;
                  end if;
                  
                     
                  IF (clk5='1') then
                  i5:=1;
                  else i5:=0;
                  end if;
                  
                  
                     
                if(clk9'event and clk9='1')then
                  a1:=i2 +i3+ i4 +i5;
                  
                   CASE a1 IS
        WHEN 0 => X2:="00000";--显示0 gfedcba
                WHEN 1 => X2:="00001";--显示1
                WHEN 2 => X2:="00010";--显示2
                WHEN 3 => X2:="00011";--显示3
                WHEN 4 => X2:="00100";--显示4
                WHEN 5 => X2:="00101";--显示5
                WHEN 6 => X2:="00110";--显示6
                WHEN 7 => X2:="00111";--显示7
                WHEN 8 => X2:="01000";--显示8
                WHEN 9 => X2:="01001";--显示9
                WHEN 10 => X2:="01010";--显示A
                WHEN 11 => X2:="01011";--显示B
                WHEN 12 =>X2:="01100";--显示C
                WHEN OTHERS => X2:="00000";
              END CASE;
              if i1=1 then X1:="01110";         
              else X2:="10011";                                                   
                 end if;
        dis_out1<=X1;
        dis_out2<=X2;
        end if;

--开始计算

             if c1=1 then
                if i1=1 then
                   c2:= b2+a1-b1;
                else c2:=b2-b1-a1;
                end if;
             end if;
            
             if c1=0 then
                if i1=0 then
                   c2:= b2-(a1-b1);
                else c2:=b2+b1+a1;
                end if;
             end if;     
         
           if c2>24 then c2:=c2-24;
           end if;
           
           if c2<0  then c2:=c2+24;
           end if;            

      if (clk9'event and clk9='0')then
          a2:=c2;
       CASE a2 IS
                WHEN 0 =>X3:="00000";
                         X4:="00000";--显示00
                WHEN 1 => X3:="00000";
                          X4:="00001";--显示01
                WHEN 2 => X3:="00000";
                          X4:="00010";--显示02
                WHEN 3 => X3:="00000";
                          X4:="00011";--显示03
                WHEN 4 => X3:="00000";
                          X4:="00100";--显示04
                WHEN 5 => X3:="00000";
                          X4:="00101";--显示05
                WHEN 6 => X3:="00000";
                          X4:="00110";--显示06
                WHEN 7 => X3:="00000";
                          X4:="00111";--显示07
                WHEN 8 => X3:="00000";
                          X4:="01000";--显示08
                WHEN 9 => X3:="00000";
                          X4:="01001";--显示09
                WHEN 10 =>X3:="00001";
                          X4:="00000";--显示10
                WHEN 11 =>X3:="00001";
                          X4:="00001";--显示11
                WHEN 12 => X3:="00001";
                           X4:="00010";--显示12
                WHEN 13 => X3:="00001";
                           X4:="00011";--显示13
                WHEN 14 => X3:="00001";
                           X4:="00100";--显示14
                WHEN 15 => X3:="00001";
                           X4:="00101";--显示15
                WHEN 16 => X3:="00001";
                           X4:="00110";--显示16
                WHEN 17 => X3:="00001";
                           X4:="00111";--显示17
                WHEN 18 => X3:="00001";
                           X4:="01000";--显示18
                WHEN 19 => X3:="00001";
                           X4:="01001";--显示19
                WHEN 20 => X3:="00010";
                           X4:="00000";--显示20
                WHEN 21 => X3:="00010";
                           X4:="00001";--显示21
                WHEN 22 => X3:="00010";
                           X4:="00010";--显示22
                WHEN 23 => X3:="00010";
                           X4:="00011";--显示23
                WHEN 24 => X3:="00010";
                           X4:="00100";--显示24
            WHEN OTHERS => X3:="00000";
                           X4:="00000";
              END CASE;
      
       end if;

END IF;
       dis_out1<=X1;
       dis_out2<=X2;
       dis_out3<=X3;
       dis_out4<=X4;
      
      
END PROCESS ;
END sq;

可是一直出现
Error (10821): HDL error at srxs4.vhd(142): can't infer register for "X4[0]" because its behavior does not match any supported register model
这个问题,不知道是什么原因,求教一下。。。谢谢!
小弟是刚刚开始学,请多多包涵呐~ 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
eeleader
1楼-- · 2019-03-25 15:00
< /

可是一直出现
Error (10821): HDL error at srxs4.vhd(142): can't infer register for "X4[0]" because its behavior does not match any supported register model

 

上面意思说,X4[0]相关的寄存器不能综合,原因在于他的行为不匹配任何硬件可以支持的寄存器模型!

 

 

需要给你说明

在一个PROCESS的进程中只能有如下风格;

PROCESS(CLK,RST)

BGEGIN

IF (RST='1') THEN

  NULL;

ELSIF CLK'EVENT AND CLK='1'  THEN

  -----------语句

END IF;

 

 

 

END PROCESS;

 

 

stepan
2楼-- · 2019-03-25 15:12
端口信号是什么意思??
eeleader
3楼-- · 2019-03-25 20:42

楼上的兄弟说的啥端口信号问题?

stepan
4楼-- · 2019-03-26 00:16
 精彩回答 2  元偷偷看……
eeleader
5楼-- · 2019-03-26 00:46
这样啊,楼主的程序这个方面做的不好。普通信号和时钟信号命名都差不多。

一周热门 更多>