Ich bin ein Anfänger in VHDL und versuche, einen 8-Bit-Teiler mithilfe der Shift- und Subtract-Methode zu erstellen. Der Code für den Teiler ist in Ordnung, denke ich, aber ich habe Probleme bei der Simulation der Eingaben. Wenn ich das Verilog-Testfixture verwende, werden meine Eingaben, die (Dividend=51 [00110011b], Divisor=19 [00010011b]) sein sollten, immer zu (Dividend=49 [00110001b], Divisor=49 [00110001b])) in iSim, und dann die Ausgaben (Quotient und Rest = xxxxxxx (unbekannt)) anstelle von (Quotient=2[00000010b] und Rest=13 [00001101b]))... Wie ich bereits erwähnt habe, bin ich ein Anfänger in VHDL und habe seit fünf Stunden daran gearbeitet. Ich habe mein Bestes gegeben, um online nach einer Lösung zu suchen, aber ohne Erfolg.... daher würde ich jede Hilfe oder alternative Lösung sehr schätzen. Ich benutze Xilinx ISE 14.3 und iSim.
Hier ist der Code für den 8-Bit-Binärteiler.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use IEEE.STD_LOGIC_ARITH.all;
entity division is
generic(SIZE: INTEGER := 8);
port(reset: in STD_LOGIC; --reset
en: in STD_LOGIC; --enable
clk: in STD_LOGIC; --clock
num: in STD_LOGIC_VECTOR((SIZE - 1) downto 0); --dividend
den: in STD_LOGIC_VECTOR((SIZE - 1) downto 0); --divisor
res: out STD_LOGIC_VECTOR((SIZE - 1) downto 0); --result/quotient
rm: out STD_LOGIC_VECTOR((SIZE - 1) downto 0) --remainder
);
end division;
architecture behav of division is
signal bufreg: STD_LOGIC_VECTOR((2 * SIZE - 1) downto 0); --signal array to hold both accumulator and dividend registers as one i.e bufreg(18 bits)
signal dbuf: STD_LOGIC_VECTOR((SIZE - 1) downto 0); --signal array to hold the divisor
signal count: INTEGER range 0 to SIZE; --count to determine when to stop
alias ADreg is bufreg((2 * SIZE - 1) downto SIZE); --ADreg is is alias for top half of bufreg register(17th to 9th bit)
alias DVNDreg is bufreg((SIZE - 1) downto 0); --DVNDreg is is alias for bottom half of bufreg register(8th to 0th bit)
begin
--our process begins here
p_001: process(reset, en, clk)
begin
if reset = '1' then
res <= (others => '0');
rm <= (others => '0');
count <= 0;
elsif rising_edge(clk) then
if en = '1' then
case count is
when 0 =>
ADreg <= (others => '0');
DVNDreg <= num;
dbuf <= den;
res <= DVNDreg;
rm <= ADreg;
count <= count + 1;
when others =>
if bufreg((2 * SIZE - 2) downto (SIZE - 1)) >= dbuf then
ADreg <= '0' & (bufreg((2 * SIZE - 3) downto (SIZE - 1)) - dbuf((SIZE - 2) downto 0));
DVNDreg <= DVNDreg ((SIZE - 2) downto 0) & '1';
else
bufreg <= bufreg((2 * SIZE - 2) downto 0) & '0';
end if;
if count /= SIZE then
count <= count + 1;
else
count <= 0;
end if;
end case;
end if;
end if;
end process;
end behav;
Und hier ist der Code für das Verilog-Testfixture (.v-Datei):
module BINdivisionTEST;
// Inputs
reg reset;
reg en;
reg clk;
reg [7:0] num ;
reg [7:0] den ;
// Outputs
wire [7:0] res;
wire [7:0] rm;
// Instantiate the Unit Under Test (UUT)
division uut (
.reset(reset),
.en(en),
.clk(clk),
.num(num),
.den(den),
.res(res),
.rm(rm)
);
initial begin
// Initialize Inputs
reset = 0;
en = 0;
clk = 0;
//num = 0;
//den = 0;
// Wait 100 ns for global reset to finish
#100;
en = 1;
#100;
clk=1;
num <= "00110011" ;
den <= "00010011" ;
// Add stimulus here
end
endmodule
Meine größten Probleme scheinen die Initialisierung der Eingaben und wahrscheinlich einige falsche Zuweisungen, die falsche Verwendung der Testfixture-Datei und einige schlechte Kodierung zu sein. Ich sollte auch hinzufügen, dass der Teilercode in VHDL, ISE 14.3 kompiliert wurde. Es tut mir sehr leid, wenn dieses Problem bereits gelöst wurde und ich niemanden verärgern möchte, indem ich schlechten und amateurhaften Code hochlade. Falls dieses Problem bereits behandelt wurde, könnten Sie mir bitte einen Link zur Verfügung stellen. Nochmals vielen Dank für jede Hilfe.