If statement 在VHDL中生成带For/IF的nbit位片ALU

If statement 在VHDL中生成带For/IF的nbit位片ALU,if-statement,for-loop,vhdl,alu,If Statement,For Loop,Vhdl,Alu,我正在使用GENERATE设计一个n位位片ALU,我编写了以下代码: library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; ENTITY ALU IS GENERIC (n : integer := 8); PORT (A,B : IN std_logic_vector(n-1 DOWNTO 0); funct : IN std_logic_vector (2 DOWNTO 0);

我正在使用GENERATE设计一个n位位片ALU,我编写了以下代码:

library IEEE; 
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;


ENTITY ALU IS
  GENERIC (n : integer := 8);
  PORT (A,B : IN std_logic_vector(n-1 DOWNTO 0);
        funct : IN std_logic_vector (2 DOWNTO 0);
        clk,nrst : IN std_logic;
        Z : OUT std_logic_vector (n-1 DOWNTO 0);
        ov,cout : OUT std_logic);
  END ALU;


  ARCHITECTURE bitSlice OF ALU IS
    SIGNAL C : std_logic_vector (0 TO n);
    SIGNAL temp : std_logic_vector (n-1 DOWNTO 0);
  BEGIN
      L1:IF nrst = '1' GENERATE 
      L2:IF funct = "000" GENERATE  Z <= A;
        END GENERATE L2;
      L3:IF funct = "001" GENERATE Z <= B;
        END GENERATE L3;
      L4:IF funct = "010" GENERATE 
        c(0) <= '0';
        cout <= C(n);
        ov <= C(n);
        L5: FOR i IN 0 TO n-1 GENERATE
          Z(i) <= (A(i) XOR B(i) XOR C(i));
          C(i+1) <= (A(i) AND B(i)) OR
                    (A(i) AND C(i)) OR
                    (B(i) AND C(i));
          END GENERATE L5;
        END GENERATE L4;

      L6:IF funct = "011" GENERATE 
        c(0) <= '0';
        cout <= C(n);
        ov <= C(n);
        temp <= std_logic_vector(signed(NOT(b))+1);
        L7: FOR i IN 0 TO n-1 GENERATE
          Z(i) <= (A(i) XOR temp(i) XOR C(i));
          C(i+1) <= (A(i) AND temp(i)) OR
                    (A(i) AND C(i)) OR
                    (B(i) AND C(i));
          END GENERATE L7;
        END GENERATE L6;
      L8:IF funct = "100" GENERATE Z <= A(n-1 DOWNTO 0) & '0';
      END GENERATE L8;
      L9:IF funct = "101" GENERATE Z <= B(n-1 DOWNTO 0) & '0';
      END GENERATE L9;
      L10:IF funct = "110" GENERATE Z <= '0' & a(n DOWNTO 1);
      END GENERATE L10;
      L11:IF funct = "111" GENERATE Z <= '0' & b(n DOWNTO 1);
      END GENERATE L11;
   END GENERATE L1;

END bitSlice;
IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.numeric_std.all;
实体ALU是
泛型(n:整数=8);
端口(A,B:标准逻辑向量中(n-1向下至0);
函数:在标准逻辑向量中(2到0);
clk、nrst:标准逻辑中;
Z:输出标准逻辑向量(n-1向下至0);
ov,cout:输出标准逻辑);
末端ALU;
ALU的体系结构位片是
信号C:标准逻辑向量(0到n);
信号温度:标准逻辑向量(n-1向下至0);
开始
L1:如果nrst='1'生成

L2:IF funct=“000”GENERATE Z您要求工具根据在运行时之前输入值未知的端口生成不同的硬件。那不行

将“funct”设置为通用输入将允许您成功地使用Generates,但该功能将在ExplainionTime时修复


生成所有硬件并使用“funct”在不同生成的结果之间进行多路复用可能更接近您想要的结果。

生成用于在“生成”的不同硬件位之间进行选择。您的
函数是一个输入,因此在操作过程中可以更改。在这一点上,没有办法改变您实际制作的硬件


您需要根据
funct
在所有硬件的不同结果集之间进行选择-将
if..generate
s包装在一个有时钟的
过程中,并将其更改为
if..then
s-然后从那里开始执行。

在这种实现中,您可以使用WHEN或SELECT语句而不是generate

您的代码还有另一个问题:您正在实现一个组合电路,但没有指定完整的LUT,这将导致锁存的推断。例如,您没有为nrst='0'指定输出值(在其他几个信号/情况中)