www.mikrocontroller.net

Forum: FPGA, VHDL & Co. range selector?


Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

ich habe einen Kontrolregister, der aus unterschiedlichen Bitgruppen
besteht. Ich möchte nun Teile davon als Range ausschneiden und 
übergeben.
So sieht es im Moment aus:

constant enable_bit: integer := 6;

comp: entity comparator port map(
    op1 => some_4bit_value,
    op2 => reg_control(3 downto 0),
    operation => reg_control(5 downto 4),
    enable => reg_control(enable_bit)
);

I would like to replace hard coded ranges (3 downto 0)
and (5 downto 0). Also so ähnlich wie ich es oben mit
enable => reg_control(enable_bit) gemacht habe.

constant enable_bit: integer := 6;
constant operation_bits: ???? := 5 downto 4;

comp: entity comparator port map(
    op1 => some_4bit_value,
    op2 => reg_control(3 downto 0),
    operation => reg_control(operation_bits),
    enable => reg_control(enable_bit)
);

I am sure you got the idea ;)

Ist das irgendwie möglich?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft Dir alias weiter?!

http://de.wikibooks.org/wiki/VHDL#alias

Duke

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es würde mir tatsächlich helfen wenn ...
ich bloss nicht einige (10) von diesen Registern hätte.
Man müsste dann für jeden eigenen alias Ausschnitt anlegen
und bei einer Änderung wieder alle anpassen.
Dagegen wäre eine constant Deklaration viel leichter anzupassen
und man wäre sicher, dass man nichts vergessen hat.

Ja dieser Murphy Sack hat bei mir schon öfters zugeschlagen :)

Das einzige was mir jetzt noch einfällt, wäre ein dummy
Arraysignal anzulegen und sig'range zu benutzen.
Ich probiere es mal aus ;)

Bin aber offen für weitere Vorschläge^^

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du suchst eigentlich sowas, oder?:
subtype operation_bits is natural range 5 downto 4;

Alternativ kannst Du records verwenden.

Duke

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-- regXcontrol [reserved, out_enable, sel3, sel2, sel1, sel0, op1, op0]
constant out_enable_bit: integer := 6;
constant operand: std_logic_vector(5 downto 2) := "0000";
constant operation: std_logic_vector(1 downto 0) := "00";

-- zugriff
mux2: entity muxvar port map(
  insig0 => shifter_reg,
  insig1 => counter4_reg,
  insig2 => counter5_reg,
  insig3 => counter6_reg,
  insig4 => counter7_reg,
  insig5 => counter8_reg,
  sel => reg2_control(operand'range),
  outsig => second_operand(2)
);

comp2: entity comparator port map(
  operand1 => reg2,
  operand2 => second_operand(2),
  operation => reg2_control(operation'range),
  output_enable => reg2_control(out_enable_bit),
  result => result(2)
);

insbesondere operand'range operation'range funktionieren wie gewünscht.
habe zwar konstanten entfremdet aber naja :)

@Duke
records habe ich noch nie eingesetzt. ich glaube, dass sie
mehr vorraussicht/struktur/plannung erfordern. bei einfachen interfaces, 
die std_logic_vector brauchen, nachträglich auf records umzustricken
wird (denke ich) nicht so easy.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> records habe ich noch nie eingesetzt. ich glaube, dass sie
> mehr vorraussicht/struktur/plannung erfordern. bei einfachen interfaces,
> die std_logic_vector brauchen, nachträglich auf records umzustricken
> wird (denke ich) nicht so easy

Es wird eher übersichtlicher dadurch (wenn man sich erstmal reingedacht 
hat).
type operation_t is (nop, add, sub, mul, div);

type op_t is record
 op1       : std_logic_vector(3 downto 0);
 op2       : std_logic_vector(3 downto 0);
 operation : operation_t;
 en        : boolean;
end record op_t;

constant default_op_c : op_t := (
  op1       => (others => '0'),
  op2       => (others => '0'),
  operation => nop,
  en        => false
);

Wenn mal ein Signal fehlt, wird einfach der record und die 
default-Konstante erweitert, ohne das man überall die 
entitys/componenten anfassen müßte.

Duke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.