繁体   English   中英

带有For / IF的nbit Bitslice ALU在VHDL中生成

[英]nbit Bitslice ALU with For/IF Generate in VHDL

我正在设计一个带有GENERATE的n位bitlice 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;

它编译正常但它不起作用,尽管生成块中有一堆警告说IF语句必须是静态的。 我想知道我犯了什么错误。

您要求工具根据输入值未知的端口生成不同的硬件,直到运行时。 那不行!

使“funct”成为通用输入将允许您成功使用Generates,但功能将在elaborationtime中修复。

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

Generate用于在“制造”的不同硬件位之间进行选择。 您的funct是一个输入,因此可以在操作期间更改。 没有办法改变你在那时做的实际硬件。

你需要根据funct所有硬件中选择不同的结果集 - 在一个定时的process包装你的if..generate s并将它们改为if..then s - 并从那里开始。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM