He heredado un código VHDL que necesito extender. Hay una pieza ahí dentro que me parece un error, pero mientras soy un desarrollador de C desde hace mucho tiempo, no tengo experiencia en VHDL. Entiendo que los procesos se ejecutan esencialmente en paralelo, pero dentro de un proceso, ¿importa el pedido? En el siguiente código, un CPLD está recibiendo datos ADC en serie de un microcontrolador. El flujo de datos contiene los resultados de dos conversiones separadas de 8 bits y se está cargando en dos registros, un bit a la vez. Sin embargo, parece que al final de la recepción del primer byte de datos ADC, la MSB de este byte se sobrescribe con la MSB del segundo byte antes de que se cargue en su registro. ¿Es esto un error? He eliminado parte del código para que la muestra sea más legible.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity CPLD is port(
ADC_Clk : in std_logic;
ADC_Data : in std_logic;
end CPLD;
architecture arch_CPLD of CPLD is
signal ADC_Counter : std_logic_vector (7 downto 0);
signal ADC_Reg_1 : std_logic_vector (7 downto 0);
signal ADC_Temp : std_logic_vector (7 downto 0);
begin
-- Shift in data from two 8-bit ADC channels
-- ADC_Counter incremented by another process on rising edge of ADC_Clk
ADC_Shift: process(ADC_Clk)
begin
if (falling_edge(ADC_Clk)) then
-- Shift in 8 bits from ADC data channel 1
if (ADC_Counter = 5 ) then -- skip over sync bits
ADC_Temp(7) <= ADC_Data; -- get MSB of data
elsif (ADC_Counter = 6 ) then
ADC_Temp(6) <= ADC_Data;
-- code omitted for clarity : getting bits 5 to 1
elsif (ADC_Counter = 12 ) then
ADC_Temp(0) <= ADC_Data; -- get LSB of data
-- shift in 8 bits from ADC data channel 2
elsif (ADC_Counter = 13 ) then
ADC_Temp(7) <= ADC_Data; -- BUG? Overwriting MSB with next byte?
ADC_Reg_1 <= ADC_Temp; -- first byte of data to Register 1
elsif (ADC_Counter = 14 ) then -- continue getting second byte
ADC_Temp(6) <= ADC_Data;
-- code omitted for clarity
end if;
end if;
end process ADC_Shift;
end arch_CPLD;