Реализация 8-битного двунаправленного сдвигового регистра в VHDL - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь реализовать 8-разрядный двунаправленный регистр сдвига в VHDl, но он не работает должным образом, потому что, когда я моделирую свой проект с помощью testbench, я получаю incorrect waveform

Я борюсь с ВКЛЮЧЕНИЕМ каждого триггера, который должен быть подключен к выходу E <= ((НЕ B) И (НЕ C)) ИЛИ (C И (НЕ D)) ИЛИ (А, Б, В).</p>

В чем может быть проблема?Нет ошибок, проблема только в странной форме волны, которую я получаю.

Я могу использовать только логические элементы для программирования регистра сдвига.

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL;
        USE IEEE.STD_LOGIC_ARITH.ALL;
        USE IEEE.STD_LOGIC_UNSIGNED.ALL;

        entity ShiftRegister8Bit is 
        Port   (A : in STD_LOGIC;
                B : in STD_LOGIC;
                C : in STD_LOGIC;
                D : in STD_LOGIC;
                E : in STD_LOGIC_VECTOR(7 downto 0);
                INPUT: in STD_LOGIC_VECTOR(7 downto 0);
                CLK: in STD_LOGIC;
                RESET: in STD_LOGIC;
                EN: in STD_LOGIC;
                MODE: in STD_LOGIC;
                Q: inout STD_LOGIC_VECTOR (7 downto 0));
        end ShiftRegister8Bit;


        architecture Behavioral of ShiftRegister8Bit is

        component Mux21 is 
            Port(Q0: in STD_LOGIC;
                 Q1: in STD_LOGIC;
                 S: out STD_LOGIC;
                 MODE: in STD_LOGIC);
        end component;

        component OneBitReg is 
           Port ( RESET : in STD_LOGIC;
               Q : out STD_LOGIC; 
               D : in STD_LOGIC;
               EN : in STD_LOGIC;
               CLK: in STD_LOGIC);
        end component;

        component F3 is 
            Port(A: in STD_LOGIC;
                B: in STD_LOGIC;
                C: in STD_LOGIC;
                D: in STD_LOGIC;
                E: out STD_LOGIC);
        end component;

        signal muxout: STD_LOGIC_VECTOR(7 downto 0);
        signal regout: STD_LOGIC_VECTOR(7 downto 0);
        signal count: STD_LOGIC_VECTOR(7 downto 0); -- slowed down clock

        begin

            process(CLK)
            begin
                if(RESET='0') then 
                    count <= (others => '0');
               elsif(CLK'event and CLK='1') then
                    count <= count + '1';
               end if;
            end process;
            Q <= count;


        mux0: Mux21 Port map(Q0 => input(0),Q1 => regout(0),S => muxout(0),MODE => MODE);

         mux1: Mux21 Port map(Q0 => input(1),Q1 => regout(1),S => muxout(1),MODE => MODE);  

         mux2: Mux21 Port map(Q0 => input(2),Q1 => regout(2),S => muxout(2),MODE => MODE);  

         mux3: Mux21 Port map(Q0 => input(3),Q1 => regout(3),S => muxout(3),MODE => MODE);  

         mux4: Mux21 Port map(Q0 => input(4),Q1 => regout(4),S => muxout(4),MODE => MODE);                                                                 

         mux5: Mux21 Port map(Q0 => input(5),Q1 => regout(5),S => muxout(5),MODE => MODE);                                                                 

         mux6: Mux21 Port map(Q0 => input(6),Q1 => regout(6),S => muxout(6),MODE => MODE);                                                                 

         mux7: Mux21 Port map(Q0 => input(7),Q1 => regout(7),S => muxout(7),MODE => MODE);                                                                 


        reg0: OneBitReg Port map(D =>muxout(0),Q => regout(0),  CLK => CLK,RESET => RESET,EN => E(0));   

        reg1: OneBitReg Port map(D =>muxout(1),Q => regout(1),  CLK => CLK,RESET => RESET,EN => E(1)); 

        reg2: OneBitReg Port map(D =>muxout(2),Q => regout(2),  CLK => CLK,RESET => RESET,EN => E(2));           

        reg3: OneBitReg Port map(D =>muxout(3),Q => regout(3),  CLK => CLK,RESET => RESET,EN => E(3));           

        reg4: OneBitReg Port map(D =>muxout(4),Q => regout(4),  CLK => CLK,RESET => RESET,EN => E(4));           

        reg5: OneBitReg Port map(D =>muxout(5),Q => regout(5),  CLK => CLK,RESET => RESET,EN => E(5));           

        reg6: OneBitReg Port map(D =>muxout(6),Q => regout(6),  CLK => CLK,RESET => RESET,EN => E(6));           

        reg7: OneBitReg Port map(D =>muxout(7),Q => regout(7),  CLK => CLK,RESET => RESET,EN => E(7));           


        Q <=regout;

        end Behavioral;

OneBitReg

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity OneBitReg is
    Port ( RESET : in STD_LOGIC;
           Q : out STD_LOGIC; 
           D : in STD_LOGIC;
           EN : in STD_LOGIC;
           CLK: in STD_LOGIC);
end OneBitReg;

architecture Behavioral of OneBitReg is

begin
    process(RESET,CLK)
     begin
         if(RESET='1') then
             Q <= '0';
         Elsif(CLK'event and CLK='1') then
             if(EN='1')then
                 Q <=D;
             End if;
         End if;
     End process;

end Behavioral;

Mux21

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Mux21 is
    Port(Q0 : in STD_LOGIC;
         Q1: in STD_LOGIC;
         S: out STD_LOGIC;
         MODE: in STD_LOGIC);
end Mux21;

architecture Behavioral of Mux21 is

begin
S <= ((NOT MODE) AND Q0) OR (MODE AND Q1);
end Behavioral;

F3

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity F3 is
    Port ( A : in STD_LOGIC;
           B : in STD_LOGIC;
           C : in STD_LOGIC;
           D : in STD_LOGIC;
           E: out STD_LOGIC);
end F3;

architecture Behavioral of F3 is

begin
E <=  ((NOT B) AND (NOT C)) OR (C AND (NOT D)) OR (A AND B AND C);
end Behavioral;

Testbench

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL;
        USE IEEE.STD_LOGIC_ARITH.ALL;
        USE IEEE.STD_LOGIC_UNSIGNED.ALL;

        entity ShiftRegister8Bit_tb is
        end;

        architecture bench of ShiftRegister8Bit_tb is 

        component ShiftRegister8Bit is
        Port   (A : in STD_LOGIC;
                B : in STD_LOGIC;
                C : in STD_LOGIC;
                D : in STD_LOGIC;
                E : in STD_LOGIC_VECTOR(7 downto 0);
                INPUT: in STD_LOGIC_VECTOR(7 downto 0);
                CLK: in STD_LOGIC;
                RESET: in STD_LOGIC;
                EN: in STD_LOGIC;
                MODE: in STD_LOGIC;
                Q: inout STD_LOGIC_VECTOR (7 downto 0));
        end component; 

           -- Inputs      
           signal A: STD_LOGIC;
           signal B: STD_LOGIC;
           signal C: STD_LOGIC;
           signal D: STD_LOGIC;
           signal INPUT: STD_LOGIC_VECTOR(7 downto 0); 
           signal E: STD_LOGIC_VECTOR(7 downto 0);   
           signal CLK: STD_LOGIC;
           signal RESET: STD_LOGIC;
           signal EN: STD_LOGIC;
           signal MODE: STD_LOGIC;
               --Outputs  
           signal Q : std_logic_vector(7 downto 0);  

        Begin
        uut: ShiftRegister8Bit port map(  
              A => A,
              B => B,
              C => C,
              D => D,
              CLK => CLK,
              INPUT => INPUT,
              RESET => RESET,
              MODE => MODE,
              EN => EN,
              E => E,
              Q => Q );  

         CLK_process :process
                   begin
                   CLK <= '0';
                   wait for 5 ns;
                   CLK <= '1';
                   wait for 5 ns;
              end process;

        -- Stimulus process
         stim_proc: process
         -- SET THE CLOCK PERIOD:  
        begin
             RESET <= '0';
             EN <= '1';
             MODE <= '0';
             A <= '0';
             B <= '0';
             C <= '0';
             D <= '1';
             wait for 50 ns;
             A <= '0';
             B <= '0';
             C <= '1';
             D <= '1';
             wait for 50 ns;
             A <= '0';
             B <= '1';
             C <= '1';
             D <= '1';
             wait for 50 ns;
             A <= '1';
             B <= '1';
             C <= '1';
             D <= '1';
             wait for 50 ns;
             MODE <= '1';
                  A <= '0';
             B <= '0';
             C <= '0';
             D <= '1';
             wait for 50 ns;
             A <= '0';
             B <= '0';
             C <= '1';
             D <= '1';
             wait for 50 ns;
             A <= '0';
             B <= '1';
             C <= '1';
             D <= '1';
             wait for 50 ns;
             A <= '1';
             B <= '1';
             C <= '1';
             D <= '1';
             wait for 50 ns;
             RESET <= '1';
             EN <= '0';
             wait for 50 ns;
         wait;
         end process;
         END;  
...