Двоичный код легко преобразовать в любую систему счисления, основанную на степени 2, например 4, 8 или 16. Просто сгруппируйте биты по log2(bigger base)
.В случае основания 4 сгруппируйте их по log2(4)=2
:
00->0
01->1
10->2
11->3
1110->32
Вы просто делите вектор длины X
на X/2
векторов длины 2
каждый, соединяя провода:
library IEEE;
use IEEE.std_logic_1164.all;
-- 8 binary bit number to 4 base4 numbers
-- binary - is input number
-- d1 is the most significant base-4 digit
-- ...
-- d4 is the least significant base-4 digit
entity BinToBase4 is
port(binary : in STD_LOGIC_VECTOR(7 downto 0);
d1 : out STD_LOGIC_VECTOR(1 downto 0);
d2 : out STD_LOGIC_VECTOR(1 downto 0);
d3 : out STD_LOGIC_VECTOR(1 downto 0);
d4 : out STD_LOGIC_VECTOR(1 downto 0)
);
end BinTobase4;
architecture rtl of BinToBase4 is
begin
d1 <= binary(7 downto 6);
d2 <= binary(5 downto 4);
d3 <= binary(3 downto 2);
d4 <= binary(1 downto 0);
end rtl;
Testbench для этого:
library ieee;
use ieee.std_logic_1164.all;
entity testbench is
end testbench;
architecture tb of testbench is
component BinToBase4 is
port(
binary : in STD_LOGIC_VECTOR(7 downto 0);
d1 : out STD_LOGIC_VECTOR(1 downto 0);
d2 : out STD_LOGIC_VECTOR(1 downto 0);
d3 : out STD_LOGIC_VECTOR(1 downto 0);
d4 : out STD_LOGIC_VECTOR(1 downto 0)
);
end component;
signal num : std_logic_vector(7 downto 0);
signal d1 : std_logic_vector(1 downto 0);
signal d2 : std_logic_vector(1 downto 0);
signal d3 : std_logic_vector(1 downto 0);
signal d4 : std_logic_vector(1 downto 0);
begin
b4: BinToBase4 port map(num,d1,d2,d3,d4);
process
begin
num <= "10110001";
wait for 1 ns;
assert(d1="10") report "Fail 10" severity error;
assert(d2="11") report "Fail 11" severity error;
assert(d3="00") report "Fail 00" severity error;
assert(d4="01") report "Fail 01" severity error;
wait;
end process;
end tb;
Возможно, вы захотите расширить d1
, d2
, d3
, d4
до четырех битов, чтобы напрямую подключить их к 7-сегментному дисплею.Используйте конкатенацию &
:
d1 <= "00" & binary(7 downto 6);
d2 <= "00" & binary(5 downto 4);
d3 <= "00" & binary(3 downto 2);
d4 <= "00" & binary(1 downto 0);
, только не забудьте соответствующим образом настроить векторные размеры.
Т.е. dx станет ...
signal dx : std_logic_vector(3 downto 0);