首先是这个简单的加法器实体:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_misc.all;
use ieee.numeric_std.all;
entity adder is
Port ( a : in STD_LOGIC_VECTOR(31 downto 0);
b : in STD_LOGIC_VECTOR(31 downto 0);
alu_out : out STD_LOGIC_VECTOR(31 downto 0) := (others => '0')
);
end adder;
architecture Behavioral of adder is
signal result_ext:STD_LOGIC_VECTOR(32 downto 0) := (others => '0');
signal result:STD_LOGIC_VECTOR(31 downto 0) := (others => '0');
begin
process (a,b)
begin
result_ext <= std_logic_vector(signed('0' & a) + signed('0' & b));
result <= result_ext(result'left downto 0);
alu_out <= result;
end process;
end Behavioral;
和测试台:
-- TestBench Template
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE behavior OF testbench IS
signal a : STD_LOGIC_VECTOR(31 downto 0);
signal b : STD_LOGIC_VECTOR(31 downto 0);
signal alu_out : STD_LOGIC_VECTOR(31 downto 0);
BEGIN
ADDER : entity work.adder port map(
a => a,
b => b,
alu_out => alu_out
);
-- Test Bench Statements
tb : PROCESS
BEGIN
a <= B"0000_0000_0000_0000_0000_0000_0111_1010";
b <= B"0000_0000_0000_0000_0000_0000_0000_1011";
wait for 100 ns; -- wait until global set/reset completes
report "alu_out = " & integer'image(to_integer(signed(alu_out)));
wait; -- will wait forever
END PROCESS tb;
-- End Test Bench
END;
我收到报告输出:
Finished circuit initialization process.
at 100 ns: Note: alu_out = 0 (/testbench/).
如果我没有初始化结果信号,我会得到Undefined。所以问题是我没有得到 结果。
我使用 iSim 和 Xilinx 。
如果有人与VHDL上的一些简短有效的材料有一些很好的联系,请随时发布。
答案 0 :(得分:2)
采用彼得的代码并且:
numeric_std
给出了这个:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
entity adder is
generic (width : integer := 32)
Port ( a : in signed(width-1 downto 0);
b : in signed(width-1 downto 0);
alu_out : out signed(width downto 0) := (others => '0');
);
end adder;
architecture synth of adder is
begin
process (a,b)
begin
alu_out <= resize(a,alu_out'length) + b;
end process;
end Behavioral;
答案 1 :(得分:1)
问题在于,当您想要该过程周期的直接值时,您正在使用result
和result_ext
的信号。变量立即更新,您可以在流程的当前周期中访问它们的值。
试试这个,我认为它解决了你遇到的问题:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity adder is
Port ( a : in STD_LOGIC_VECTOR(31 downto 0);
b : in STD_LOGIC_VECTOR(31 downto 0);
alu_out : out STD_LOGIC_VECTOR(31 downto 0) := (others => '0')
);
end adder;
architecture Behavioral of adder is
begin
process (a,b)
variable result_ext:STD_LOGIC_VECTOR(32 downto 0) := (others => '0');
variable result:STD_LOGIC_VECTOR(31 downto 0);
begin
result_ext := std_logic_vector(signed('0' & a) + signed('0' & b));
result := result_ext(result'left downto 0);
alu_out <= result;
end process;
end Behavioral;
至于阅读材料,VHDL食谱也不错:VHDL Cookbook