Wie verwenden von generischen Parameter, die abhängig von anderen generischen Parameter für Entitäten?
Ich versuche zu konvertieren einige Verilog-code erzeugt eine langsamere Uhr von einem schnelleren Takt für die UART-Modul. Die original-verilog-code basiert auf dem Modul über an fpga4fun.com und dies ist mein Versuch zu übersetzen, es für meine VHDL-basierten Entwurf.
entity baud_generator is
generic(
f_clk : integer := 50000000; -- default: 50 MHz
baud : integer := 115200; -- default: 115,200 baud
accum_width : integer := 16;
accum_inc : integer := (baud sll accum_width) / f_clk
);
port(
clock : in std_logic;
reset_n : in std_logic;
enable : in std_logic;
baud_clock : out std_logic
);
end entity baud_generator;
Aber mein compiler, Aldec-HDL, nicht eine Zeile wie die folgende:
accum_inc : natural := (baud sll accum_width) / f_clk
Hier ist die genaue Fehlermeldung:
# Error: COMP96_0300: baud_generator.vhd : (20, 52): Cannot reference "f_clk" until the interface list is complete.
# Error: COMP96_0300: baud_generator.vhd : (20, 28): Cannot reference "baud" until the interface list is complete.
# Error: COMP96_0071: baud_generator.vhd : (20, 28): Operator "sll" is not defined for such operands.
# Error: COMP96_0104: baud_generator.vhd : (20, 27): Undefined type of expression.
# Error: COMP96_0077: baud_generator.vhd : (20, 27): Assignment target incompatible with right side. Expected type 'INTEGER'.
In verilog, ich habe so etwas wie dieses:
module baud_generator(
input clock,
input reset_n,
input enable,
output baud_clock
);
parameter f_clock = 50000000;
parameter baud = 115200;
parameter accum_width = 16;
parameter accum_inc = (baud << accum_width) / f_clock;
//...
endmodule
Was ist es, was ich brauche, um zu ändern in die Zeile, um den compiler glücklich? Ist es möglich, dass Generika verwendet werden verkettet, wie das?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese im Grunde sagt Sie können nicht tun Berechnungen mit generischen Werten zu caluclate (default-Werte für) andere Generika.
Verwenden Sie einfach
accum_inc
als Konstante, nicht als eine Allgemeine.Auch, die SLL (shift logic Links) operator gemeint ist, für die bit-Muster (
unsigned
undsigned
Datentypen in derieee.numeric_std
undieee.numeric_bit
Pakete), nicht für ganze zahlen. Das gleiche können Sie durch Multiplikation mit einer Potenz von zwei.Sieht es für mich wie
accum_inc
ist eine Konstante, ein parameter (wie es errechnet sich aus der Generika, also gibt es keinen Grund, um es zu überschreiben)Damit es nicht möchten, werden in den generischen Teil - einfach verschieben Sie es an die Architektur und machen es zu einem Konstanten (und als Philippe erwähnt, tun Sie Ihre Schaltung mit multipliziert):
Können Sie feststellen, dass Sie überlaufen, was
integer
s verwalten können, je nachdem die Werte der generics, so dass Sie vielleicht finden, die Sie verwenden möchtenunsigned
Vektoren in der Generika-und/oder Berechnung.