pregunta de UART HDL

-1

Para el siguiente código HDL de TinyTx , ¿por qué?

  

shift_reg < = '1' & datos y amp; '0';

y

  

shift_reg < = '0' & shift_reg (9 downto 1);

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tiny_rs232_tx is
    Port ( clk         : in  STD_LOGIC;
       bit_tick    : in  STD_LOGIC;
       data        : in  STD_LOGIC_VECTOR(7 downto 0);
       data_enable : in  STD_LOGIC;
       tx          : out STD_LOGIC := '1';
       busy        : out STD_LOGIC );
end tiny_rs232_tx;

architecture Behavioral of tiny_rs232_tx is
signal shift_reg  : std_logic_vector(9 downto 0) := (others => '1');
signal i_busy     : std_logic;

begin
    busy <= i_busy;
    with shift_reg select i_busy <= '0' when "0000000000", '1' when others;

clk_proc: process(clk)
begin
    if rising_edge(clk) then
        if i_busy = '0' and data_enable = '1' then
            shift_reg <= '1' & data & '0';
        end if;             

        if bit_tick = '1' then
            if i_busy = '1' then
                tx <= shift_reg(0);
                shift_reg <= '0' & shift_reg(9 downto 1);
            end if;
        end if;
    end if;
end process;
end Behavioral;

¿Alguien podría pensar en formas de reducir el uso de recursos incluso más allá del enfoque de codificación original?

    
pregunta kevin

1 respuesta

0

Básicamente, las dos líneas forman el registro de desplazamiento de datos que convierte un bus de datos paralelo a uno serial.

Con UART hay un bit de inicio ( 0 ), seguido de hasta 9 bits de datos (el número exacto está predeterminado, típicamente 7 u 8 bits), y terminó con un bit de parada ( 1 ). Además, los datos se desplazan hacia fuera LSB primero. En su ejemplo, es un dato de 8 bits, así que lo usaré para el resto de la respuesta.

Sobre esta base, debería ser más claro lo que hace la línea '1' & data & '0'; . Simplemente concatena un bus de datos paralelo de 10 bits que consiste en un 1 como el MSB (bit de parada) y un 0 como el LSB (bit de inicio), con los 8 bits de datos en el medio (LSB de datos más cercanos al inicio) bit).

Para formar el registro de desplazamiento, donde el LSB sale primero, se usa la construcción shift_reg <= '0' & shift_reg(9 downto 1); . Esto toma ese número de 10 bits, mueve cada bit hacia abajo uno hacia el LSB. Puede ver cómo el bit 1 de shift_reg se mueve al bit 0, y así sucesivamente. Se agrega 0 a la MSB para mantener los datos a 10 bits de ancho.

Se puede ver en tx <= shift_reg(0); que al mismo tiempo que se cambian los datos, el LSB no se pierde, se mueve al registro de salida tx que lo presenta en la salida del módulo.

Como nota al margen, en realidad debería ser un 1 que se agrega a la MSB cuando se desplaza. De esta manera, podría dejar la palanca de cambios en funcionamiento (continuaría registrando los bits de parada) y ahorrar algo de lógica en el proceso.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas