VHDL中动态信号的生成及VHDL错误的解决方法;过程“;

VHDL中动态信号的生成及VHDL错误的解决方法;过程“;,vhdl,Vhdl,我是VHDL的新手,我在进程附近遇到了语法错误。我检查了解决方案,发现可能缺少end if语句,但在我的代码中没有这个问题 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.ALL; USE ieee.std_logic_arith.ALL; use STD.textio.all; entity Main_Architecture is port( SEN: out std_logic;

我是VHDL的新手,我在进程附近遇到了语法错误。我检查了解决方案,发现可能缺少end if语句,但在我的代码中没有这个问题

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
use STD.textio.all;

entity Main_Architecture is
port(
    SEN: out std_logic;
    reset: in std_logic;
    clk: in std_logic
    );
end Main_Architecture;

architecture Behavioral of Main_Architecture is
signal main_counter : std_logic_vector(7 downto 0)  := "00000000";
signal mux: std_logic_vector(1 downto 0) := "00";
signal output  : std_logic_vector(7 downto 0);
signal main_counter_int : integer range 0 to 127:=0;
signal main_generator : std_logic_vector(7 downto 0);


begin
process(main_counter,reset,clk)
    variable x: std_logic;
    variable y: std_logic;
    variable z: integer;
begin
    if(reset = '1') then
        main_counter <= (others => '0');
    end if;

    if(clk'event and clk='1') then

        if(mux="00") then                               --load main counter
            y:= main_counter(0);
            x:= (main_counter(0)XOR main_counter(6) XOR main_counter(7));
            main_counter(7 downto 1) <= main_counter(6 downto 0);
            main_counter(0)<=x;
            main_counter <= main_counter+'1';
            output(0)<=y;
            output(1)<=main_counter(0);
            output(2)<=main_counter(1);
            output(3)<=main_counter(2);
            output(4)<=main_counter(3);
            output(5)<=main_counter(4);
            output(6)<=main_counter(5);
            main_counter_int<=conv_integer(output);
            if(main_counter >= "11111111") then
                mux <= "01";
            end if;
        end if;

        if(mux="01") then
            if(main_counter_int < 2) then
                z:=1;
            else if(main_counter_int < 4) then
                z:=2;
            else if(main_counter_int < 8) then
                z:=3;
            else if(main_counter_int < 16) then
                z:=4;
            else if(main_counter_int < 32) then
                z:=5;
            else if(main_counter_int < 64) then
                z:=6;
            else if(main_counter_int < 128) then
                z:=7;
            end if;


        end if;

    end if;

end process;    -------- LINE 104  -------

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.std_logic_unsigned.ALL;
使用ieee.std_logic_arith.ALL;
使用STD.textio.all;
实体主_架构是
港口(
SEN:输出标准逻辑;
复位:在标准逻辑中;
时钟:在标准逻辑中
);
终端主_架构;
主要_架构的架构行为是
信号主计数器:标准逻辑向量(7到0):=“00000000”;
信号多路复用器:标准逻辑向量(1到0):=“00”;
信号输出:标准逻辑向量(7到0);
信号主计数器:整数范围0至127:=0;
信号主发生器:标准逻辑向量(7到0);
开始
过程(主计数器、复位、时钟)
变量x:std_逻辑;
变量y:std_逻辑;
变量z:整数;
开始
如果(重置='1'),则
主_计数器“0”);
如果结束;
如果(clk'事件和clk='1'),则
如果为(mux=“00”),则——加载主计数器
y:=主计数器(0);
x:=(主计数器(0)异或主计数器(6)异或主计数器(7));
主计数器(7至1)问题第1部分
在不研究代码中的任何其他问题的情况下,我认为问题在于这一部分,我已对其进行了重新格式化,以显示您缺少了多少“end if”语句:

    if(mux="01") then
        if(main_counter_int < 2) then
            z:=1;
        else
            if(main_counter_int < 4) then
                z:=2;
            else
                if(main_counter_int < 8) then
                    z:=3;
                else
                    if(main_counter_int < 16) then
                        z:=4;
                    else
                        if(main_counter_int < 32) then
                            z:=5;
                        else
                            if(main_counter_int < 64) then
                                z:=6;
                            else
                                if(main_counter_int < 128) then
                                    z:=7;
                                end if;


    end if;
这不是一个“真正的”标准库,还有许多其他的答案,人们建议不要使用这个库。如果您需要执行数学函数(例如,
+
),
使用ieee.numeric\u std.all,然后创建有符号或无符号类型的信号。在您的示例中,
main_计数器
将被声明为
signal main_计数器:unsigned(7到0):=“00000000”。然后,可以对该信号执行类似于
+
的操作,而不会对该信号是否应该被签名产生歧义

最后,本节:

        output(0)<=y;
        output(1)<=main_counter(0);
        output(2)<=main_counter(1);
        output(3)<=main_counter(2);
        output(4)<=main_counter(3);
        output(5)<=main_counter(4);
        output(6)<=main_counter(5);
旁注:输出(7)似乎从未分配过。

问题第1部分 在不研究代码中的任何其他问题的情况下,我认为问题在于这一部分,我已对其进行了重新格式化,以显示您缺少了多少“end if”语句:

    if(mux="01") then
        if(main_counter_int < 2) then
            z:=1;
        else
            if(main_counter_int < 4) then
                z:=2;
            else
                if(main_counter_int < 8) then
                    z:=3;
                else
                    if(main_counter_int < 16) then
                        z:=4;
                    else
                        if(main_counter_int < 32) then
                            z:=5;
                        else
                            if(main_counter_int < 64) then
                                z:=6;
                            else
                                if(main_counter_int < 128) then
                                    z:=7;
                                end if;


    end if;
这不是一个“真正的”标准库,还有许多其他的答案,人们建议不要使用这个库。如果您需要执行数学函数(例如,
+
),
使用ieee.numeric\u std.all,然后创建有符号或无符号类型的信号。在您的示例中,
main_计数器
将被声明为
signal main_计数器:unsigned(7到0):=“00000000”。然后,可以对该信号执行类似于
+
的操作,而不会对该信号是否应该被签名产生歧义

最后,本节:

        output(0)<=y;
        output(1)<=main_counter(0);
        output(2)<=main_counter(1);
        output(3)<=main_counter(2);
        output(4)<=main_counter(3);
        output(5)<=main_counter(4);
        output(6)<=main_counter(5);

旁注:输出(7)似乎从未被分配。

同上“重置”和“时钟”的单独“如果”语句。将它们合并到一个“if…elsif”语句中。此外,将信号
主计数器
放在过程的灵敏度列表中不会给代码描述的功能增加任何实质性内容,因此应该将其删除。与“reset”和“clk”的单独“if”语句相同。将它们滚动到一个“if…elsif”语句中。此外,将信号
主计数器
放在过程的灵敏度列表中不会给代码描述的功能增加任何实质性内容,您可以使用无约束数组和泛型来获得自调整大小的向量,但它们必须在细化后计算为固定大小。您可以使用访问类型获得真正的动态向量,但如果这很重要的话,它们是不可合成的。您可以使用无约束数组和泛型来获得自调整大小的向量,但它们必须在细化后计算为固定大小。您可以通过访问类型获得真正的动态向量,但如果这很重要的话,它们是不可合成的。