range selector?

OP #1245618
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?
OP #1245632
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^^
OP #1245934
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.
Gast #1246229
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren