Arrays VHDL错误:CASE语句替换中的选项必须是本地静态的

Arrays VHDL错误:CASE语句替换中的选项必须是本地静态的,arrays,switch-statement,vhdl,Arrays,Switch Statement,Vhdl,我的要求是使用case语句比较两个数组值。所以我在所有迭代中都使用for循环 两者都是输入数组:数组(表达式)中的内存数组值与排序数组(选择)数组值进行比较,而成形数组数据是输出数组(case语句) 下面的代码出现静态大小写错误: 过程(clk) _数组中的变量:已排序; 变量out_数组:已排序; 开始 --in_数组:=已排序的_数组; 如果上升沿(clk),则 对于0到15循环中的i 案例(第(i)项中的存储器_)为 排序时,数组(0)=>out\u数组(i):=x“F”; 当排序的_数组

我的要求是使用case语句比较两个数组值。所以我在所有迭代中都使用for循环

两者都是输入数组:数组(表达式)中的内存数组值与排序数组(选择)数组值进行比较,而成形数组数据是输出数组(case语句)

下面的代码出现静态大小写错误:

过程(clk)

_数组中的变量:已排序; 变量out_数组:已排序; 开始 --in_数组:=已排序的_数组; 如果上升沿(clk),则 对于0到15循环中的i 案例(第(i)项中的存储器_)为 排序时,数组(0)=>out\u数组(i):=x“F”; 当排序的_数组(1)=>out_数组(i):=x“E”; 当排序的_数组(2)=>out_数组(i):=x“D”; 当排序_数组(3)=>out_数组(i):=x“C”; 当排序的_数组(4)=>out_数组(i):=x“B”; 当排序_数组(5)=>out_数组(i):=x“A”; 当排序_数组(6)=>out_数组(i):=x“9”; 当排序_数组(7)=>out_数组(i):=x“8”; 当排序_数组(8)=>out_数组(i):=x“7”; 当排序_数组(9)=>out_数组(i):=x“6”; 当排序_数组(10)=>out_数组(i):=x“5”; 当排序_数组(11)=>out_数组(i):=x“4”; 当排序_数组(12)=>out_数组(i):=x“3”; 当排序_数组(13)=>out_数组(i):=x“2”; 当排序_数组(14)=>out_数组(i):=x“1”; 当排序_数组(15)=>out_数组(i):=x“0”; 当其他=>null时--out_数组(i):=“ZZZZ”; 终例; 端环;
形_DataVHDL
case
语句的语法为:

[标签
]
大小写
表达式

选项
=>
顺序语句。。。{任意数量的 当零件}

端盖
[标签]

选择=选择
|
选择
|

Choice={其中一个}

恒压

射程

其他
{最后一个分支}

这是一个错误,因为选择必须是

  • 恒定表达式
  • 射程
  • 其他

在您的代码中,选择(
sorted_array
)不是这些;您说它是一个“输入”。

VHDL
case
语句的语法是:

[标签
]
大小写
表达式

选项
=>
顺序语句。。。{任意数量的 当零件}

端盖
[标签]

选择=选择
|
选择
|

Choice={其中一个}

恒压

射程

其他
{最后一个分支}

这是一个错误,因为选择必须是

  • 恒定表达式
  • 射程
  • 其他

在您的代码中,选择(
sorted_array
)不是这些;你说它是一个“输入”

每当你发现一个大而规则的结构时,你通常可以利用这个规则。在这种情况下,它只是意味着另一个循环

您所写的内容可以简化为以下内容:

process (clk)
   variable out_array:     sorted;      
begin
  -- in_array := sorted_array;
    if rising_edge(clk) then
        for i in 0 to 15 loop 
            for j in 0 to 15 loop
                if Memory_in(i) = sorted_array(j) then
                    out_array(i) := 15 - j; -- maybe via type conversion
                end if;
            end loop;
        end loop;
        Shaped_Data <= out_array;
    end if;
end process;
过程(clk)
变量out_数组:已排序;
开始
--in_数组:=已排序的_数组;
如果上升沿(clk),则
对于0到15循环中的i
对于0到15循环中的j
如果内存_in(i)=排序的_数组(j),则
out_数组(i):=15-j;--可能通过类型转换
如果结束;
端环;
端环;

当你发现一个大而规则的结构时,你通常可以利用这个规则。在这种情况下,它只是意味着另一个循环

