我想交换input0
和input1
的值,然后输出较小的值。当我在Modelsim中模拟我的项目时,信号输出的波形是红线。我的错是什么?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity MF is
port (clk : in std_logic;
input0: in std_logic_vector(2 downto 0);
input1: in std_logic_vector(2 downto 0));
end MF;
architecture Behavioral of MF is
signal bubble0: std_logic_vector(2 downto 0);
signal bubble1: std_logic_vector(2 downto 0);
begin
bubble0 <= input0;
bubble1 <= input1;
output <= bubble0; -- my output
process(clk)
begin
if rising_edge(clk) then
if bubble0 > bubble1 then -- swap
bubble1 <= bubble0;
bubble0 <= bubble1;
end if;
end if;
end process;
end Behavioral;
答案 0 :(得分:3)
我看到几个问题:
1)您正在异步和进程内为bubble0和bubble1分配值(这是一个“总线斗争”,每个信号上有多个驱动程序, IS 在VHDL中是合法的,但是你必须知道你正在做什么......通常这用于制作三态总线,但是你的两个指配都在不断地驱动信号,这可能在解析信号时导致“未定义”状态。
2)在进程内if语句的所有情况下,您没有为bubble0和bubble1分配值。
3)您无法直接比较两个std_logic_vector值的数值幅度,首先需要将它们转换为适当的数字类型(例如有符号或无符号)。
目前还不清楚你想要输出的确切行为,但是下面的内容可能会让你走得更远...这会在时钟的每个上升沿适当地更新气泡信号:
begin
output <= bubble0; -- my output
process(clk)
begin
if rising_edge(clk) then
if unsigned(input0) > unsigned(input1) then -- swap
bubble1 <= input0;
bubble0 <= input1;
else
bubble0 <= input0;
bubble1 <= input1;
end if;
end if;
end process;
end Behavioral;