如何在VHDL中创建通用过程?

如何在VHDL中创建通用过程?,vhdl,Vhdl,我已经为一个通用的超前进位加法器编写了代码。但我无法将此代码转换为包中的过程。有人能帮我做吗 当我试图编译这段代码时,它不会将n注册为通用编号 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Carry_Look_Ahead is Generic(n:integer:=4); Port ( A : in STD_LOGIC_VECTOR (n-1 downto 0); B : in STD_LOGIC_VECTOR (n-1 do

我已经为一个通用的超前进位加法器编写了代码。但我无法将此代码转换为包中的过程。有人能帮我做吗

当我试图编译这段代码时,它不会将
n
注册为通用编号

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Carry_Look_Ahead is

    Generic(n:integer:=4);

Port ( A : in STD_LOGIC_VECTOR (n-1 downto 0);
B : in STD_LOGIC_VECTOR (n-1 downto 0);
Cin : in STD_LOGIC;
S : out STD_LOGIC_VECTOR (n-1 downto 0);
Cout : out STD_LOGIC);
end Carry_Look_Ahead;

architecture Behavioral of Carry_Look_Ahead is

begin

process(A,B,Cin)

variable ci :STD_LOGIC_VECTOR(n downto 0);
variable P: STD_LOGIC_VECTOR(n-1 downto 0);
variable G: STD_LOGIC_VECTOR(n-1 downto 0);
variable si :STD_LOGIC_VECTOR(n-1 downto 0);     
          begin
       ci(0) := Cin;

FOR i IN 0 TO n-1 LOOP 

  P(i) := A(i) xor B(i);
  G(i) := A(i) and B(i);
  ci(i+1) := G(i) or (P(i) and G(i));
  si(i) := P(i) xor ci(i);

 END LOOP;
    S<=si;
    Cout<=ci(n);
end process;   

end Behavioral;

我的朋友找到了解决方法:

可以将整数作为泛型数。以下是已完成的
过程

PROCEDURE cla (
      SIGNAL n               : IN  INTEGER; -- generic number
      SIGNAL Cin             : IN  STD_LOGIC;
      SIGNAL input1 , input2 : IN  STD_LOGIC_VECTOR;
      SIGNAL Sum             : OUT STD_LOGIC_VECTOR;
      SIGNAL Cout            : OUT STD_LOGIC
   ) IS
      VARIABLE c :STD_LOGIC_VECTOR(n downto 0);
      VARIABLE P: STD_LOGIC_VECTOR(n-1 DOWNTO 0);
      VARIABLE G: STD_LOGIC_VECTOR(n-1 DOWNTO 0);
      VARIABLE s :STD_LOGIC_VECTOR(n-1 DOWNTO 0);  
   BEGIN    
      c(0) := Cin;
      FOR i IN 0 TO n-1 LOOP 
         P(i) := input1(i) XOR input2(i);
         G(i) := input1(i) AND input2(i);
         c(i+1) := G(i) OR (P(i) AND G(i));
         s(i) := P(i) XOR c(i);
      END LOOP;
      Sum<=s;
      Cout<=c(n);
   END cla;
程序cla(
信号n:整数形式;--通用编号
信号Cin:标准逻辑中;
信号输入1、输入2:标准逻辑向量;
信号和:输出标准逻辑向量;
信号输出:输出标准逻辑
)是
变量c:STD_逻辑_向量(n到0);
变量P:STD_逻辑_向量(n-1向下至0);
变量G:STD_逻辑_向量(n-1向下至0);
变量s:STD_逻辑_向量(n-1到0);
开始
c(0):=Cin;
对于0到n-1循环中的i
P(i):=input1(i)异或input2(i);
G(i):=输入1(i)和输入2(i);
c(i+1):=G(i)或(P(i)和G(i));
s(i):=P(i)XOR c(i);
端环;

Sum我的朋友找到了解决方法:

可以将整数作为泛型数。以下是已完成的
过程

PROCEDURE cla (
      SIGNAL n               : IN  INTEGER; -- generic number
      SIGNAL Cin             : IN  STD_LOGIC;
      SIGNAL input1 , input2 : IN  STD_LOGIC_VECTOR;
      SIGNAL Sum             : OUT STD_LOGIC_VECTOR;
      SIGNAL Cout            : OUT STD_LOGIC
   ) IS
      VARIABLE c :STD_LOGIC_VECTOR(n downto 0);
      VARIABLE P: STD_LOGIC_VECTOR(n-1 DOWNTO 0);
      VARIABLE G: STD_LOGIC_VECTOR(n-1 DOWNTO 0);
      VARIABLE s :STD_LOGIC_VECTOR(n-1 DOWNTO 0);  
   BEGIN    
      c(0) := Cin;
      FOR i IN 0 TO n-1 LOOP 
         P(i) := input1(i) XOR input2(i);
         G(i) := input1(i) AND input2(i);
         c(i+1) := G(i) OR (P(i) AND G(i));
         s(i) := P(i) XOR c(i);
      END LOOP;
      Sum<=s;
      Cout<=c(n);
   END cla;
程序cla(
信号n:整数形式;--通用编号
信号Cin:标准逻辑中;
信号输入1、输入2:标准逻辑向量;
信号和:输出标准逻辑向量;
信号输出:输出标准逻辑
)是
变量c:STD_逻辑_向量(n到0);
变量P:STD_逻辑_向量(n-1向下至0);
变量G:STD_逻辑_向量(n-1向下至0);
变量s:STD_逻辑_向量(n-1到0);
开始
c(0):=Cin;
对于0到n-1循环中的i
P(i):=input1(i)异或input2(i);
G(i):=输入1(i)和输入2(i);
c(i+1):=G(i)或(P(i)和G(i));
s(i):=P(i)XOR c(i);
端环;

Sum子程序(如过程)可以具有通用参数。语法和用法类似于通用实体或通用包

procedure cla
  generic (
    constant n  : in  positive
  )
  parameter (
    signal Cin    : in  STD_LOGIC;
    signal input1 : in  STD_LOGIC_VECTOR;
    signal input2 : in  STD_LOGIC_VECTOR;
    signal Sum    : out STD_LOGIC_VECTOR;
    signal Cout   : out STD_LOGIC
  ) is
  variable c : STD_LOGIC_VECTOR(n downto 0);
  variable P : STD_LOGIC_VECTOR(n-1 downto 0);
  variable G : STD_LOGIC_VECTOR(n-1 downto 0);
  variable s : STD_LOGIC_VECTOR(n-1 downto 0);  
begin
  c(0) := Cin;
  for i in 0 to n-1 loop
     P(i) := input1(i) xor input2(i);
     G(i) := input1(i) and input2(i);
     c(i+1) := G(i) or (P(i) and G(i));
     s(i) := P(i) xor c(i);
  end loop;
  Sum  <=s;
  Cout <=c(n);
end procedure;
程序cla
一般的(
常数n:正
)
参数(
信号Cin:标准逻辑中;
信号输入1:标准逻辑向量;
信号输入2:标准逻辑向量;
信号和:输出标准逻辑向量;
信号输出:输出标准逻辑
)是
变量c:STD_逻辑_向量(n到0);
变量P:STD_逻辑_向量(n-1向下至0);
变量G:STD_逻辑_向量(n-1向下至0);
变量s:STD_逻辑_向量(n-1到0);
开始
c(0):=Cin;
对于0到n-1循环中的i
P(i):=input1(i)异或input2(i);
G(i):=输入1(i)和输入2(i);
c(i+1):=G(i)或(P(i)和G(i));
s(i):=P(i)xor c(i);
端环;

Sum子程序(如过程)可以具有通用参数。语法和用法类似于通用实体或通用包

procedure cla
  generic (
    constant n  : in  positive
  )
  parameter (
    signal Cin    : in  STD_LOGIC;
    signal input1 : in  STD_LOGIC_VECTOR;
    signal input2 : in  STD_LOGIC_VECTOR;
    signal Sum    : out STD_LOGIC_VECTOR;
    signal Cout   : out STD_LOGIC
  ) is
  variable c : STD_LOGIC_VECTOR(n downto 0);
  variable P : STD_LOGIC_VECTOR(n-1 downto 0);
  variable G : STD_LOGIC_VECTOR(n-1 downto 0);
  variable s : STD_LOGIC_VECTOR(n-1 downto 0);  
begin
  c(0) := Cin;
  for i in 0 to n-1 loop
     P(i) := input1(i) xor input2(i);
     G(i) := input1(i) and input2(i);
     c(i+1) := G(i) or (P(i) and G(i));
     s(i) := P(i) xor c(i);
  end loop;
  Sum  <=s;
  Cout <=c(n);
end procedure;
程序cla
一般的(
常数n:正
)
参数(
信号Cin:标准逻辑中;
信号输入1:标准逻辑向量;
信号输入2:标准逻辑向量;
信号和:输出标准逻辑向量;
信号输出:输出标准逻辑
)是
变量c:STD_逻辑_向量(n到0);
变量P:STD_逻辑_向量(n-1向下至0);
变量G:STD_逻辑_向量(n-1向下至0);
变量s:STD_逻辑_向量(n-1到0);
开始
c(0):=Cin;
对于0到n-1循环中的i
P(i):=input1(i)异或input2(i);
G(i):=输入1(i)和输入2(i);
c(i+1):=G(i)或(P(i)和G(i));
s(i):=P(i)xor c(i);
端环;

你得到的具体错误信息是什么?据我所知,你的代码没有问题。你在用什么模拟器?哪一行收到错误消息?但我无法将此代码转换为包中的过程。有人能帮我做吗?也许你可以告诉我包裹的来源?还请注意,这不需要是通用子程序。您可以要求a、B和C的所有长度匹配并使用1的范围,也可以使用实例化的通用包,而不是使用通用子程序。通用包通常支持合成,而通用子程序则不支持。请告诉我们您的工具链,并提供完整的错误消息以及。您得到的具体错误消息是什么?据我所知,您的代码没有任何错误。你在用什么模拟器?哪一行收到错误消息?但我无法将此代码转换为包中的过程。有人能帮我做吗?也许你可以告诉我包裹的来源?还请注意,这不需要是通用子程序。您可以要求a、B和C的所有长度匹配并使用1的范围,也可以使用实例化的通用包,而不是使用通用子程序。通用包通常支持合成,而通用子程序则不支持。告诉我们您的工具链,并提供完整的错误消息以及a.n在这里是非常无用的,因为您假设n与input1'长度相关。如果n大于input1'length-1,则for循环中将出现错误,因为input1和input1的索引将超出边界。
n
可以是类常量,输出信号为数组类型。它不能在分配器中使用,或者n可以从其中一个参数派生(此处
Sum
,您不能在分配器中使用过程)。使用别名确保
input1
input2
的左右顺序。应该是
c(i+1):=G(i)或(P(i)和c(i)),原帖子中的相同错误,
ci
而不是
c
。OP应该提供一个。在动态精化过程中,Tricky的错误可能出现在别名声明中。在这里,n是非常无用的,因为您假设n与input1的长度相关。如果n大于input1'length-