¿Qué hace este código vhdl? Hemos entendido que se usa para contar hacia arriba y hacia abajo. Pero no estamos entendiendo los tecnicismos.

-1
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_Arith.ALL;
use IEEE.STD_LOGIC_Unsigned.ALL;


Library UNISIM;
use UNISIM.vcomponents.all;


entity freq_div is
    Port (clk_p, clk_n , rst, up, pause : in  STD_LOGIC;
           count : out  STD_LOGIC_vector(3 downto 0));
end freq_div;

architecture Behavioral of freq_div is

signal clk2: std_logic;
signal cnt : std_logic_vector(3 downto 0):=(others=>'0');
signal clk: std_logic_vector(28 downto 0):=(others=>'0');


COMPONENT ila_1

PORT (  clk : IN STD_LOGIC;
    probe0 : IN STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT  ;

 begin

   IBUFDS_inst : IBUFDS
  generic map (
     DIFF_TERM => FALSE, -- Differential Termination 
     IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
     IOSTANDARD => "DEFAULT")
  port map (
     O => clk2,  -- Buffer output
     I => clk_p,  -- Diff_p buffer input (connect directly to top-level port)
     IB => clk_n -- Diff_n buffer input (connect directly to top-level port)
  );



    process(clk2, rst)
        begin
            if (rst = '1')then
                clk <= (others=>'0');
            elsif (clk2'event and clk2 = '1')then
                clk <= clk + 1;
            end if;
    end process;


    process(clk(25), rst,up,pause) 
        begin
        if (rst = '1') then
            cnt <= (others=>'0');
        elsif (clk(25) = '1' and clk(25)'event) then
            if (up = '1' and pause = '0')then
                cnt <= cnt + '1';
            elsif (up = '0' and pause = '0') then
                cnt <= cnt - '1';
            elsif( pause ='1')then
                cnt <= cnt;
            end if;
        end if;
    end process;

    count <= cnt;


    U1 : ila_1   PORT MAP (   clk => clk2 ,      probe0 => cnt    );



end Behavioral;

Estamos utilizando la placa zynq (zc702). En la placa zynq tenemos dos relojes: un reloj positivo (clk_p) y un reloj negativo (clk_n) .... Puedo ver una mención de estos dos relojes como en std_logic, pero no entiendo cómo han usado estos relojes en el programa ... es decir, ¿cómo han integrado estos dos relojes en el programa?

¿También qué es clk (25)?

También mencione el funcionamiento del código. Hemos entendido que el código se usa para contar hacia arriba y hacia abajo. No entendemos la siguiente parte:

architecture Behavioral of freq_div is
signal clk2: std_logic;
signal cnt : std_logic_vector(3 downto 0):=(others=>'0');
signal clk: std_logic_vector(28 downto 0):=(others=>'0');


COMPONENT ila_1

PORT (  clk : IN STD_LOGIC;
    probe0 : IN STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT  ;

 begin

   IBUFDS_inst : IBUFDS
  generic map (
     DIFF_TERM => FALSE, -- Differential Termination 
     IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
     IOSTANDARD => "DEFAULT")
  port map (
     O => clk2,  -- Buffer output
     I => clk_p,  -- Diff_p buffer input (connect directly to top-level port)
     IB => clk_n -- Diff_n buffer input (connect directly to top-level port)
  );
    
pregunta Anwesa Roy

2 respuestas

0

VHDL siempre describe un circuito de hardware. En primer lugar, observe los tipos de datos declarados, con especial atención al ancho de la señal. A continuación, busque cualquier submódulo que haya sido instanciado y lea cada proceso. (Normalmente uso Verilog en lugar de VHDL, por lo que no puedo confirmar si es un código VHDL válido o no. Pero puedo reconocer lo suficiente de la estructura general para ver cómo se pretende que funcione el código). Puede ayudar a dibujar El flujo de la señal de entrada a salida. Especialmente si proviene de un fondo de programación en C, puede ser fácil perder de vista el hecho de que esto es realmente más un esquema de hardware que un programa de software.

Los puertos de entrada son clk_p y clk_n (reloj diferencial), rst (reinicio), up y pause (controles para el contador arriba / abajo). El puerto de salida es count .

clk2 es un cable de señal interno de un bit.

clk es un registro interno de 29 bits que se utiliza como contador, cronometrado por clk2.

cnt es un registro de 4 bits, que es usado por el contador arriba / abajo.

La instancia IBUFDS_inst está convirtiendo el par de reloj diferencial clk_p y clk_n en clk2 . Es muy probable que este sea un búfer de entrada específico para el SoC de Zynq. La mayoría de los FPGA tienen unidades primitivas de memoria de entrada / salida / reloj específicas del dispositivo similares a esta.

El process(clk2,rst) describe un contador que simplemente incrementa el valor de clk en cada marca de clk2 . Tenga en cuenta que cada bit de clk actúa como una división por 2 del bit anterior, por lo que clk(0) se ejecuta en la mitad de la tasa clk_p , clk(1) se ejecuta en 1/4 de clk_p , clk(2) se ejecuta a 1/8 de clk_p , etc. Esta es una forma común de implementar un preescalador , para reducir la velocidad de un reloj rápido. clk(25) es solo una de las etapas más lentas del contador clk .

El process(clk(25), rst, up, pause) describe el contador arriba / abajo real. No hay sorpresas aquí. El contador tiene un comando de reinicio, una selección de dirección arriba / abajo y un comando ejecutar / pausar. Tenga en cuenta que cada ruta de ejecución tiene una asignación de bloqueo cnt <= *expression* . Para una síntesis exitosa, es esencial seguir los patrones de código que la herramienta de síntesis puede reconocer.

    
respondido por el MarkU
0

IBUFDS_inst: IBUFDS está incorporando un búfer de reloj diferencial a un único. Toma los clk_n y clk_p y genera una señal de reloj clk2

El primer proceso luego usa esta señal de reloj para aumentar un contador de 29 bits llamado clk

El segundo proceso utiliza el bit 26 de este contador como reloj y cuenta hacia arriba o hacia abajo dependiendo del estado de las señales de subida y pausa.

La salida final es un contador de 4 bits que se ejecuta en el reloj de entrada dividido por 2 ^ 27

    
respondido por el Andrew

Lea otras preguntas en las etiquetas