Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Process VHDL,进程不更新变量';s值,实现合并排序_Process_Vhdl_Mergesort_Vivado - Fatal编程技术网

Process VHDL,进程不更新变量';s值,实现合并排序

Process VHDL,进程不更新变量';s值,实现合并排序,process,vhdl,mergesort,vivado,Process,Vhdl,Mergesort,Vivado,我试图在VHDL上实现一个合并排序算法的示例,以便对4个128位的数字进行排序 我使用的是顺序代码。我有一个比较的过程。该过程包括3个阶段,实现合并排序背后的逻辑。 问题是我使用了一个变量count:integer,它对时钟周期进行计数。我希望相位跟随时钟周期。 模拟似乎进入了第一个IF语句(第1阶段),但没有进入其他语句,因此我猜count变量不会更新其值。 我尝试了一些改变,但似乎我遗漏了一些东西。 我知道这个帖子有点大,我会很感激你的帮助!谢谢 entity Merge_Sort is

我试图在VHDL上实现一个合并排序算法的示例,以便对4个128位的数字进行排序
我使用的是顺序代码。我有一个比较的过程。该过程包括3个阶段,实现合并排序背后的逻辑。
问题是我使用了一个变量
count:integer
,它对时钟周期进行计数。我希望相位跟随时钟周期。
模拟似乎进入了第一个IF语句(第1阶段),但没有进入其他语句,因此我猜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;
实体合并\u排序为
端口(时钟:在标准逻辑中;
复位:在标准逻辑中;
en:标准逻辑;
In_a:标准逻辑向量(15到0);
In_b:In标准逻辑向量(15到0);
In_c:标准逻辑向量(15到0);
In_d:In标准逻辑向量(15到0);
排序a:输出标准逻辑向量(15到0);
排序b:输出标准逻辑向量(15到0);
排序c:输出标准逻辑向量(15到0);
排序d:输出标准逻辑向量(15到0);
结束合并排序;
Merge_Sort的体系结构是
信号temp1a、temp1b、temp1c、temp1d:STD_逻辑_向量(15到0);
arr2型是标准逻辑向量(15到0)的数组(0到1);
arr4型是标准逻辑向量(15到0)的数组(0到3);
信号阵列1、阵列2:arr2;
信号合并器:arr4;
信号温度:标准逻辑向量(15至0);
开始
重置为'1'时的temp1a'0')否则--非同步重置
在a;
当重置为'1'时,temp1b'0')否则
在b;
重置为'1'时的temp1c'0')否则--非同步重置
在c;
当重置为'1'时,temp1d'0')否则
在d;

排序a变量
count
在每个
IF
条件内立即更新。因此,例如,在
IF(count=0)
中,它将递增为1。然后到达
IF(count=1)
语句,这当然已经是真的了

我想你真正需要做的就是把它改成
,如果。。。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 

我认为它会完全按照您的预期工作。

为什么不使用信号?如果在同一个周期内使用变量,您可能会实际运行3,否?您可以对std_逻辑_向量进行算术运算,或使用无符号,但在您的情况下,您可以使用
count将其设置为下一个值,并尝试将其更改为信号。我原以为这会是一个多驱动器错误,但我想情况并非如此,因为它是在一个进程内。不过,您在一个周期内运行所有驱动器是正确的,我现在必须修复它。谢谢这里没有多个驱动程序,即使您在过程中多次分配它,即使在同一个if中也是如此。