Forum: FPGA, VHDL & Co. Null an generisch erzeugten std_vector zuweisen


von Philip (Gast)


Lesenswert?

Hallo,

ich möchte ein D-Register beliebiger Länge mit asynchronem Reset 
beschreiben. Das heißt, der Ausgang soll damit auf "0000...0" gesetzt 
werden. Nun weiß ich nicht, wie ich diese Zuweisung in der Architecture 
umsetze, wenn ich noch gar nicht weiß, wie lang das Ausgangswort ist.

Gruß Philip

von franz (Gast)


Lesenswert?

Hallo Philip,

>> ich möchte ein D-Register beliebiger Länge mit asynchronem Reset
>> beschreiben.
Das würde ich lieber nicht machen, wenn dann synchroner Reset

>> Das heißt, der Ausgang soll damit auf "0000...0" gesetzt
>> werden.
AUSGANG <= (others => '0');

>> wenn ich noch gar nicht weiß, wie lang das Ausgangswort ist.
Stichwort: generic

Gruß
franz

von Philip (Gast)


Lesenswert?

Das war genau das was ich gesucht habe, danke!

Das mit dem generic war mir schon klar, aber ich kann ja keine Zuweisung

Ausgang <= '00000' machen, wenn Ausgang beliebig lang ist.

von T.M. (Gast)


Lesenswert?

>> >> ich möchte ein D-Register beliebiger Länge mit asynchronem Reset
>> >> beschreiben.
>> Das würde ich lieber nicht machen, wenn dann synchroner Reset

Es gibts in manchen Fällen auch gute Gründe für einen asynchronen Reset, 
siehe:
http://www.sunburst-design.com/papers/CummingsSNUG2002SJ_Resets.pdf
http://www.sunburst-design.com/papers/CummingsSNUG2003Boston_Resets.pdf

>> Das mit dem generic war mir schon klar, aber ich kann ja keine Zuweisung
>> Ausgang <= '00000' machen, wenn Ausgang beliebig lang ist.

Ausgang <= (others => '0');

funktioniert immer, wenn der Vektor mehr als 1 bit hat.

von NorthernLights (Gast)


Lesenswert?

Hei,

hier ein Beispiel für ein Register mit beliebiger Breite und Resetwert.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;


entity dff_n is
generic(
  dff_width   : positive := 8;
  reset_value : positive := 16#0#); -- Hexwerte : 16#WERT#
port(
  clk : in std_logic;
  rst : in std_logic;

  d   :  in std_logic_vector(dff_width-1 downto 0);
  q   : out std_logic_vector(dff_width-1 downto 0));
end entity dff_n;

architecture dff_n_arch of dff_n is
  signal q_int : std_logic_vector(dff_width-1 downto 0);
begin

DFF_N_REG : process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      q_int <= std_logic_vector(conv_unsigned(reset_value, dff_width));
    else
      q_int <= d;
    end if;
  end if;
end process;

q <= q_int;

end architecture dff_n_arch;

Gruss,
  NL

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.