7 сегментный дисплей basys3 как использовать 2 цифры? - PullRequest
0 голосов
/ 19 марта 2019

Я немного знаю VHDL.

Моя цель - получить 4-битный векторный вход и отправить выход на 7-сегментный дисплей с номером base4.

Например, 1111->33, 1001-> 21

Я борюсь с преобразованием чисел base2 в base4 в VHDL.Как было сказано ранее, когда я преобразовал base2 в base4, я хочу отправить его на 7-сегментный дисплей, пожалуйста, не могли бы вы посоветовать мне, как это сделать?

1 Ответ

0 голосов
/ 19 марта 2019

Двоичный код легко преобразовать в любую систему счисления, основанную на степени 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);
...