Sida 1 av 1

Port mappning FPGA

Postat: 15 mars 2009, 19:53:49
av CyberLeffe
Jag vill omvandla en femton bitars vektor till BCD där de lägsta 7 bitarna representerar decimaltal och de översta 8 heltals delen. Vilket medför att jag kan representera tal från 0 till 255 med en upplösning på 0.01. Detta har jag löst genom att skriva en binary-to-BCD converter enligt Double-Dabble algoritm.

I Double-Dabble omvandling använder man en 4 bitars adderare för att omvandla talen. Ju fler bitar man ska omvandla desto fler adderare använder man. Då dessa adderare är likadana skulle jag vilja port mappa till min fil där jag har definierat adderaren. Totalt använder jag 12 adderare i omvandlaren och jag tycker därför att det borde vara det bästa sättet. Men hur kan jag skriver jag för att port mappa samma entity flera gånger i en och samma arkitektur?

Som det är nu har jag 12 filer med adderare där den ända skillnaden mellan dom är att deras entity har olika namn. Detta gör att jag kan mappa in dom i min överliggande design. Men det måste ju finnas ett bättre sätt...


PDF om Double-Dabble

Re: Port mappning FPGA

Postat: 15 mars 2009, 20:46:22
av LHelge
Titta på senaste posten i tråden:
http://elektronikforumet.com/forum/view ... =7&t=33022

Där har jag skapat tre stycken instanser av tre olika entitys. Till exempel den som heter uart_rx1 av typen uart_rx, av dessa kan jag skapa så många jag vill.

Re: Port mappning FPGA

Postat: 16 mars 2009, 10:12:23
av AAVE
jag förstår inte ditt problem, kan inte du vissa oss lite av koden?

Re: Port mappning FPGA

Postat: 16 mars 2009, 13:10:56
av Andax
Låter som om du skulle nyttja FOR-GENERATE i vhdl. Se t.ex. länk

Re: Port mappning FPGA

Postat: 18 mars 2009, 00:30:52
av CyberLeffe
Jag fiskade efter det LHelge hänvisade till, att lägga till flera komponenter av samma typ. Här componenten C0 som jag lägger in flera gånger vid namn U0 och U1.

Här är min adderare.

Kod: Markera allt

entity C0 is
  port(
      a            :in  std_logic_vector(3 downto 0);
      s            :out std_logic_vector(3 downto 0)
      );
end C0;
------------------------------------------------------------------------------   
architecture arch_C0 of C0 is

  begin

 	s(3) <= a(3) OR (a(2) AND a(0)) OR (a(2) AND a(1));
	s(2) <= (a(3) AND a(0)) OR (a(2) AND NOT a(1) AND NOT a(0));
	s(1) <= (a(3) AND NOT a(0)) OR (NOT a(2) AND a(1)) OR (a(1) AND a(0));
	s(0) <= (a(3) AND NOT a(0)) OR (NOT a(3) AND NOT a(2) AND a(0)) OR (a(2) AND a(1) AND NOT a(0));


end arch_C0;
Jag har sedan koppla ihop en hel drös likadana adderare till en BCD decoder.

Kod: Markera allt

architecture arch_BCD of BCD is
component C0 is
  port(
      a              :in  std_logic_vector(3 downto 0);
      s              :out std_logic_vector(3 downto 0)
		);
end component;

begin
U0:component C0 
   port map(
		  a(0)  => d(1),
      a(1)  => C_1(0), 
      a(2)  => C_1(1),
		  a(3)  => C_1(2),
      s(0)  => Tth(1),
      s(1)  => Tth(2),
      s(2)  => Tth(3),
		  s(3)  => U(0)
      );	

U1:component C0 
   port map(
      a(0)  => d(2),
      a(1)  => C_2(0), 
      a(2)  => C_2(1),
      a(3)  => C_2(2),
      s(0)  => C_1(0),
      s(1)  => C_1(1),
      s(2)  => C_1(2),
      s(3)  => C_1(3)
      );



Re: Port mappning FPGA

Postat: 18 mars 2009, 01:24:39
av Andax
Att lägga till flera av samma instans är just det man använder FOR-GENERATE till. Man för en for-loop och som instansierar en instans för varje varv i loopen. Och i loopen kan man koppla rätt in och utgångar.

Re: Port mappning FPGA

Postat: 18 mars 2009, 12:56:22
av AAVE
behöver du VHDL komponenter överhuvudtaget?

Kod: Markera allt

if a < 5 then s := a;
elsif  a < 10 then s:= a + 3;
else s := (others => 'X');

Re: Port mappning FPGA

Postat: 18 mars 2009, 16:53:28
av CyberLeffe
Anledningen till att jag använder komponenter är att det är 18 adderare totalt och jag tänkte att det blev enklare att göra på detta sätt. Men jag är öppen för förslag.

Så här är adderarna ihop kopplade.

Bild

H = hundratal
T = tiotal
U = ental
Tth = tiondel

Så den kan ge tal mellan 0 och 409.6 med upplösningen 0.1

Re: Port mappning FPGA

Postat: 18 mars 2009, 17:28:47
av AAVE
Jag undrar om man kan få ISE att göra hela jobbet?

Kod: Markera allt

variable tmp, a, b : integer range 0 to 4095;
...
tmp := to_integer(tal);
for i in 0 to 3 loop
	a := tmp / 10;
	b := tmp - a * 10;
	dec(i) <= b;
	tmp := a;
end loop;
kan hända att man behöver trixa lite för att få ner storleken, men det ska nog gå...