如何在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-