2 Stimmen

Ich habe Probleme bei der Implementierung einer Verilog Test Fixture, um mein Design zu simulieren.

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.

2voto

toolic Punkte 51826

Der Simulator behandelt diese möglicherweise als Zeichenketten anstelle von Zahlen. Versuchen Sie, folgendes zu ändern:

num <= "00110011" ;
den <= "00010011" ;

zu:

num <= 8'b00110011;
den <= 8'b00010011;

1voto

Ich bin kein Experte für Verilog, aber es scheint, als ob du das Reset-Signal nicht vor dem Testen deines VHDL-Komponenten aktivierst.

Das würde dazu führen, dass "Count" sich in einem nicht initialisierten Zustand befindet, sodass, wenn du es benutzt, alles passieren könnte und die "XXXX" Ausgaben eine Reflexion davon sind.

Die Reset-Sequenz sollte wie folgt aussehen

En <= '0';
Clk <= '0';
Reset <= '1';
wait for 100 ns;
Reset <= '0';
wait for 100 ns;
-- hier beginnt das Testen

(in VHDL natürlich ... aber es lässt sich leicht auf Verilog übersetzen)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X