VHDL合成错误。无法合成信号blk_指针,同步描述错误

VHDL合成错误。无法合成信号blk_指针,同步描述错误,vhdl,fpga,xilinx-ise,Vhdl,Fpga,Xilinx Ise,我对代码的合成有问题。 显示的错误是“无法合成信号blk_指针,同步描述错误。当前软件版本不支持您用于描述同步元素(寄存器、内存等)的描述样式。” 我想保存两台设备之间的通信消息。具有下降沿和上升沿的部分用于查找消息的当前部分,并创建指向该部分的指针(msg_指针、blk_指针)。然后我想将当前值保存到缓冲区 当我删除最后一个部分(使用for循环的部分)时,它会起作用 过程(通信延迟) 变量msg_指针:整数范围0到20:=0--指向多个消息块 变量blk_指针:整数范围0到50:=0--指向当

我对代码的合成有问题。 显示的错误是“无法合成信号blk_指针,同步描述错误。当前软件版本不支持您用于描述同步元素(寄存器、内存等)的描述样式。”

我想保存两台设备之间的通信消息。具有下降沿和上升沿的部分用于查找消息的当前部分,并创建指向该部分的指针(msg_指针、blk_指针)。然后我想将当前值保存到缓冲区

当我删除最后一个部分(使用for循环的部分)时,它会起作用

过程(通信延迟)
变量msg_指针:整数范围0到20:=0--指向多个消息块
变量blk_指针:整数范围0到50:=0--指向当前块中的若干位
变量buf_指针:整数范围0到13:=0--指向输出S14T7C7_TEMP buf中的若干位
变量S14T7C7_TEMP:STD_LOGIC_VECTOR(13向下至0):=“00000000000000”;
变量nzer:整数范围0到9:=0;
变量njed:整数范围0到9:=0;
变量拷贝:标准逻辑;
开始
如果下降沿(com延迟),则
如果com_级别时间>4500,则
msg_指针:=0;
blk_指针:=0;
buf_指针:=0;
elsif(com_水平时间<4500)和(com_水平时间>630)然后
msg_指针:=1;
blk_指针:=0;
buf_指针:=0;
如果blk_指针>=9,则
blk_指针:=0;

