Case 在函数中使用VHDL generate语句

Case 在函数中使用VHDL generate语句,case,vhdl,Case,Vhdl,我想使用generate语句,但在我的代码中有一个case语句,它只接受顺序语句 然后我想我会在一个包中使用它,在这个包中我可以定义一个函数,这样我也会得到错误:“非法的顺序语句”。 那么我们可以做些什么呢。有什么建议吗 代码块: LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_package.all; -- Entity for ALU component -- Use this Entity for your C&A p

我想使用generate语句,但在我的代码中有一个case语句,它只接受顺序语句

然后我想我会在一个包中使用它,在这个包中我可以定义一个函数,这样我也会得到错误:“非法的顺序语句”。

那么我们可以做些什么呢。有什么建议吗

代码块:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.my_package.all;

-- Entity for ALU component
-- Use this Entity for your C&A project

ENTITY ALU_E IS
  PORT(
    reset_n     : in std_logic;
    clk         : in std_logic;
    OperandA    : in std_logic_vector(3 downto 0);
    OperandB    : in std_logic_vector(3 downto 0);
    Operation   : in std_logic_vector(2 downto 0);
    Start       : in std_logic;
    Result_Low  : out std_logic_vector(3 downto 0);
    Result_High : out std_logic_vector(3 downto 0);
    Ready   : out std_logic;
    Errorsig    : out std_Logic);
END ALU_E;

architecture Behavioral_ALU of ALU_E is 
signal c : std_logic_vector(7 downto 0);
signal carry_internal :std_logic_vector(4 downto 0);

COMPONENT fulladder IS
  PORT(
    a: IN std_logic;
    b: IN std_logic;
    cin : IN std_logic;
    cout: OUT std_logic;
    s: OUT std_logic );
END component fulladder;

begin

adders: for N in 0 to 3 generate
            ff1:fulladder
            port map
            (a => OperandA(N),b => OperandB(N),cin => carry_internal(N),cout => carry_internal(N+1),s => c(N));
            end generate adders;            
            c(4) <= carry_internal(4);


process(clk,reset_n)
begin

if reset_n = '0' then
    if (clk'event) then
        case Operation is 
            when "000" =>   --no operation
            NULL;

            when "001" =>   --Rotate left logical operator ?0000?&A by B steps
            c <= rotlef (OperandA,OperandB);

            when "010" =>   --Rotate right logical operator ?0000?&A by B steps (result width is 8 bit)
            c <= rotrig (OperandA,OperandB);

            when "011" =>   --Bitwise XOR operation
            Result_Low <= OperandA xor OperandB;

            when "100" =>   --Sum of A and B
            --here i want to use a statement such that i can call the gatelevel      --add function
--I have already all functions gatelevel defined when i try to use portmap or ----generate it gives an error illegal sequential statement 
            when Others =>
            NULL;
        end case;
    end if;
end if;
end process;
end Behavioral_ALU;
ieee库;
使用ieee.std_logic_1164.all;
使用work.my_package.all;
--ALU组件的实体
--将此实体用于您的C&A项目
实体ALU_E是
港口(
复位n:在标准逻辑中;
clk:标准逻辑中;
操作数:标准逻辑向量(3到0);
操作数B:标准逻辑向量(3到0);
操作:标准逻辑向量(2到0);
启动:在标准逻辑中;
结果低:输出标准逻辑向量(3到0);
结果高:输出标准逻辑向量(3到0);
就绪:输出标准逻辑;
错误信号:输出标准逻辑);
结束ALU_E;
ALU的架构行为ALU是
信号c:标准逻辑向量(7到0);
信号进位\u内部:标准逻辑\u矢量(4到0);
组件全加器是
港口(
答:标准逻辑;
b:标准逻辑;
cin:标准逻辑;
cout:输出标准逻辑;
s:输出标准(U逻辑);
端部全加器;
开始
加法器:对于0到3中的N,生成
ff1:全加器
港口地图
(a=>操作数a(N),b=>操作数b(N),cin=>进位内部(N),cout=>进位内部(N+1),s=>c(N));
端生成加法器;

c(4)这个问题中有几个误解


首先是标题:实际代码中没有函数。你用
为…做了什么。。。generate
语句是生成一个单独的硬件,与主进程并行运行。它将始终运行,并始终使用总和驱动信号“c”,就好像您已经编写了
c,就您获取错误消息的原因而言,组件实例化语句或生成语句是并发语句,而案例选择或函数体由顺序语句组成

您不需要函数,您需要从实例化为four
fulladder
s的generate语句中求和并执行。 o 为fulladder虚拟实体/架构对:

library ieee;
use ieee.std_logic_1164.all;

entity fulladder is
    port (
        a:    in  std_logic;
        b:    in  std_logic;
        cin:  in  std_logic;
        cout: out std_logic;
        s:    out std_logic 
    );
end entity;

architecture foo of fulladder is

begin
    s <= a xor b xor cin;
    cout <= (a and b) or (a and cin) or (b and cin);
end architecture;
(注意,函数返回值长度与左操作数长度匹配)

为生成的
fulladder
s的输出添加新声明:

architecture changed of alu_e is 
    signal c:               std_logic_vector(7 downto 0);
    signal carry_internal:  std_logic_vector(4 downto 0);

    signal s:               std_logic_vector(3 downto 0); -- added
更改generate语句以将新信号用于求和:

adders: 
    for n in 0 to 3 generate
ff1:
        fulladder
            port map (
                a => operanda(n),
                b => operandb(n),
                cin => carry_internal(n),
                cout => carry_internal(n+1),
                s => s(n)  -- was c(n)
            );
    end generate;            

    -- c(4) <= carry_internal(4);
签名标志扩展可能类似于:

                        result_high <= (others => carry_internal(4)); --sign extended 
result_high carry_internal(4))--符号扩展
请注意,当您实例化乘法器时,您还需要为8位结果使用新的信号声明。修改旋转操作以分配
result\u low
result\u high
将允许将
c
用于实例化乘法,尽管您可以选择重命名它

将process语句中的case语句视为多路复用器的实例,在某些情况下,您碰巧也在输入上表示逻辑。例如,
xor
或符号扩展或函数调用(都是表达式)


当您实例化了提供功能的组件时,您希望将其输出连接到多路复用器输入。

将您的问题格式化为可读的形式。我(粗略地检查一下)觉得这些代码没问题,您能更详细地解释您的问题是什么吗?您需要发布更多的代码。您的
fulladder
中有一些端口连接到我们看不到任何声明的对象,例如
operana
。在生成循环中实例化组件没有什么根本性的错误。谢谢,我已经对代码进行了更改,但我不想让它与我的进程并行工作,而是想构建一个函数,我可以在case语句中调用它,就像我以前做的左移或右移操作一样。看看合成详细的结果。只需使用c“0”)即可删除尚未运行的操作。或者将它们全部删除并逐个重新添加。你会发现这些操作所需的硬件(rotlef等)总是在那里,并且总是并行工作;当你不看它的时候,它就被忽略了。在这方面你别无选择,你不能让门在开关或操作码的一瞬间出现或消失。。。所以这个加法器不会有任何不同。PS:在合成过程中,也可能会有一个关于多个驱动器信号的警告。
                    when "100" =>   --sum of a and b
                        result_low <= s; -- added
                        result_high(0) <= carry_internal(4); --(un)signed? 
                        result_high(0) <= carry_internal(4); --(un)signed? 
                        result_high <= (others => carry_internal(4)); --sign extended