Hi, ich habe einen 24x24 Bit Multiplizierer programmiert, der weil ich genug Zeit habe und nicht 4 18x18 Multiplizierer verbraten will seriell mit einem 18x18 arbeitet. Jetzt sagt mir ISE zwar das: ======================================================================== = Advanced HDL Synthesis Report Macro Statistics # FSMs : 1 # Multipliers : 1 18x18-bit multiplier : 1 # Adders/Subtractors : 4 24-bit adder : 2 48-bit adder : 2 # Registers : 186 Flip-Flops : 186 ======================================================================== = aber am Ende steht das: ======================================================================== = * Final Report * ======================================================================== = ... # MULT18X18SIO : 2 ======================================================================== = Warum sinds auf einmal 2? Und noch eine Frage. Mein Ressourcenverbrauch schaut so aus: Device utilization summary: --------------------------- Selected Device : 3s700afg484-5 Number of Slices: 271 out of 5888 4% Number of Slice Flip Flops: 186 out of 11776 1% Number of 4 input LUTs: 507 out of 11776 4% Number of IOs: 99 Number of bonded IOBs: 99 out of 372 26% Number of MULT18X18SIOs: 2 out of 20 10% Number of GCLKs: 1 out of 24 4% Das kommt mir relativ viel vor aber ich habe auch keinerlei Erfahrung damit. Vielleicht kann mir jemand der sie hat sagen, ob das für solches Modul angemessen ist oder ich eher ineffizient designed habe. Gruß philip
Ohne Source Code ist es schwer was zu sagen, aber eventuell hast Du signed und unsigned verwechelt. Beachte also das Vorzeichen bei Deinen MUL-Operationen. Kest
Sollte eigentlich unsigned sein. Und nochwas - ich habe das Ganze mit variabler Eingangswortbreite 19-36 Bit realisiert, die ich als generic N übergebe. Wenn ich das gleiche Design für einen festen Wert mache, also N im code durch 24 ersetze, statt 24 zu übergeben, verbrauche ich deutlich weniger Ressourcen. Warum ist das so? Hier mal der Code für 24 Bit fest: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity mult24BitU_ser is port( clk: in std_logic; start: in std_logic; m1, m2: in std_logic_vector(23 downto 0); p: out std_logic_vector(47 downto 0); done: out std_logic ); end mult24BitU_ser; architecture bhv of mult24BitU_ser is signal multin1, multin2: std_logic_vector(17 downto 0); signal multout: std_logic_vector(35 downto 0); signal add_mout: std_logic_vector(47 downto 0); signal Sum: std_logic_vector(47 downto 0); begin multout <= multin1 * multin2; Statemachine: process(clk) type state is(idle, multaa, multab, multba, multbb, wait_res); variable pstate: state := idle; variable switch_state: boolean := false; variable waitcycle: boolean := true; begin if(rising_edge(clk))then if(switch_state)then switch_state := false; waitcycle := false; if(pstate = idle)then pstate := multaa; elsif(pstate = multaa)then pstate := multab; elsif(pstate = multab)then pstate := multba; elsif(pstate = multba)then pstate := multbb; elsif(pstate = multbb)then pstate := wait_res; elsif(pstate = wait_res)then pstate := idle; end if; end if; if(pstate = idle)then if(start = '1')then Sum <= (others => '0'); add_mout <= (others => '0'); done <= '0'; switch_state := true; end if; end if; if(pstate = multaa)then -- Multiplikation aa multin1 <= m1(17 downto 0); multin2 <= m2(17 downto 0); switch_state := true; end if; if(pstate = multab)then add_mout(35 downto 0) <= multout;-- Ergebnis multaa -- Multiplikation ab multin1 <= m1(17 downto 0); multin2(5 downto 0) <= m2(23 downto 18); multin2(17 downto 6) <= (others => '0'); switch_state := true; end if; if(pstate = multba)then Sum <= Sum + add_mout;-- Ergebnis multaa aufaddieren add_mout(47 downto 18) <= multout(29 downto 0); -- Multiplikation ba multin1 <= m2(17 downto 0); multin2(5 downto 0) <= m1(23 downto 18); multin2(17 downto 6) <= (others => '0'); switch_state := true; end if; if(pstate = multbb)then Sum <= Sum + add_mout;-- Ergebnis multab aufaddieren add_mout(47 downto 18) <= multout(29 downto 0); -- Multiplikation bb multin1(5 downto 0) <= m1(23 downto 18); multin2(5 downto 0) <= m2(23 downto 18); multin1(17 downto 6) <= (others => '0'); multin2(17 downto 6) <= (others => '0'); switch_state := true; end if; if(pstate = wait_res)then if(not waitcycle)then Sum <= Sum + add_mout;-- Ergebnis multba aufaddieren add_mout(47 downto 36) <= multout(11 downto 0);-- Ergebnis multbb waitcycle := true; else p <= Sum + add_mout;-- Wert ausgeben done <= '1'; switch_state := true; end if; end if; end if; end process; end bhv;
Die vorige Frage hat sich erledigt, hab falschen Wert für N verwendet...
Siehe Xilinx xapp467: "Each embedded multiplier block (MULT18X18 primitive) supports two independent dynamic data input ports: 18-bit signed or 17-bit unsigned." Da Du 18 bit unsigned hast (das gleiche wie std_logic_vector), werden daraus 2 MUL(tiplizierer) gebaut. Grüße Kest
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.