Konvertierung von numeric_std unsigned std_logic_vector zu in vhdl
Ich habe eine Frage im Zusammenhang mit der Umrechnung von numeric_std auf std_logic_vector. Ich bin mit gleitender-Mittelwert-filter code, den ich online sah und Filterung meiner ADC-Werte auf stabile Werte.
Dem filter-Paket, code:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package filterpack is
subtype number is unsigned(27 downto 0);
type numbers is array(natural range <>) of number;
function slv_to_num(signal slv: in std_logic_vector) return number;
procedure MAF_filter(
signal x: in number;
signal h: inout numbers;
signal y: out number
);
end filterpack;
package body filterpack is
function slv_to_num(signal slv: in std_logic_vector) return number is
variable x: number := (others => '0');
begin
for i in slv'range loop
if slv(i) = '1' then
x(i+4) := '1';
end if;
end loop;
return x;
end function slv_to_num;
procedure MAF_filter(
signal x: in number;
signal h: inout numbers;
signal y: out number
) is
begin
h(0) <= x + h(1); -- h[n] = x[n] + h[n-1]
y <= h(0) - h(h'high); -- y[n] = h[n] - h[n-M]
end MAF_filter;
end package body filterpack;
In meine top-level-Datei, ich nenne das MAF_filter Verfahren.
Asign_x: x <= slv_to_num(adc_dat);
Filter: MAF_filter(x,h,y);
Den adc_dat ist definiert als:
adc_dat : out std_logic_vector (23 downto 0);
Möchte ich umwandeln der Ausgabe von der MAF_Filter zu std_logic_vector (23 downto 0). Kann jemand sagen wie kann ich umwandeln filter-Ausgang 'y' , 'std_logic_vector'?
Vielen Dank!
InformationsquelleAutor user3008991 | 2013-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was willst du mit den zusätzlichen 4 bit? Ihre Art
number
28 bits, aber Ihre signaladc_dat
hat nur 24.Wenn es ok, um Sie zu verwerfen, den Sie verwenden könnten:
Auch, gibt es einen Grund, nicht zu schreiben, Ihre Funktion
slv_to_num
wie unten gezeigt?Ich bearbeitet habe, die Antwort mit einem Vorschlag für Ihre Funktion
slv_to_num
InformationsquelleAutor rick
Die Konvertierung zu lösen hat 2 Probleme : die Art Unterschied, den Sie notiert haben, und die Tatsache, dass die beiden Wörter sind in verschiedenen Größen.
Typ Unterschied ist einfach :
std_logic_vector (y)
geben Sie den korrekten Typ. Da die beiden Typen sind verwandt mit Arten, dies ist nur ein cast.Die Größe unterscheidet ... nur Sie haben das wissen, das zu tun.
adc_dat <= std_logic_vector(y(23 downto 0))
geben Sie die LSBs von Y, d.h. der Wert von Y selbst, kann aber überlaufen. Oder, wie Rick sagt,adc_dat <= std_logic_vector(y(adc_dat'range));
ist in der Regel besser, aber ich wollte aufzeigen, details.adc_dat <= std_logic_vector(y(27 downto 4))
nicht überlaufen, aber eigentlich gibt Sie y/16.InformationsquelleAutor Brian Drummond