用VHDL对向量进行排序

用VHDL对向量进行排序,vhdl,hdl,Vhdl,Hdl,我试图对一个向量进行排序,例如,如果输入是101010,那么输出将是111000。每次我试图模拟代码时,我的输出总是全零 我张贴我的代码供您参考。如果我遗漏了什么,或者如果有更好的方法来实现这一点,请让我知道 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity num_ones_for is Port ( A : in STD_LOGIC_VECTOR (15 downto 0

我试图对一个向量进行排序,例如,如果输入是101010,那么输出将是111000。每次我试图模拟代码时,我的输出总是全零

我张贴我的代码供您参考。如果我遗漏了什么,或者如果有更好的方法来实现这一点,请让我知道

    library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity num_ones_for is
    Port ( A : in  STD_LOGIC_VECTOR (15 downto 0);
           A_S : out  STD_LOGIC_VECTOR (15 downto 0));
end num_ones_for;

architecture Behavioral of num_ones_for is
function sort_binary ( ones :unsigned;a : std_logic_vector) return std_logic_vector is
    variable A1: std_logic_vector ( 15 downto 0) := (others =>'0') ;
    begin
    for i in 15 to(15 - to_integer(ones)) loop
     A1(i) := '1';
    end loop;
    return A1;
    end function sort_binary;
signal ones : unsigned (4 downto 0);
begin

process(A)
variable count : unsigned(4 downto 0) := "00000";
begin

count := "00000";   --initialize count variable.
    for i in 0 to 15 loop   --for all the bits.
        count := count + ("0000" & A(i));   --Add the bit to the count.
    end loop;
    ones <= count;    --assign the count to output.
end process;
A_S <= sort_binary(ones =>ones,a =>A);

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
is的实体编号
端口(A:标准逻辑向量(15到0);
A_S:out标准逻辑向量(15到0);
结束一个或多个的数量;
is的num_ones_行为体系结构
函数sort_binary(one:unsigned;a:std_logic_vector)返回std_logic_vector为
变量A1:std_逻辑_向量(15到0):=(其他=>'0');
开始
对于15到(15到_整数(1))循环中的i
A1(i):=“1”;
端环;
返回A1;
端函数排序\二进制;
信号一:无符号(4到0);
开始
过程(A)
变量计数:无符号(4到0):=“00000”;
开始
计数:=“00000”--初始化计数变量。
对于0到15循环中的i——对于所有位。
计数:=计数+(“0000”和A(i))--将该位添加到计数中。
端环;
一(A),;
结束行为;

最后,我解决了大部分错误,并稍微更改了代码的逻辑。如果将来有人想编写相同类型的VHDL代码,可以参考我的代码。如果有更好的方法解决这个问题,请让我知道 总是乐于学习。 谢谢

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
is的实体编号
端口(A:标准逻辑向量(15到0);
A_S:out标准逻辑向量(15到0);
结束一个或多个的数量;
is的num_ones_行为体系结构
函数sort_binary(one:unsigned;a:std_logic_vector)返回std_logic_vector为
变量A1:std_逻辑_向量(15到0):=(其他=>'0');
开始
对于0到15循环中的i
如果我>(15个一)那么
A1(i):=“1”;
其他的
下一个
如果结束;
端环;
返回A1;
端函数排序\二进制;
信号一:无符号(4到0);
开始
过程(A)
变量计数:无符号(4到0);
开始
计数:=“00000”--初始化计数变量。
对于0到15循环中的i——对于所有位。
计数:=计数+(“0000”和A(i))--将该位添加到计数中。
端环;
一(A),;
结束行为;

在架构声明部分而不是架构声明部分声明了信号。变量计数在语句的流程语句序列中声明,而不是在流程语句声明性部分中声明。两者都位于前面相应保留字的错误一侧
begin
。函数体的for循环参数范围中存在错误。右边界的类型与左边界文字0不兼容。将1转换为整数:
对于0中的i到o整数(1)循环
@user1155120谢谢,它起作用了。
对于15中的i到(15到o整数(1))循环
,除非1的整数值为0,否则这表示空范围。将不执行具有空范围的循环语句中的语句序列。右边界表达式不需要括号,方向应为向下。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity num_ones_for is
    Port ( A : in  STD_LOGIC_VECTOR (15 downto 0);
           A_S : out  STD_LOGIC_VECTOR (15 downto 0));
end num_ones_for;

architecture Behavioral of num_ones_for is
function sort_binary ( ones :unsigned;a : std_logic_vector) return std_logic_vector is
    variable A1: std_logic_vector ( 15 downto 0) := (others =>'0') ;
    begin
    for i in 0 to 15 loop
    if i >(15- ones) then
     A1(i) := '1';
     else
     next;
     end if;
    end loop;
    return A1;
    end function sort_binary;
signal ones : unsigned (4 downto 0);
begin

process(A)
variable count : unsigned(4 downto 0);
begin

count := "00000";   --initialize count variable.
    for i in 0 to 15 loop   --for all the bits.
        count := count + ("0000" & A(i));   --Add the bit to the count.
    end loop;
    ones <= count;    --assign the count to output.
end process;
A_S <= sort_binary(ones =>ones,a =>A);

end Behavioral;