Hello everyone!
Im trying to make a entity for a N entrances AND, using LOG2 and
geometric progression sum, like below...
Example for N = 8
aux(1 to N) <= entrance;
aux(9) <= aux(1) AND aux(2)
aux(10) <= aux(3) AND aux(4)
aux(11) <= aux(5) AND aux(6)
aux(12) <= aux(7) AND aux(8)
aux(13) <= aux(9) AND aux(10)
aux(14) <= aux(11) AND aux(12)
aux(15) <= aux(13) AND aux(14)
This is what I hope to be produced using the code below...
entity and_gate_Nbits_LOG is
-- Definição do valor de N
generic (
N : natural := 4 -- Número de entradas do AND_GATE
);
-- Lista de Entradas e Saídas da Entidade
port(
entrada : in bit_vector ( 1 to N );
saida : out bit
);
-- Fim da Entidade
end entity;
-- Definição da Arquitetura do AND_GATE de N entradas
architecture main of and_gate_Nbits_LOG is
-- Sinal Auxiliar que armazenará os resultados parciais dos ANDs
entre as entradas
signal aux : bit_vector ( 1 to 2*N );
-- Função que calcula o Logarítmo na base 2 de um número natual X
function LOG_2 ( x : natural ) return natural is
variable temp : natural := x;
variable result : natural := 0;
begin
-- Loop que fatora X em 2
while temp > 1 loop
temp := temp / 2;
result := result + 1;
end loop;
-- Retorna o Log2(X)
return result;
end function LOG_2 ;
-- Início da descrição da Arquitetura do AND_GATE de N entradas
begin
-- Sinal aux replica a entrada
aux(1 to N) <= entrada;
-- Estrutura de repetição que percorre os níveis de AND's
and_Nbits: for i in 1 to LOG_2(N) generate
-- Estrutura de repetição que gera todos os AND's de cada nível
ands_nivel: for j in (1+(N-(N/(2**(i-1))))) to (N-N/(2**(i)))
generate
-- Auxiliar do próximo nível recebe o AND do nível atual
aux(2*(N-N/(2**(i))+1)+(j-(1+(N-(N/(2**(i-1))))))) <=
aux(2*j-1) and aux(2*j);
-- Fim do FOR
end generate ands_nivel;
-- Fim do FOR
end generate and_Nbits;
-- Saída recebe o resultado do último AND
saida <= aux(2*N-1);
-- Fim da Arquitetura do AND_GATE de N entradas
end architecture;
-------------------------------------------------------
But the simulation in ModelSIm is doing
aux(6) <= aux(1) and aux(2)
instead
aux(5) <= aux(1) and aux(2)
The simulation skip 1 aux in every "for j" and I couldnt know why.
Ive tested the math of the code in others languages and everything work
as expected.
I need help! Please someone!
Keyslav wrote: > The simulation skip 1 aux in every "for j" How do you see that? Whats your testbench like? > Ive tested the math of the code in others languages and everything work > as expected. I assume, the problem here is, that VHDL is not a "top down" language like other languages are. Keyslav wrote: > trying to make a entity for a N entrances AND, using LOG2 and > geometric progression sum, like below... Must you do it in that progrssion style or can you solve the problem in a more simple way? If so: why don't you use the and_reduce() function in the std_logic_misc package? http://www1.pldworld.com/@xilinx/html/technote/tool/manual/15i_doc/fndtn/vhd/vhd10_3.htm The code of the and_reduce is not that hard to understand. I swapped the std_logic to bit:
1 | function AND_REDUCE(ARG: bit_vector) return bit is |
2 | variable result: bit := '1'; |
3 | begin
|
4 | for i in ARG'range loop |
5 | result := result and ARG(i); |
6 | end loop; |
7 | return result; |
8 | end; |
The trick is passing an unconstrained vector ARG as an argument and using the 'range attribute... In VHDL 2008 you are allowed to do things like this (v is a vector, b is a single bit):
1 | b <= and v; |
BTW1: 1 to N is a very strange bit order.
1 | entrada : in bit_vector ( 1 to N ); |
Usually the leftmost bit in a vector is the most significant bit and the rightmost bit is bit 0:
1 | entrada : in bit_vector ( N-1 downto 0 ); |
BTW2: Why do you use bit and bit_vector despite of the whole world using std_logic and st_logic_vector? BTW3: You should add a check for N being a power of 2. And indicate an error when its not...
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.