Как я могу повторно использовать SHARED VARIABLE в разных состояниях FSM в VHDL? - PullRequest
0 голосов

Я написал FSM на VHDL, и мне нужно, чтобы каждый процесс решал логические и арифметические выражения. Мне нужно, чтобы все было последовательно, и я хочу, чтобы вы снова использовали SHARED VARIABLE, чтобы получить результаты. Например:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.ALL;

ENTITY test1_arith IS
GENERIC (
    ap_bit_width : positive := 4;
    ap_latency : positive := 2
);
PORT (
    I1 : IN STD_LOGIC_VECTOR(ap_bit_width - 1 downto 0);
    I2 : IN STD_LOGIC_VECTOR(ap_bit_width - 1 downto 0);
    I3 : IN STD_LOGIC_VECTOR(ap_bit_width - 1 downto 0);
    O1 : OUT STD_LOGIC_VECTOR(ap_bit_width - 1 downto 0);
    ap_clk : IN STD_LOGIC;
    ap_rst : IN STD_LOGIC;
    ap_start : IN STD_LOGIC;
    ap_done : OUT STD_LOGIC;
    ap_idle : OUT STD_LOGIC;
    ap_ready : OUT STD_LOGIC
);
END;

ARCHITECTURE test1_arith_arch OF test1_arith IS
    ATTRIBUTE CORE_GENERATION_INFO : STRING;
    ATTRIBUTE CORE_GENERATION_INFO OF test1_arith_arch : ARCHITECTURE IS "Test,VHDLbyMOEA,{HLS_SYN_LAT=2}";
    CONSTANT ap_const_logic_1 : STD_LOGIC := '1';
    CONSTANT ap_const_logic_0 : STD_LOGIC := '0';
    TYPE state IS (state_1,state_2,state_3);
    SIGNAL state_present: state;
    SIGNAL state_future: state; 
    SIGNAL Flag: Integer:=0;
     --Signal RF : STD_LOGIC_VECTOR_array;
    FUNCTION ALU ( Op: IN integer range 0 TO 23;
     A, B: IN STD_LOGIC_VECTOR (ap_bit_width - 1 downto 0) )
    RETURN std_logic_vector is variable Result : std_logic_vector(ap_bit_width - 1 downto 0);        

    variable A_int: Integer:=0;
    variable B_int: Integer:=0;
    variable Result_int: Integer:=0;
    begin
    A_int := to_integer(unsigned(A));
    B_int := to_integer(unsigned(B));
    With Op Select Result_int:=
        to_integer(unsigned(NOT A)) When 0,
        to_integer(unsigned(A AND B)) When 1,
        to_integer(unsigned(A OR B)) When 2,
        to_integer(unsigned(A NAND B)) When 3,
        to_integer(unsigned(A NOR B)) When 4,
        to_integer(unsigned(A XOR B)) When 5,
        to_integer(unsigned(A XNOR B)) When 6,
        (A_int + B_int) When 7,
        (A_int - B_int) When 8,
        (A_int * B_int) When 9,
        (A_int / B_int) When 10,
        ABS(A_int) When 11,
        (A_int ** B_int) When 12,
        (A_int MOD B_int) When 13,
        to_integer(unsigned(A) & unsigned(B)) When 14,
        to_integer(unsigned(A) SLL B_int) When 15,
        to_integer(unsigned(A) SRL B_int) When 16,
        to_integer(unsigned(A) SLA B_int) When 17,
        to_integer(unsigned(A) SRA B_int) When 18,
        to_integer(unsigned(A) ROL B_int) When 19,
        to_integer(unsigned(A) ROR B_int) When 20,
        to_integer(unsigned(A) & unsigned(B)) When 21,
        to_integer(unsigned(A) & unsigned(B)) When 22,
                 0   When others;
    return STD_LOGIC_VECTOR (TO_UNSIGNED (Result_int, (ap_bit_width)));
    END FUNCTION;

    SHARED VARIABLE R1:std_logic_vector(ap_bit_width - 1 downto 0);    


    BEGIN

    OP_FSM : PROCESS (state_present)

     BEGIN 
    CASE state_present IS

    WHEN state_1=> 
    R1 := ALU(Op => 7 ,A => I1,B => I2);
    Flag<=1;
    IF (Flag=1) THEN
    state_future <= state_2;
    END IF;

    WHEN state_2=> 
    R1:= ALU(Op => 7 ,A => R1, B => I3);
    Flag<=2;
    IF (Flag=2) THEN
    state_future <= state_3;
    END IF;

    WHEN state_3=> 
    O1<= ALU(Op => 7 ,A => R1,B => "0001");
    Flag<=3;
    IF (Flag=3) THEN
    state_future <= state_1;
    END IF;
    END CASE;
    END PROCESS OP_FSM;

    CLK_FSM : PROCESS (ap_clk)
    BEGIN
    IF (ap_clk = '1' AND ap_clk'EVENT) THEN
    state_present <= state_future;
    END IF;
    END PROCESS CLK_FSM;

END test1_arith_arch;

В этом случае я хочу повторно использовать R1, и он хорошо работает в Simulation с Xilinx Vivado:

В симуляции работает: 1 + 4 + 0 + 1 = 6

Но мне нужно, чтобы FSM работал в симуляции и реализации с реальной ПЛИС. К сожалению, в Basys 3 FPGA Artix-7 я не получаю правильных результатов:

Несколько примеров: входы и выходы

На этом рисунке я показываю Случай 10 в ПЛИС, он должен получить 6 (1 + 4 + 0 + 1) в качестве результата, но вместо этого он получает 14: Корпус 10 в Basys 3 Artix-7 FPGA

Любая помощь будет очень благодарна. Большое спасибо.

...