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