If statement 在VHDL中生成带For/IF的nbit位片ALU
我正在使用GENERATE设计一个n位位片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);
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'指定输出值(在其他几个信号/情况中)