0
0
VHDLprogramming~20 mins

ALU design in VHDL - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
ALU Design Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of a 4-bit ALU performing addition
Given the following VHDL snippet for a 4-bit ALU performing addition, what is the output when A = "0101" and B = "0011"?
VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity ALU is
    Port ( A : in STD_LOGIC_VECTOR(3 downto 0);
           B : in STD_LOGIC_VECTOR(3 downto 0);
           Result : out STD_LOGIC_VECTOR(3 downto 0);
           CarryOut : out STD_LOGIC);
end ALU;

architecture Behavioral of ALU is
begin
    process(A, B)
        variable sum : UNSIGNED(4 downto 0);
    begin
        sum := ('0' & unsigned(A)) + ('0' & unsigned(B));
        Result <= std_logic_vector(sum(3 downto 0));
        CarryOut <= sum(4);
    end process;
end Behavioral;
AResult = "1000", CarryOut = '0'
BResult = "1111", CarryOut = '0'
CResult = "1000", CarryOut = '1'
DResult = "0110", CarryOut = '0'
Attempts:
2 left
💡 Hint
Remember to consider the carry out bit when adding two 4-bit numbers.
Predict Output
intermediate
2:00remaining
Output of ALU performing bitwise AND
What is the output Result of the ALU performing bitwise AND on inputs A = "1100" and B = "1010"?
VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity ALU_AND is
    Port ( A : in STD_LOGIC_VECTOR(3 downto 0);
           B : in STD_LOGIC_VECTOR(3 downto 0);
           Result : out STD_LOGIC_VECTOR(3 downto 0));
end ALU_AND;

architecture Behavioral of ALU_AND is
begin
    Result <= A and B;
end Behavioral;
AResult = "1000"
BResult = "1110"
CResult = "0100"
DResult = "1010"
Attempts:
2 left
💡 Hint
Bitwise AND outputs 1 only if both bits are 1.
🔧 Debug
advanced
2:00remaining
Identify the error in ALU subtraction process
The following VHDL code is intended to perform subtraction (A - B) in a 4-bit ALU. What error will occur when compiling or running this code?
VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity ALU_Sub is
    Port ( A : in STD_LOGIC_VECTOR(3 downto 0);
           B : in STD_LOGIC_VECTOR(3 downto 0);
           Result : out STD_LOGIC_VECTOR(3 downto 0);
           BorrowOut : out STD_LOGIC);
end ALU_Sub;

architecture Behavioral of ALU_Sub is
begin
    process(A, B)
        variable diff : UNSIGNED(3 downto 0);
    begin
        diff := unsigned(A) - unsigned(B);
        Result <= std_logic_vector(diff);
        BorrowOut <= '0';
    end process;
end Behavioral;
ACompilation error due to unsigned subtraction possibly resulting in negative value
BRuntime error due to overflow in subtraction
CNo error, code runs correctly
DBorrowOut is always zero, so incorrect borrow detection
Attempts:
2 left
💡 Hint
Check how borrow is detected and reported in subtraction.
📝 Syntax
advanced
2:00remaining
Identify the syntax error in ALU operation selection
Which option contains the correct syntax for a VHDL case statement selecting ALU operations based on a 2-bit control signal ALU_Sel?
VHDL
process(ALU_Sel, A, B)
begin
    case ALU_Sel is
        when "00" => Result <= A + B;
        when "01" => Result <= A - B;
        when "10" => Result <= A and B;
        when "11" => Result <= A or B;
        when others => Result <= (others => '0');
    end case;
end process;
A
case ALU_Sel is
  when "00" =&gt; Result &lt;= A + B;
  when "01" =&gt; Result &lt;= A - B;
  when "10" =&gt; Result &lt;= A and B;
  when "11" =&gt; Result &lt;= A or B;
end case;
B
case ALU_Sel is
  when "00" =&gt; Result &lt;= A + B;
  when "01" =&gt; Result &lt;= A - B;
  when "10" =&gt; Result &lt;= A and B;
  when "11" =&gt; Result &lt;= A or B;
  when others =&gt; Result &lt;= (others =&gt; '0');
end case;
C
case ALU_Sel is
  when "00" =&gt; Result &lt;= A + B
  when "01" =&gt; Result &lt;= A - B;
  when "10" =&gt; Result &lt;= A and B;
  when "11" =&gt; Result &lt;= A or B;
  when others =&gt; Result &lt;= (others =&gt; '0');
end case;
D
case ALU_Sel is
  when 0 =&gt; Result &lt;= A + B;
  when 1 =&gt; Result &lt;= A - B;
  when 2 =&gt; Result &lt;= A and B;
  when 3 =&gt; Result &lt;= A or B;
  when others =&gt; Result &lt;= (others =&gt; '0');
end case;
Attempts:
2 left
💡 Hint
Check for missing semicolons and correct use of when others.
🚀 Application
expert
3:00remaining
Determine the output of a combined ALU operation with overflow detection
Consider a 4-bit ALU that performs addition or subtraction based on a control signal Op (0 for addition, 1 for subtraction). The ALU outputs Result (4 bits), CarryOut, and Overflow signals. Given inputs A = "0111" (7), B = "1001" (9), and Op = 1 (subtraction), what are the values of Result, CarryOut, and Overflow?
VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity ALU_Adv is
    Port ( A : in STD_LOGIC_VECTOR(3 downto 0);
           B : in STD_LOGIC_VECTOR(3 downto 0);
           Op : in STD_LOGIC; -- 0: add, 1: subtract
           Result : out STD_LOGIC_VECTOR(3 downto 0);
           CarryOut : out STD_LOGIC;
           Overflow : out STD_LOGIC);
end ALU_Adv;

architecture Behavioral of ALU_Adv is
    signal A_unsigned, B_unsigned, B_inverted : UNSIGNED(3 downto 0);
    signal sum : UNSIGNED(4 downto 0);
begin
    A_unsigned <= unsigned(A);
    B_inverted <= (others => '0');
    process(A_unsigned, B_unsigned, Op)
    begin
        B_unsigned <= unsigned(B);
        if Op = '1' then
            B_inverted <= not B_unsigned;
            sum <= ('0' & A_unsigned) + ('0' & B_inverted) + 1;
        else
            sum <= ('0' & A_unsigned) + ('0' & B_unsigned);
        end if;
        Result <= std_logic_vector(sum(3 downto 0));
        CarryOut <= sum(4);
        Overflow <= (A_unsigned(3) xor B_inverted(3)) and (A_unsigned(3) xor sum(3));
    end process;
end Behavioral;
AResult = "1110", CarryOut = '1', Overflow = '0'
BResult = "1110", CarryOut = '0', Overflow = '0'
CResult = "1110", CarryOut = '0', Overflow = '1'
DResult = "1000", CarryOut = '1', Overflow = '1'
Attempts:
2 left
💡 Hint
Check two's complement subtraction and overflow conditions carefully.