Bitonic Sorter is one kind of Sorting Algorithm. This algorithm invented by Ken Batcher. You can find more detail about this algorithm over here.
Bitonic Sorter |
Simplified Bitonic Sorter |
Above figure is a simplified version of Bitonic Sorter. In this dark yellow colored and light red colored box are sorters, those are either sorting down or sorting up.
In our design we will use sorting down sorter means higher values will be at low place and lower values will be at high place. Output of each sorter assign as stage1_op, stage2_op etc. Output of each sorter block will act as a input to second sorter block.
- Simple Sorter Design Code
library ieee; use ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity sort is port (a : in signed (7 downto 0); b : in signed (7 downto 0); sort_op_up : out signed (7 downto 0); sort_op_down : out signed (7 downto 0)); end sort; architecture beh of sort is begin process(a,b) begin if (a > b) then sort_op_up <= b; sort_op_down <= a; else sort_op_down <= b; sort_op_up <= a; end if; end process; end beh;
- Bitonic Sorter Design Code using Above Sorter Code
library ieee; use ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; package bus_input_pkg is type bus_array is array(15 downto 0) of signed (7 downto 0); end package; library ieee; use ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use work.bus_input_pkg.all; entity top_sort is port (input : in bus_array; output : out bus_array); end top_sort; architecture structural of top_sort is component sort is port (a : in signed (7 downto 0); b : in signed (7 downto 0); sort_op_up : out signed (7 downto 0); sort_op_down : out signed (7 downto 0)); end component; signal stage1_op,stage2_op,stage3_op,stage4_op,stage5_op,stage6_op,stage7_op,stage8_op,stage9_op : bus_array; begin ------------------------------------------------------------------------------------------- gen_reg0: for i in 0 to 7 generate sort1 : sort port map (input(2*i),input((2*i)+1),stage1_op(2*i),stage1_op((2*i)+1)); end generate gen_reg0; ------------------------------------------------------------------------------------------- gen_reg1: for i in 0 to 3 generate sort2 : sort port map (stage1_op(4*i),stage1_op((4*i)+3),stage2_op(4*i),stage2_op((4*i)+3)); sort3 : sort port map (stage1_op((4*i)+1), stage1_op((4*i)+2), stage2_op((4*i)+1), stage2_op((4*i)+2)); end generate gen_reg1; gen_reg2: for i in 0 to 7 generate sort4 : sort port map (stage2_op(2*i),stage2_op((2*i)+1),stage3_op(2*i),stage3_op((2*i)+1)); end generate gen_reg2; ------------------------------------------------------------------------------------------- gen_reg3: for i in 0 to 1 generate sort5 : sort port map (stage3_op(8*i), stage3_op((8*i)+7),stage4_op(8*i), stage4_op((8*i)+7)); sort6 : sort port map (stage3_op((8*i)+1), stage3_op((8*i)+6),stage4_op((8*i)+1), stage4_op((8*i)+6)); sort7 : sort port map (stage3_op((8*i)+2), stage3_op((8*i)+5),stage4_op((8*i)+2), stage4_op((8*i)+5)); sort8 : sort port map (stage3_op((8*i)+3), stage3_op((8*i)+4),stage4_op((8*i)+3), stage4_op((8*i)+4)); end generate gen_reg3; gen_reg4:for i in 0 to 3 generate sort9 : sort port map (stage4_op(4*i), stage4_op((4*i)+2),stage5_op(4*i), stage5_op((4*i)+2)); sort10 : sort port map (stage4_op((4*i)+1), stage4_op((4*i)+3),stage5_op((4*i)+1), stage5_op((4*i)+3)); end generate gen_reg4; gen_reg5:for i in 0 to 7 generate sort11 : sort port map (stage5_op(2*i), stage5_op((2*i)+1),stage6_op(2*i), stage6_op((2*i)+1)); end generate gen_reg5; ------------------------------------------------------------------------------------------- gen_reg6: for i in 0 to 7 generate sort12 : sort port map (stage6_op(i), stage6_op((i+15)-(2*i)),stage7_op(i), stage7_op((i+15)-(2*i))); end generate gen_reg6; gen_reg7: for i in 0 to 3 generate sort13 : sort port map (stage7_op(i), stage7_op(i+4),stage8_op(i), stage8_op(i+4)); sort14 : sort port map (stage7_op(i+8), stage7_op(i+12),stage8_op(i+8), stage8_op(i+12)); end generate gen_reg7; gen_reg8:for i in 0 to 7 generate even_generate :if (i=0 or i=2 or i=4 or i=6) generate sort15 : sort port map (stage8_op(2*i), stage8_op((2*i)+2),stage9_op(2*i), stage9_op((2*i)+2)); end generate even_generate; odd_generate :if (i=1 or i=3 or i=5 or i=7) generate sort16 : sort port map (stage8_op((2*i)-1), stage8_op((2*i)+1),stage9_op((2*i)-1), stage9_op((2*i)+1)); end generate odd_generate; end generate gen_reg8; gen_reg9:for i in 0 to 7 generate sort17 : sort port map (stage9_op(2*i), stage9_op((2*i)+1), output(2*i), output((2*i)+1)); end generate gen_reg9; ------------------------------------------------------------------------------------------- end structural;
No comments:
Post a Comment