La Conversion de numeric_std unsigned à std_logic_vector en vhdl
J'ai une question liée à la conversion de numeric_std à std_logic_vector. Je suis à l'aide de la moyenne mobile de filtre de code que j'ai vu en ligne et de filtrage de mes valeurs d'ADC à la stabilité des valeurs.
Le filtre de paquet 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;
Dans mon top niveau fichier, je l'appelle le MAF_filter procédure.
Asign_x: x <= slv_to_num(adc_dat);
Filter: MAF_filter(x,h,y);
La adc_dat est défini comme:
adc_dat : out std_logic_vector (23 downto 0);
Je veux convertir la sortie de la MAF_Filter à std_logic_vector (23 downto 0). Si quelqu'un peut dire comment puis-je convertir sortie du filtre " y " à "std_logic_vector'?
Merci Beaucoup!
Vous devez vous connecter pour publier un commentaire.
Que voulez-vous faire avec les 4 bits? Votre type de
number
a 28 bits, mais votre signaladc_dat
a seulement 24.Si c'est ok pour les jeter, vous pouvez utiliser:
Aussi, est-il une raison de ne pas écrire votre fonction
slv_to_num
comme indiqué ci-dessous?slv_to_num
La conversion de résoudre 2 problèmes : le type de la différence que vous avez noté, et le fait que les deux mots sont de tailles différentes.
Le type de la différence est facile :
std_logic_vector (y)
vous donnera le bon type. Parce que les deux types sont des types, c'est juste un lancer.La différence de taille ... que vous avez les connaissances pour le faire.
adc_dat <= std_logic_vector(y(23 downto 0))
vous donnera le Lsb de Y - c'est à dire la valeur de Y lui-même, mais risque de déborder. Ou comme Rick dit,adc_dat <= std_logic_vector(y(adc_dat'range));
qui est généralement mieux, mais je voulais exposer les détails.adc_dat <= std_logic_vector(y(27 downto 4))
ne peut pas déborder, mais en réalité vous donne y/16.