1

我想交换 and 的值input0input1并输出较小的值。当我在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;
4

1 回答 1

3

我看到几个问题:

1)您正在异步和在进程内为bubble0和bubble1分配值(这是一场“总线斗争”,每个信号上有多个驱动程序,这在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;
于 2013-01-05T17:47:41.483 回答