如果msg_指针最后一个循环与上升或下降
com_延迟
clock edge无关,因此不是很好的同步设计风格。你最好的选择是修改它的这一方面。你也有写在两个时钟边缘的信号;通常也不太好。您使用哪种ISE版本和目标平台?尝试启用新的VHDL解析器:XST进程首选项->其他XST命令行选项=
-使用_new_parser yes
。新的解析器支持更新的VHDL语法,可以将更多的描述形式转换为硬件。您也可以尝试使用
elsif上升沿(…)
或使用
if com\u delayed'事件,然后在每个时钟边缘触发
。DDR触发器仅支持输入和输出(IDDR、ODDR、…-原语)。@BrianDrummond-最后一个循环非常重要,因为它是根据上升沿或下降沿部分读取的值初始化缓冲区中的更改。我还需要在两个边缘做出反应,因为我想将串行通信消息复制到std_logic_向量。@Paebells我已经尝试了使用“事件”、“elsif”等的所有组合:(
process(com_delayed)
variable msg_pointer : INTEGER range 0 to 20:=0;    --pointing to a number of message block 
variable blk_pointer : INTEGER range 0 to 50:=0;    --pointing to a number of bit from the current block
variable buf_pointer : INTEGER range 0 to 13:=0;    --pointing to a number of bit in the output S14T7C7_TEMP buf
variable S14T7C7_TEMP : STD_LOGIC_VECTOR (13 downto 0):="00000000000000";
variable nzer : INTEGER range 0 to 9:=0;
variable njed : INTEGER range 0 to 9:=0;
variable copy : STD_LOGIC;

begin
    if falling_edge(com_delayed) then
        if com_level_time > 4500 then
            msg_pointer := 0;
            blk_pointer := 0;
            buf_pointer := 0;
        elsif ( com_level_time < 4500 ) and ( com_level_time > 630 ) then
            msg_pointer := 1;
            blk_pointer := 0;
            buf_pointer := 0; 
        elsif blk_pointer >= 9 then
            blk_pointer:=0; 
            if msg_pointer<6 then
                msg_pointer:=msg_pointer+1;
            end if;
        elsif com_level_time <= 80 then
            blk_pointer:=blk_pointer+1;
            njed:=1;
            copy:='1';
        elsif (com_level_time>80 and com_level_time<=142) then
            blk_pointer:=blk_pointer+2;
            njed:=2;
            copy:='1';
        elsif (com_level_time>142 and com_level_time<=200) then
            blk_pointer:=blk_pointer+3;
            njed:=3;
            copy:='1';
        elsif (com_level_time>200 and com_level_time<=274) then
            blk_pointer:=blk_pointer+4;
            njed:=4;
            copy:='1';
        elsif (com_level_time>274 and com_level_time<=336) then
            blk_pointer:=blk_pointer+5;
            njed:=5;
            copy:='1';
        elsif (com_level_time>336 and com_level_time<=396) then
            blk_pointer:=blk_pointer+6;
            njed:=6;
            copy:='1';
        elsif (com_level_time>396 and com_level_time<=460) then
            blk_pointer:=blk_pointer+7;
            njed:=7;
            copy:='1';
        elsif (com_level_time>460 and com_level_time<=526) then
            blk_pointer:=blk_pointer+8;
            njed:=8;
            copy:='1';
        elsif (com_level_time>526 and com_level_time<=630) then
            blk_pointer:=blk_pointer+9;
            njed:=9;
            copy:='1';
        end if;         
    end if;


    if rising_edge(com_delayed) then
        if com_level_time <= 80 then
            blk_pointer:=blk_pointer+1;
            nzer:=1;
            copy:='1';
        elsif (com_level_time>80 and com_level_time<=142) then
            blk_pointer:=blk_pointer+2;
            nzer:=2;
            copy:='1';
        elsif (com_level_time>142 and com_level_time<=200) then
            blk_pointer:=blk_pointer+3;
            nzer:=3;
            copy:='1';
        elsif (com_level_time>200 and com_level_time<=274) then
            blk_pointer:=blk_pointer+4;
            nzer:=4;
            copy:='1';
        elsif (com_level_time>274 and com_level_time<=336) then
            blk_pointer:=blk_pointer+5;
            nzer:=5;
            copy:='1';
        elsif (com_level_time>336 and com_level_time<=396) then
            blk_pointer:=blk_pointer+6;
            nzer:=6;
            copy:='1';
        elsif (com_level_time>396 and com_level_time<=460) then
            blk_pointer:=blk_pointer+7;
            nzer:=7;
            copy:='1';
        elsif (com_level_time>460 and com_level_time<=526) then
            blk_pointer:=blk_pointer+8;
            nzer:=8;
            copy:='1';
        elsif (com_level_time>526 and com_level_time<=630) then
            blk_pointer:=blk_pointer+9;
            nzer:=9;
            copy:='1';
        end if;
    end if;

    msg_pointer_ext:=msg_pointer;
    blk_pointer_ext:=blk_pointer;

    if copy='1' then        
        For it in 1 to 9 loop
            if nzer/=0 then
                message1(msg_pointer_ext)(blk_pointer_ext-nzer):='0';
                nzer:=nzer-1;
            end if;
        end loop;
    end if;
    copy:='0';
end process;
process(com_delayed)
variable msg_pointer : INTEGER range 0 to 20:=0;    --pointing to a number of message block 
variable blk_pointer : INTEGER range 0 to 50:=0;    --pointing to a number of bit from the current block
variable nzer : INTEGER range 0 to 9:=0;
variable njed : INTEGER range 0 to 9:=0;
variable copy : STD_LOGIC;

begin
    if rising_edge(com_delayed) then
        msg_pointer:=msg_pointer_ext;
        blk_pointer:=blk_pointer_ext;
        if com_level_time <= 80 then
            blk_pointer:=blk_pointer+1;
            nzer:=1;
            copy:='1';
        elsif (com_level_time>80 and com_level_time<=142) then
            blk_pointer:=blk_pointer+2;
            nzer:=2;
            copy:='1';
        elsif (com_level_time>142 and com_level_time<=200) then
            blk_pointer:=blk_pointer+3;
            nzer:=3;
            copy:='1';
        elsif (com_level_time>200 and com_level_time<=274) then
            blk_pointer:=blk_pointer+4;
            nzer:=4;
            copy:='1';
        elsif (com_level_time>274 and com_level_time<=336) then
            blk_pointer:=blk_pointer+5;
            nzer:=5;
            copy:='1';
        elsif (com_level_time>336 and com_level_time<=396) then
            blk_pointer:=blk_pointer+6;
            nzer:=6;
            copy:='1';
        elsif (com_level_time>396 and com_level_time<=460) then
            blk_pointer:=blk_pointer+7;
            nzer:=7;
            copy:='1';
        elsif (com_level_time>460 and com_level_time<=526) then
            blk_pointer:=blk_pointer+8;
            nzer:=8;
            copy:='1';
        elsif (com_level_time>526 and com_level_time<=630) then
            blk_pointer:=blk_pointer+9;
            nzer:=9;
            copy:='1';
        end if;

        if copy='1' then        
            For it in 1 to 9 loop
                if nzer/=0 then
                    message1(msg_pointer)(blk_pointer-nzer):='0';
                    nzer:=nzer-1;
                end if;
            end loop;
        end if;
        copy:='0';

        msg_pointer_ext:=msg_pointer;
        blk_pointer_ext:=blk_pointer;
    end if;

end process;


process(com_delayed)
variable msg_pointer : INTEGER range 0 to 20:=0;    --pointing to a number of message block 
variable blk_pointer : INTEGER range 0 to 50:=0;    --pointing to a number of bit from the current block
variable nzer : INTEGER range 0 to 9:=0;
variable njed : INTEGER range 0 to 9:=0;
variable copy : STD_LOGIC;

begin
    if falling_edge(com_delayed) then
        msg_pointer:=msg_pointer_ext;
        blk_pointer:=blk_pointer_ext;

        if com_level_time > 4500 then
            msg_pointer := 0;
            blk_pointer := 0;
        elsif ( com_level_time < 4500 ) and ( com_level_time > 630 ) then
            msg_pointer := 1;
            blk_pointer := 0;
        elsif blk_pointer >= 9 then
            blk_pointer:=0; 
            if msg_pointer<6 then
                msg_pointer:=msg_pointer+1;
            end if;
        elsif com_level_time <= 80 then
            blk_pointer:=blk_pointer+1;
            njed:=1;
            copy:='1';
        elsif (com_level_time>80 and com_level_time<=142) then
            blk_pointer:=blk_pointer+2;
            njed:=2;
            copy:='1';
        elsif (com_level_time>142 and com_level_time<=200) then
            blk_pointer:=blk_pointer+3;
            njed:=3;
            copy:='1';
        elsif (com_level_time>200 and com_level_time<=274) then
            blk_pointer:=blk_pointer+4;
            njed:=4;
            copy:='1';
        elsif (com_level_time>274 and com_level_time<=336) then
            blk_pointer:=blk_pointer+5;
            njed:=5;
            copy:='1';
        elsif (com_level_time>336 and com_level_time<=396) then
            blk_pointer:=blk_pointer+6;
            njed:=6;
            copy:='1';
        elsif (com_level_time>396 and com_level_time<=460) then
            blk_pointer:=blk_pointer+7;
            njed:=7;
            copy:='1';
        elsif (com_level_time>460 and com_level_time<=526) then
            blk_pointer:=blk_pointer+8;
            njed:=8;
            copy:='1';
        elsif (com_level_time>526 and com_level_time<=630) then
            blk_pointer:=blk_pointer+9;
            njed:=9;
            copy:='1';
        end if;

        if copy='1' then        
            For it in 1 to 9 loop
                if njed/=0 then
                    message1(msg_pointer)(blk_pointer-njed):='0';
                    njed:=njed-1;
                end if;
            end loop;
        end if;
        copy:='0';

        msg_pointer_ext:=msg_pointer;
        blk_pointer_ext:=blk_pointer;       
    end if;

end process;
process(clk_com, com_ecu38)
    variable com_clear : STD_LOGIC:='0';
    variable tclt : INTEGER range 0 to 32000:=0;
begin
    if rising_edge(clk_com) and tclt /= 31999 then
        tclt := tclt +1;
    end if;

    if com_ecu38'event then
        com_level_time:=tclt;
        com_clear:='1';
    end if;

    if com_clear='1' then 
        tclt:=0;
        com_delayed<=com_ecu38;
    end if;

    com_clear:='0';

end process;



process(com_delayed)
begin
    if rising_edge(com_delayed) then
        if com_level_time>20 and com_level_time<=80 then
            nzer:=1;
        elsif (com_level_time>80 and com_level_time<=142) then
            nzer:=2;
        elsif (com_level_time>142 and com_level_time<=200) then
            nzer:=3;
        elsif (com_level_time>200 and com_level_time<=274) then
            nzer:=4;
        elsif (com_level_time>274 and com_level_time<=336) then
            nzer:=5;
        elsif (com_level_time>336 and com_level_time<=396) then
            nzer:=6;
        elsif (com_level_time>396 and com_level_time<=460) then
            nzer:=7;
        elsif (com_level_time>460 and com_level_time<=526) then
            nzer:=8;
        elsif (com_level_time>526 and com_level_time<=630) then
            nzer:=9;
        else
            nzer:=0;
        end if;
        copy0<=not(copy0);
    end if;
end process;


process(com_delayed)
begin
    if falling_edge(com_delayed) then
        if com_level_time > 4500 then
            njed:=12;
        elsif com_level_time > 630 and com_level_time <= 4500 then
            njed:=11;
        elsif com_level_time>20 and com_level_time<=80 then
            njed:=1;
        elsif (com_level_time>80 and com_level_time<=142) then
            njed:=2;
        elsif (com_level_time>142 and com_level_time<=200) then
            njed:=3;
        elsif (com_level_time>200 and com_level_time<=274) then
            njed:=4;
        elsif (com_level_time>274 and com_level_time<=336) then
            njed:=5;
        elsif (com_level_time>336 and com_level_time<=396) then
            njed:=6;
        elsif (com_level_time>396 and com_level_time<=460) then
            njed:=7;
        elsif (com_level_time>460 and com_level_time<=526) then
            njed:=8;
        elsif (com_level_time>526 and com_level_time<=630) then
            njed:=9;
        else
            njed:=0;
        end if;
        copy1<=not(copy1);
    end if;
end process;


process(copy1, copy0)
variable n                  : INTEGER range 0 to 9:=0;
variable bit_to_write   : STD_LOGIC;
variable inc_msg            : STD_LOGIC;
variable c1                 : STD_LOGIC;
variable c0                 : STD_LOGIC;
variable msg_pointer    : INTEGER range 0 to 20:=0; --pointing to a number of message block 
variable blk_pointer    : INTEGER range 0 to 50:=0; --pointing to a number of bit from the current block

begin       
    if copy1'event then 
        n:=njed;
        c1:='1';
    elsif copy0'event then
        n:=nzer;
        c0:='1';
    end if;

    msg_pointer:=msg_pointer_ext;
    blk_pointer:=blk_pointer_ext;

    if c1='1' then
        bit_to_write:='1';
    elsif c0='1' then
        bit_to_write:='0';
    end if;

    if n=12 then
        msg_pointer:=0;
        blk_pointer:=0;
        com_ch_out<=not(com_ch_out);
    elsif n=11 then
        msg_pointer:=1;
        blk_pointer:=0;
    else
        if blk_pointer + n <9 then
            blk_pointer:=blk_pointer+n;
        else
            n:=9-blk_pointer;
            inc_msg:='1';
            blk_pointer:=9;
        end if;
        For it in 1 to 9 loop
            if n/=0 then
                message1(msg_pointer)(blk_pointer-n):=bit_to_write;
                n:=n-1;
            end if;
        end loop;
    end if;

    if inc_msg='1' then
        if msg_pointer<5 then
            blk_pointer_ext:=0;
            msg_pointer_ext:=msg_pointer+1;
        end if;
    else
        msg_pointer_ext:=msg_pointer;
        blk_pointer_ext:=blk_pointer;
    end if;

    n:=0;
    inc_msg:='0';
    c1:='0';
    c0:='0';

end process;

process(com_ch_out)
begin
    if com_ch_out'event then
        if latch_outputs='0' then
            if stc_decide = '0' then
                S14T7C7(0)<=message1(1)(1);
                S14T7C7(1)<=message1(1)(2);
                S14T7C7(2)<=message1(1)(3);
                S14T7C7(3)<=message1(1)(4);
                S14T7C7(4)<=message1(1)(5);
                S14T7C7(5)<=message1(1)(6);
                S14T7C7(6)<=message1(1)(7);
                S14T7C7(7)<=message1(2)(1);
                S14T7C7(8)<=message1(2)(2);
                S14T7C7(9)<=message1(2)(3);
                S14T7C7(10)<=message1(2)(4);
                S14T7C7(11)<=message1(2)(5);
                S14T7C7(12)<=message1(2)(6);
                S14T7C7(13)<=message1(2)(7);
            else
                S14T7C7(0)<=message1(4)(1);
                S14T7C7(1)<=message1(4)(2);
                S14T7C7(2)<=message1(4)(3);
                S14T7C7(3)<=message1(4)(4);
                S14T7C7(4)<=message1(4)(5);
                S14T7C7(5)<=message1(4)(6);
                S14T7C7(6)<=message1(4)(7);
                S14T7C7(7)<=C7I(0);
                S14T7C7(8)<=C7I(1);
                S14T7C7(9)<=C7I(2);
                S14T7C7(10)<=C7I(3);
                S14T7C7(11)<=C7I(4);
                S14T7C7(12)<=C7I(5);
                S14T7C7(13)<=C7I(6);        
            end if;
        end if;
    end if;
end process;