Forum: FPGA, VHDL & Co. range selector?


von Daniel -. (root)


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:

1
constant enable_bit: integer := 6;
2
3
comp: entity comparator port map(
4
    op1 => some_4bit_value,
5
    op2 => reg_control(3 downto 0),
6
    operation => reg_control(5 downto 4),
7
    enable => reg_control(enable_bit)
8
);

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.

1
constant enable_bit: integer := 6;
2
constant operation_bits: ???? := 5 downto 4;
3
4
comp: entity comparator port map(
5
    op1 => some_4bit_value,
6
    op2 => reg_control(3 downto 0),
7
    operation => reg_control(operation_bits),
8
    enable => reg_control(enable_bit)
9
);

I am sure you got the idea ;)

Ist das irgendwie möglich?

von Duke Scarring (Gast)


Lesenswert?

Vielleicht hilft Dir alias weiter?!

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

Duke

von Daniel -. (root)


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^^

von Duke Scarring (Gast)


Lesenswert?

Du suchst eigentlich sowas, oder?:
1
subtype operation_bits is natural range 5 downto 4;

Alternativ kannst Du records verwenden.

Duke

von Daniel -. (root)


Lesenswert?

1
-- regXcontrol [reserved, out_enable, sel3, sel2, sel1, sel0, op1, op0]
2
constant out_enable_bit: integer := 6;
3
constant operand: std_logic_vector(5 downto 2) := "0000";
4
constant operation: std_logic_vector(1 downto 0) := "00";
5
6
-- zugriff
7
mux2: entity muxvar port map(
8
  insig0 => shifter_reg,
9
  insig1 => counter4_reg,
10
  insig2 => counter5_reg,
11
  insig3 => counter6_reg,
12
  insig4 => counter7_reg,
13
  insig5 => counter8_reg,
14
  sel => reg2_control(operand'range),
15
  outsig => second_operand(2)
16
);
17
18
comp2: entity comparator port map(
19
  operand1 => reg2,
20
  operand2 => second_operand(2),
21
  operation => reg2_control(operation'range),
22
  output_enable => reg2_control(out_enable_bit),
23
  result => result(2)
24
);

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.

von Duke Scarring (Gast)


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).
1
type operation_t is (nop, add, sub, mul, div);
2
3
type op_t is record
4
 op1       : std_logic_vector(3 downto 0);
5
 op2       : std_logic_vector(3 downto 0);
6
 operation : operation_t;
7
 en        : boolean;
8
end record op_t;
9
10
constant default_op_c : op_t := (
11
  op1       => (others => '0'),
12
  op2       => (others => '0'),
13
  operation => nop,
14
  en        => false
15
);

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

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.