Abang2 mbak2 mau nanya tentang error carakter Z pada "booth multiplier" VHDL

oke

New member
ane ada tugas kuliah tentang "booth multiplier" menggunakan VHDL. Software yang ane gunain ISE 10.1 dan modelsim III 6.3. Berikut listing program yang ane coba jalankan:


-- Booth Multiplier
-- This file contains all the entity-architectures for a complete
-- k-bit x k-bit Booth multiplier.
-- the design makes use of the new shift operators available in the VHDL-93 std
-- this design passes the Synplify synthesis check
-- download from: www.fpga.com.cn & www.pld.com.cn
----------------------------------------------------------------------
--top level design unit


library IEEE;
use IEEE.Std_logic_1164.all;

ENTITY booth_multiplier IS
    GENERIC(k : POSITIVE := 7); --input number word length less one
    PORT(multiplicand, multiplier : IN BIT_VECTOR(k DOWNTO 0);
        clock : IN BIT; product : INOUT BIT_VECTOR((2*k + 1) DOWNTO 0));
END booth_multiplier;

ARCHITECTURE structural OF booth_multiplier IS

SIGNAL mdreg, adderout, carries, augend, tcbuffout : BIT_VECTOR(k DOWNTO 0);
SIGNAL mrreg : BIT_VECTOR((k + 1) DOWNTO 0);
SIGNAL adder_ovfl : BIT;
SIGNAL comp ,clr_mr ,load_mr ,shift_mr ,clr_md ,load_md ,clr_pp ,load_pp ,shift_pp : BIT;
SIGNAL boostate : NATURAL RANGE 0 TO 2*(k + 1);

BEGIN

PROCESS --main clocked process containing all sequential elements
BEGIN
        WAIT UNTIL (clock'EVENT AND clock = '1');

        --register to hold multiplicand during multiplication
        IF clr_md = '1' THEN
                mdreg <= (OTHERS => '0');
        ELSIF load_md = '1' THEN
                mdreg <= multiplicand;
        ELSE
                mdreg <= mdreg;
        END IF;
               
        --register/shifter to product pair of bits used to control adder
        IF clr_mr = '1' THEN
                mrreg <= (OTHERS => '0');
        ELSIF load_mr = '1' THEN
                mrreg((k + 1) DOWNTO 1) <= multiplier;
                mrreg(0) <= '0';
        ELSIF shift_mr = '1' THEN
                mrreg <= mrreg SRL 1;
        ELSE
                mrreg <= mrreg;
        END IF;
               
        --register/shifter accumulates partial product values
        IF clr_pp = '1' THEN
                product <= (OTHERS => '0');
        ELSIF load_pp = '1' THEN
                product((2*k + 1) DOWNTO (k + 1)) <= adderout; --add to top half
                product(k DOWNTO 0) <= product(k DOWNTO 0);  --refresh bootm half
        ELSIF shift_pp = '1' THEN
                product <= product SRA 1; --shift right with sign extend
        ELSE
                product <= product;
        END IF;

END PROCESS;

--adder adds/subtracts partial product to multiplicand

augend <= product((2*k+1) DOWNTO (k+1));
addgen : FOR i IN adderout'RANGE
        GENERATE
                lsadder : IF i = 0 GENERATE
                        adderout(i) <= tcbuffout(i) XOR augend(i) XOR comp;
                        carries(i) <= (tcbuffout(i) AND augend(i)) OR
                                      (tcbuffout(i) AND comp) OR
                                      (comp AND augend(i));
                        END GENERATE;
                otheradder : IF i /= 0 GENERATE
                        adderout(i) <= tcbuffout(i) XOR augend(i) XOR carries(i-1);
                        carries(i) <= (tcbuffout(i) AND augend(i)) OR
                                      (tcbuffout(i) AND carries(i-1)) OR
                                      (carries(i-1) AND augend(i));
                        END GENERATE;
        END GENERATE;
        --twos comp overflow bit
        adder_ovfl <= carries(k-1) XOR carries(k);

--true/complement buffer to generate two's comp of mdreg

tcbuffout <= NOT mdreg WHEN (comp = '1') ELSE mdreg;

--booth multiplier state counter

PROCESS BEGIN 
        WAIT UNTIL (clock'EVENT AND clock = '1');
        IF boostate < 2*(k + 1) THEN boostate <= boostate + 1;
        ELSE boostate <= 0;
        END IF;
END PROCESS;

--assign control signal values based on state

PROCESS(boostate)
BEGIN
        --assign defaults, all registers refresh
        comp <= '0';
        clr_mr <= '0';
        load_mr <= '0';
        shift_mr <= '0';
        clr_md <= '0';
        load_md <= '0';
        clr_pp <= '0';
        load_pp <= '0';
        shift_pp <= '0';
        IF boostate = 0 THEN
                load_mr <= '1';
                load_md <= '1';
                clr_pp <= '1';
        ELSIF boostate MOD 2 = 0 THEN  --boostate = 2,4,6,8 ....
                shift_mr <= '1';
                shift_pp <= '1';
        ELSE    --boostate = 1,3,5,7......
                IF mrreg(0) = mrreg(1) THEN
                        NULL; --refresh pp
                ELSE
                        load_pp <= '1'; --update product       
                END IF;
                comp <= mrreg(1);      --subract if mrreg(1 DOWNTO 0) ="10"
        END IF;
END PROCESS;

END structural;

Pada saat ane tes sintesis di "MODUL VHDL" terdapat warning tapi sukses sintaxnya:
WARNING:Xst:819 - "D:/KULIAH/DATA_FPGA/10_des_2011/booth/booth.vhd" line 105: One or more signals are missing in the process sensitivity list. To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals are present in the sensitivity list. Please note that the result of the synthesis may differ from the initial design specification. The missing signals are:
WARNING:Xst:646 - Signal <adder_ovfl> is assigned but never used. This unconnected signal will be trimmed during the optimization process.

Pada saat disimulasikan dimodel sim :
# ** Error: boothwav.vhw(43): String literal has a character 'Z' not in the enumeration type std.standard.bit.
# ** Error: boothwav.vhw(95): VHDL Compiler exiting
# ** Error: C:/Modeltech_xe_starter/win32xoem/vcom failed.

Mohon bantuannya...
Klo repost maaf ya gan... ;D
 

Welcome to EDABoard.com

Sponsor

Back
Top