Как сдвиговый регистр работает в двоичном преобразовании в bcd - PullRequest
0 голосов
/ 16 апреля 2019

Я нашел этот код для 12-битного преобразования двоичного кода в bcd, но я не могу понять часть регистра сдвига (просто показывающую часть конечного автомата). Мне нужна помощь в понимании того, как именно '&' работает в сдвиговом регистре, и если кто-то также может предложить другой способ для части сдвигового регистра выглядеть примерно так, как показано ниже, так как поток данных проще понять:


    ishiftRegister(7) <= Rxd;

    ishiftRegister(6 downto 0) <= iShiftRegister(7 downto 1);


     -- State Machine
    process(present_state, binary, binary_in, bcd_temp, bcds_reg, shift_counter)
    begin
        next_state <= present_state;
        bcds_next <= bcd_temp;
        binary_next <= binary;
        shift_counter_next <= shift_counter;

        case present_state is

            when st_start =>
               next_state <= st_shift;
               binary_next <= binary_in;
               bcds_next <= (others => '0');
               shift_counter_next <= 0;

            when st_shift =>
                if shift_counter = 12 then
                    next_state <= st_stop;
                else
                    binary_next <= binary(10 downto 0) & 'L';
                    bcds_next <= bcds_reg(18 downto 0) & binary(11);
                    shift_counter_next <= shift_counter + 1;
                end if;

            when st_stop=>
                next_state <= st_start;

        end case;
    end process;

1 Ответ

0 голосов
/ 16 апреля 2019

& является оператором конкатенации. Посмотрите, например, этот вопрос для дальнейшего обсуждения: Объединение битов в VHDL

bcds_next <= bcds_reg(18 downto 0) & binary(11);

С bcds_reg(18 downto 0) вы берете 19 младших значащих бит вектора bcds_reg (и отбрасываете самый старший бит). То есть регистр смещен влево. binary(11) является наиболее значимым битом 12-битного вектора binary. Конкатенация 19-битного вектора и одного бита с & создает 20-битный вектор, который вы можете затем преобразовать в 20-битный вектор bcds_next.

Что касается вашего другого вопроса, я думаю, что было бы также возможно следующее и аналогичная операция без оператора &.

bcds_next(19 downto 1) <= bcds_reg(18 downto 0);
bcds_next(0) <= binary(11);
...