VHDL,进程未更新变量的值,实现了合并排序

时间:2019-12-07 19:45:20

标签: process vhdl mergesort vivado

我正在尝试在VHDL上实现合并排序算法的示例,以便对4个128位数字进行排序。
我正在使用顺序代码。我有一个比较的过程。该过程由三个阶段组成,这些阶段实现了“合并排序”背后的逻辑。
问题是我使用的是变量count : integer,它对时钟周期进行计数。我希望各阶段遵循时钟周期。
似乎模拟输入了第一个(阶段1)的IF语句,但没有输入其他语句,因此我想count变量不会更新其值。
我已经尝试了一些更改,但是好像我在这里丢失了一些东西。 我知道该职位有点大,不胜感激!谢谢!

entity Merge_Sort is
    Port ( clk : in STD_LOGIC;
           reset : in STD_LOGIC;
           en : in STD_LOGIC;
           In_a : in STD_LOGIC_VECTOR(15 downto 0 ) ;
           In_b : in STD_LOGIC_VECTOR(15 downto 0 ) ;
           In_c : in STD_LOGIC_VECTOR(15 downto 0 ) ;
           In_d : in STD_LOGIC_VECTOR(15 downto 0 ) ;
           Sorted_a : out STD_LOGIC_VECTOR(15 downto 0 ) ;
           Sorted_b : out STD_LOGIC_VECTOR(15 downto 0 ) ;
           Sorted_c : out STD_LOGIC_VECTOR(15 downto 0 ) ;
           Sorted_d : out STD_LOGIC_VECTOR(15 downto 0 )  );
end Merge_Sort;

architecture Behavioral of Merge_Sort is

signal temp1a,temp1b,temp1c,temp1d  : STD_LOGIC_VECTOR(15 downto 0 ) ;
TYPE arr2 IS ARRAY  (0 to 1 ) of STD_LOGIC_VECTOR(15 downto 0) ;
TYPE arr4 IS ARRAY  (0 to 3 ) of STD_LOGIC_VECTOR(15 downto 0) ;
signal Array1 , Array2 : arr2  ;
signal  mergedArr : arr4  ;
signal temp : std_logic_vector(15 downto 0 )  ; 

begin
   temp1a <= (others =>'0' ) WHEN reset ='1' else                  -- Asychronous Resetting 
         In_a ; 
   temp1b <= (others =>'0' ) WHEN reset ='1' else
                In_b ; 
   temp1c <= (others =>'0' ) WHEN reset ='1' else                     -- Asychronous Resetting 
                        In_c ; 
   temp1d <= (others =>'0' ) WHEN reset ='1' else
                         In_d ; 


Sorted_a <= MergedArr(0) ;
Sorted_b <= MergedArr(1) ;
Sorted_c <= MergedArr(2) ;
Sorted_d <= MergedArr(3) ;



   Sort: PROCESS(clk)

   variable count : integer range 0 to 3   ;   


BEGIN 
     if(reset ='1' ) then count := 0 ;
     end if ;

       IF ( clk'EVENT AND clk='1' ) then                 -- Conditions for process to run 
         IF (en ='1') then 

          IF(count =0) THEN      -- Phase 1 of sort
            if (temp1a<temp1b ) then  Array1(0)<=temp1a  ; Array1(1) <= temp1b ; 
            else                      Array1(1)<=temp1a ;  Array1(0) <= temp1b   ;
            end if ;

            if (temp1c<temp1d ) then  Array2(0)<=temp1c  ;Array2(1) <= temp1d ; 
            else                      Array2(1)<=temp1c ;  Array2(0) <= temp1d   ;
            end if ;

            count := count +1 ;
          END IF ; 

           IF( count = 1) THEN    -- Phase 2 of sort , computing min and max of array 
                  if ( Array1(1) < Array2(1) ) then   MergedArr(1) <= Array1(1) ;  MergedArr(3) <= Array2(1) ;
                  else                               MergedArr(3) <= Array1(1) ;  MergedArr(1) <= Array2(1) ;
                  end if ; 

                  if ( Array1(0) < Array2(0) ) then   MergedArr(0) <= Array1(0) ;  MergedArr(2) <= Array2(0) ;
                   else                               MergedArr(2) <= Array1(0) ;  MergedArr(0) <= Array2(0) ;
                  end if ;            
               count:= count +1 ;
            END IF ;

            IF(count =2 ) THEN       -- Phase 3 of sort  ,  FINAL 
                if ( MergedArr(1) > MergedArr(2) ) then    
                     temp<= MergedArr(2 ) ;
                     MergedArr(2) <= MergedArr(1) ;
                     MergedArr(1) <= temp ; 
                 end if ;
            END IF ;


           END IF;
         END IF ;
END PROCESS ; 

end Behavioral;

1 个答案:

答案 0 :(得分:0)

在每个count条件内立即更新变量IF。因此,例如,在IF(count=0)内将其递增为1。然后到达IF(count=1)语句,这当然已经成立。

我认为您真正需要做的就是将其更改为IF ... ELSIF语句:

  IF(count =0) THEN      -- Phase 1 of sort
      ...
  ELSIF( count = 1) THEN    -- Phase 2 of sort , computing min and max of array 
      ...
  ELSIF(count =2 ) THEN       -- Phase 3 of sort  ,  FINAL 

我认为它将完全按照您的期望工作。