2

我是 vhdl 的初学者,我正在尝试使用移位和减法方法制作一个 8 位除法器。我猜,除法器的代码没问题,但我在模拟输入时遇到了问题。当我使用 Verilog 测试夹具时,我的输入应该是 (dividend=51 [00110011b], divisor=19 [00010011b]) 在 iSim 中总是变成 (dividend=49 [00110001b], divisor=49 [00110001b])) ,然后输出(商和余数 = xxxxxxx(未知))而不是(商 = 2 [00000010b] 和余数 = 13 [00001101b])...正如我之前提到的,我是 vhdl 的初学者,我'已经在这里待了五个小时,我已经尽力在网上搜索解决方案,但失败了......所以任何帮助或替代解决方案将不胜感激。我正在使用 Xilinx ISE 14.3 和 iSim。

这是 8 位二进制除法器的代码。

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;

这是 Verilog 测试夹具(.v 文件)的代码:

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

我最大的问题似乎是输入的初始化,可能还有一些错误的分配,测试夹具文件的误用和一些错误的编码。我还应该补充一点,分隔符代码是在 vhdl、ISE 14.3 中编译的。如果之前已经回答过这个问题,我感到非常抱歉,我并不是要通过上传糟糕的业余代码来惹恼任何人。如果之前已经解决过此类问题,请给我一个链接。再次,非常感谢任何帮助。

4

2 回答 2

2

模拟器可能会将它们视为字符串而不是数字。尝试改变:

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

至:

num <= 8'b00110011;
den <= 8'b00010011;
于 2013-11-09T03:44:31.053 回答
1

我不是 Verilog 方面的专家,但看起来您可能没有在测试之前对您的 VHDL 组件断言重置。

这将导致“计数”处于未初始化状态,因此当您使用它时,任何事情都可能发生,“XXXX”输出反映了这一点。

重置序列应如下所示

En <= '0';
Clk <= '0';
Reset <= '1';
wait for 100 ns;
Reset <= '0';
wait for 100 ns;
-- start testing here

(当然是在 VHDL 中......但它会很容易地转换为 Verilog)

于 2013-11-09T10:45:30.343 回答