VHDL中的动态信号创建和VHDL错误的解决方案:" process"附近的语法错误

时间:2015-02-24 05:56:55

标签: vhdl

我是VHDL世界的新手,我收到此错误,说明进程附近出现语法错误。我检查了解决方案,发现可能有一个缺失的结果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;

我还想创建一个std_logic_vector,其大小从z到0,即大小为z + 1的向量。我该怎么做?

1 个答案:

答案 0 :(得分:4)

问题第1部分

在没有查看代码中的任何其他问题的情况下,我认为问题在于此部分,我已经重新格式化以显示有多少&#39;结束了&#39;你缺少的陈述:

    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;

我想你可能想用elsif而不是else if

问题第2部分

对于问题的第二部分,假设您想要生成可以在硬件中实现的代码,那么就没有运行时大小的std_logic_vector这样的东西。你可以做的最好的事情是让你的矢量具有它可能需要的最大尺寸,然后根据&#39; z&#39;的值来分配或使用它的一部分。

其他几点:

USE ieee.std_logic_arith.ALL;

这不是真正的&#39;标准库,还有许多其他答案,人们建议不要使用此库。如果您需要执行数学函数(例如+),USE ieee.numeric_std.all;,则创建有符号或无符号类型的信号。在您的示例中,main_counter将被声明为signal main_counter : unsigned(7 downto 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);
使用连接运算符&作为

可以更紧凑地编写

        output(6 downto 0) <= main_counter(5 downto 0) & y;

旁注:输出(7)似乎没有被分配。