Hallo,
Voor mijn opleiding (elektrotechniek aan de Haagse Hogeschool te Delft) moet ik in VHDL op 4 verschillende manieren een multiplier maken.
De eerste 3 zijn me wel gelukt (ster, combi, en pipe), maar de 4e lukt mij niet 
Het gaat hier over een sequentiële multiplier die ik moet beschrijven in VHDL (dus zonder die visuele figuurtjes).
Hier de afbeelding uit de opdracht:
Het is dus de bedoeling dat hij verschoven gaat optellen.
Dit is de code die ik al heb:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
ENTITY M8x8_sequ IS
PORT(
a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
start : IN STD_LOGIC;
clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
p_reg : BUFFER STD_LOGIC_VECTOR (15 DOWNTO 0)
);
END M8x8_sequ ;
----------------------------------------------------------------------
ARCHITECTURE v OF M8x8_sequ IS
SIGNAL s : STD_LOGIC_VECTOR (8 DOWNTO 0);
SIGNAL cntr : NATURAL RANGE 0 TO 9;
SIGNAL a_reg : STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
process(clk, rst, start)
begin
if rst='1' then
a_reg<=(others=>'0');
p_reg<=(others=>'0');
s <=(others=>'0');
cntr <= 0;
elsif start='1' then
cntr <= 9;
a_reg <= a;
p_reg <= "00000000"&b;
elsif rising_edge(clk) then
if cntr>0 then
if p_reg(0)='1' then
--linkerdeel p_reg + a_reg
s<=('0'&p_reg(15 DOWNTO 8))+('0'&a_reg(7 DOWNTO 0));
else
--linkerdeel p_reg
s<=('0'&p_reg(15 DOWNTO 8));
end if;
p_reg<=s(8 DOWNTO 0)&p_reg(7 DOWNTO 1);
cntr <= cntr - 1;
else
--cntr =< 0
end if;
end if;
end process;
END ARCHITECTURE v;Deze bovenstaande code geeft geen error's, maar presteert het toch om een verkeerde uitkomst uit de berekening te laten komen (door mijn fout
).
Al met al heb ik het idee dat de oplossing of heel simpel zal zijn, maar dat ik teveel naar deze code hebt gekeken om de oplossing nog te kunnen zien 
Bij voorbaat dank voor het lezen van mijn redelijk lange post, en op-/aanmerkingen mbt de post zijn natuurlijk altijd welkom!
Ivar
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Vraag 1: heb je al een testbench en daar de resultaten bekeken?
Vraag 2: waarom een asynchrone preset (if start='1')?
[Bericht gewijzigd door flipflop op (31%)]
probeer inderdaad een testbench te maken. Hiermee kun je beter zeggen waar de fout zit. Nu is de hele module fout, en je zegt al, door de lap code zie je zelf de fout niet. Er is ook zo 1 2 3 niets fout, dus testbench schrijven, plaatje van resultaat maken en dat hier weergegeven. Dan zal het vast snel opgelost zijn.
Ik ga er nu natuurlijk van uit dat je een testbench kunt maken...
Ik heb het geheel getest met ModelSim, hier valt mij op dat er een vertraging zit tussen het moment dat de waarde van s wordt 'opgetelt' bij p_reg.
Ik zou graag een mooi plaatje te maken, maar dan moet ik eerst even ModelSim op m'n eigen pc installeren omdat ik tot maandag niet meer op school kom.
Nu had ik zelf net een ingeving: zou het een probleem kunnen zijn dat ik de s die ik binnen het process gebruik om de tijdelijke waarde in te zetten ook binnen het process weer wil uitlezen. Dus is s op het moment dat ik dit doe "p_reg<=s(8 DOWNTO 0)&p_reg(7 DOWNTO 1);" al bijgewerkt aan de waarde die ik in de if daarboven erin wil zetten, of wordt deze waarde pas aan het eind van het process doorgevoerd (volgensmij heeft de docent hier iets over vertelt
)? Als dit waar is zal ik die p_reg buiten het process moeten halen zodat die direct wordt uitgevoerd als de s veranderd (vanuit het process).
PS. ik zit nog in de eerste klas, dus mijn kennis is nog wel iets beperkt 
Ik heb de oplossing gevonden! 
De onderstaande code werkt, maar op en/of aanmerkingen om het te verbeteren zijn natuurlijk altijd welkom.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
ENTITY M8x8_sequ IS
PORT(
a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
start : IN STD_LOGIC;
clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
p_reg : BUFFER STD_LOGIC_VECTOR (15 DOWNTO 0)
);
END M8x8_sequ ;
----------------------------------------------------------------------
ARCHITECTURE v OF M8x8_sequ IS
SIGNAL s : STD_LOGIC_VECTOR (8 DOWNTO 0);
SIGNAL cntr : NATURAL RANGE 0 TO 9;
SIGNAL a_reg : STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
process(clk, rst, start)
begin
if rst='1' then
cntr <= 0;
a_reg<=(others=>'0');
p_reg<=(others=>'0');
elsif start='1' then
cntr <= 8;
a_reg <= a;
p_reg <= "00000000"&b;
elsif rising_edge(clk) then
if cntr>0 then
p_reg<=s(8 DOWNTO 0)&p_reg(7 DOWNTO 1);
cntr <= cntr - 1;
else
--cntr =< 0
end if;
end if;
end process;
s <= "000000000" WHEN rst='1' ELSE
('0'&p_reg(15 DOWNTO 8))+('0'&a_reg(7 DOWNTO 0)) WHEN p_reg(0)='1' ELSE
('0'&p_reg(15 DOWNTO 8));
END ARCHITECTURE v;De oplossing was de s buiten het process te halen.