您所写的内容可以简化为以下内容:

process (clk)
   variable out_array:     sorted;      
begin
  -- in_array := sorted_array;
    if rising_edge(clk) then
        for i in 0 to 15 loop 
            for j in 0 to 15 loop
                if Memory_in(i) = sorted_array(j) then
                    out_array(i) := 15 - j; -- maybe via type conversion
                end if;
            end loop;
        end loop;
        Shaped_Data <= out_array;
    end if;
end process;
过程(clk)
变量out_数组:已排序;
开始
--in_数组:=已排序的_数组;
如果上升沿(clk),则
对于0到15循环中的i
对于0到15循环中的j
如果内存_in(i)=排序的_数组(j),则
out_数组(i):=15-j;--可能通过类型转换
如果结束;
端环;
端环;

整形_数据提示:将案例选择向量指定给局部过程变量。(我不知道为什么,但是,VHDL只要求您这样做。)另外,当您将其分配给进程的局部变量时,将std_logic_vector转换为“unsigned”,然后将其“resize”为大小写文本的宽度。例如:

process(amm_addr)
   variable addr :unsigned(31 downto 0); 
begin
    addr := resize(unsigned(amm_addr),32);

    ...
    case addr is
    when X"00000008" => null;
    when others => null;
    end case;
end process;
一个更详细的例子:

library ieee;
use     ieee.std_logic_1164.all;
use     ieee.numeric_std.all;  --for "unsigned" type and "resize" funciton

entity testit is
    generic(
        aw :natural := 12;
        dw :natural := 32
    );
    port(
        clk        :std_logic;
        rstn       :std_logic;

        amm_addr   :std_logic_vector(aw-1 downto 0);
        amm_wen    :std_logic;
        amm_wdata  :std_logic_vector(dw-1 downto 0);
        amm_ren    :std_logic;
        amm_rdata  :std_logic_vector(dw-1 downto 0);
        amm_rvalid :std_logic
    );
end entity;

architecture sim of testit is
    signal reg1 :std_logic_vector(dw-1 downto 0);
    signal reg2 :std_logic_vector(dw-1 downto 0);
    signal reg3 :std_logic_vector(dw-1 downto 0);
    signal reg4 :std_logic_vector(dw-1 downto 0);
begin

process(clk, rstn)
   variable addr :unsigned(31 downto 0); 
begin
    addr := resize(unsigned(amm_addr),32);

    if (rstn = '0') then
        reg1 <= (others => '0');
        reg2 <= (others => '0');
        reg3 <= (others => '0');
        reg4 <= (others => '0');    

    elsif (rising_edge(clk)) then
        if (amm_wen = '1') then
            case addr is 
            when X"00000000" => reg1 <= amm_wdata;
            when X"00000001" => reg2 <= amm_wdata;
            when X"00000002" => reg3 <= amm_wdata;
            when X"00000003" => reg4 <= amm_wdata;
            when others      => null;
            end case;
        end if;
    end if;
end process;

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all--对于“unsigned”类型和“resize”函数
实体测试是
一般的(
aw:自然值:=12;
dw:natural:=32
);
港口(
时钟:标准逻辑;
rstn:std_逻辑;
amm地址:标准逻辑向量(aw-1向下至0);
温:标准逻辑;
数据:标准逻辑向量(dw-1向下至0);
amm_ren:std_逻辑;
电流数据:标准逻辑矢量(dw-1向下至0);
amm\u rvalid:std\u逻辑
);
终端实体;
testit的体系结构sim是
信号reg1:std_逻辑_向量(dw-1向下至0);
信号reg2:标准逻辑向量(dw-1向下至0);
信号reg3:标准逻辑向量(dw-1向下至0);
信号reg4:std_逻辑_向量(dw-1向下至0);
开始
工艺(clk、rstn)
变量addr:无符号(31到0);
开始
地址:=调整大小(无符号(amm_addr),32);
如果(rstn='0'),则
reg1'0');
reg2'0');
reg3'0');
reg4'0');
elsif(上升沿(clk))然后
如果(amm_wen='1'),那么
案例地址为
当X“00000000”=>reg1 reg2 reg3 reg4为空时;
终例;
如果结束;
如果结束;
结束过程;
终端架构;
提示:分配您的案例