Как прикрепить бит четности к данному 4-битному std_logic_vector? - PullRequest
0 голосов
/ 22 апреля 2019

Изображение DUT

Я пытаюсь написать внутреннюю передачу полубайта, защищенную битом четности. Для этого я хочу написать логику передатчика / приемника, которая показана на рисунке.

Итак, у меня есть 4-битный входной вектор, и я сгенерирую для него бит четности, и вот моя проблема. Я хочу прикрепить бит четности к входному вектору. Но входной вектор всего 4 бита. Есть ли способ изменить его размер, просто прикрепив бит четности к входному вектору, или мне нужно передавать бит четности отдельно? И как маленький побочный вопрос по отношению ко всей реализации: Нужно ли создавать отдельные процессы для приемника и передатчика, как в моем коде, или мне просто нужно написать один процесс, содержащий оба?

Моя первая идея состояла в том, чтобы просто использовать внутренний вектор с 5 битами для присоединения бита четности, но проблема в том, что мне нужен только данный вход как выход в конце, и есть та же проблема. В процессе проверки четности я должен заполнить выходной вектор, который является 4-битным, внутренним 5-битным вектором и не знаю, работает ли он просто так, как я пытался в своем коде.

Я надеюсь, вы понимаете проблему. Спасибо.

architecture rtl of odd parity is
    signal rxdat_s   : out std_logic_vector(3 downto 0);
    signal ok_s      : out std_logic;
    signal txdat_s   : in std_logic_vector(3 downto 0);
    signal secured_s : std_logic_vector (4 downto 0);

begin 
    odd_parity_gen: process ( txdat_s, clk ) is
        variable txdat_v      : std_logic_vector(3 downto 0);
        variable secured_v    : std_logic_vector(4 downto 0);
        variable odd_parity_v : integer;
    begin 
        txdat_v := txdat_s;

        odd_parity_v := xnor txdat_v;
        secured_v    := txdat_v + odd_parity_v;

        secured_s <= secured_v;

    end process odd_parity_gen;

    odd_parity_check: process () is
        variable ok_v         : integer;
        variable rxdat_v      : std_logic_vector(3 downto 0);
        variable secured_v    : std_logic_vector(4 downto 0);
    begin
        rxdat_v   := rxdat_s;
        secured_v := secured_s;
        ok_v      := ok_s;

        ok_v    := xnor secured_v;
        rxdat_v := secured_v;

        ok_s    <= ok_v;
        rxdat_s <= rxdat_v;


    reg: process ( clk ) is
    begin
        if rising_edge (clk) then 
            if nres = '0' then
                --reset all signals
            else
                --main logic
            end if;
        end if;
    end process;

1 Ответ

1 голос
/ 23 апреля 2019

Я предполагаю, что этот код был скомпонован в качестве примера. У вас есть порты ввода / вывода в архитектуре, и ваши порты довольно запутанные: rxdat_s - это выход, а txdat_s - это вход. Также у вас нет 5-битного выходного порта, который вам нужно отправить 4 бита плюс четность.

Также это: secured_v := txdat_v + odd_parity_v; добавляет целое число и std_logic_vector, который требует преобразования или библиотеки.

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

 secured_s  <= odd_parity_v  & rxdat_s;

Или сзади, используя:

secured_s  <= rxdat_s & odd_parity_v;
...