Procedures help you group a set of instructions that you want to use many times. This keeps your code clean and easy to understand.
When you want to perform the same action multiple times in your design.
When you want to organize your code into smaller, manageable parts.
When you want to avoid repeating the same code in different places.
When you want to make your design easier to read and maintain.
Syntax
VHDL
procedure procedure_name (parameter_list) is
begin
-- statements
end procedure_name;
The procedure name should be unique within the architecture or package.
Parameters can be input, output, or both, depending on your needs.
Examples
A simple procedure with no parameters that prints a message.
VHDL
procedure display_message is
begin
report "Hello, VHDL!";
end display_message;
A procedure that takes two numbers as input and returns their sum.
VHDL
procedure add_numbers(a : in integer; b : in integer; result : out integer) is
begin
result := a + b;
end add_numbers;
Sample Program
This VHDL program defines a procedure print_sum that adds two integers and prints the result. The procedure is called inside a process.
VHDL
library ieee;
use ieee.std_logic_1164.all;
entity proc_example is
end proc_example;
architecture behavior of proc_example is
procedure print_sum(a : in integer; b : in integer) is
variable sum : integer;
begin
sum := a + b;
report "Sum is: " & integer'image(sum);
end procedure;
begin
process
begin
print_sum(5, 7);
wait;
end process;
end behavior;
OutputSuccess
Important Notes
Procedures do not return values like functions; they can modify output parameters or variables.
Use report statements inside procedures to display messages during simulation.
Summary
Procedures group repeated instructions to keep code clean.
They can have input and output parameters.
Use procedures to make your VHDL designs easier to read and maintain.
Practice
(1/5)
1. What is the main purpose of a procedure in VHDL?
easy
A. To group a set of instructions for reuse
B. To declare a new signal
C. To define a new entity
D. To assign values to constants
Solution
Step 1: Understand what a procedure does
A procedure groups instructions to perform a specific task that can be reused multiple times in the code.
Step 2: Compare with other options
Declaring signals, entities, or assigning constants are different VHDL tasks, not the main purpose of procedures.
Final Answer:
To group a set of instructions for reuse -> Option A
Quick Check:
Procedure = reusable instruction group [OK]
Hint: Procedures bundle instructions for reuse [OK]
Common Mistakes:
Confusing procedures with signal declarations
Thinking procedures define entities
Assuming procedures assign constants
2. Which of the following is the correct way to declare a procedure in VHDL?
easy
A. procedure my_proc() begin
-- code
end procedure;
B. procedure my_proc is
begin
-- code
end procedure;
C. procedure my_proc is
-- code
end;
D. procedure my_proc is
begin
-- code
end;
Solution
Step 1: Recall VHDL procedure syntax
A procedure declaration uses the syntax: procedure name is begin ... end procedure;.
Step 2: Check each option
procedure my_proc is
begin
-- code
end procedure; matches the correct syntax with is, begin, and end procedure;. Options B, C, and D have syntax errors or missing keywords.
Final Answer:
procedure my_proc is
begin
-- code
end procedure; -> Option B
Quick Check:
Procedure syntax = procedure my_proc is
begin
-- code
end procedure; [OK]
Hint: Procedure ends with 'end procedure;' [OK]
Common Mistakes:
Omitting 'procedure' keyword at the end
Using parentheses after procedure name
Ending with just 'end;' instead of 'end procedure;'
3. What will be the output of the following VHDL procedure call?
procedure add_one(signal x : inout integer) is
begin
x <= x + 1;
end procedure;
signal val : integer := 5;
begin
add_one(val);
-- What is val now?
end;
medium
A. 5
B. 7
C. 6
D. Error: procedure call syntax
Solution
Step 1: Understand procedure behavior
The procedure add_one takes a signal x as inout and increments it by 1.
Step 2: Apply procedure to signal val
Initially, val is 5. After calling add_one(val);, val becomes 5 + 1 = 6.
Final Answer:
6 -> Option C
Quick Check:
5 + 1 = 6 [OK]
Hint: Inout parameter changes value inside procedure [OK]
Common Mistakes:
Assuming input parameters cannot change
Confusing procedure call syntax
Forgetting procedure modifies signal
4. Identify the error in this procedure declaration:
procedure multiply_by_two(x : in integer; y : out integer) is
begin
y := x * 2;
end;
medium
A. Procedure must end with 'end procedure;' not just 'end;'
B. Procedure body cannot assign values to 'out' parameters
C. Parameters cannot have modes like 'in' or 'out'
D. Missing 'procedure' keyword before 'multiply_by_two'
Solution
Step 1: Check procedure ending syntax
In VHDL, a procedure must end with end procedure; not just end;.
Step 2: Verify other parts
The procedure keyword is present, parameter modes are allowed, and assigning to 'out' parameters is valid.
Final Answer:
Procedure must end with 'end procedure;' not just 'end;' -> Option A
Quick Check:
Procedure ends with 'end procedure;' [OK]
Hint: Procedure must end with 'end procedure;' [OK]
Common Mistakes:
Ending procedure with just 'end;'
Thinking parameter modes are not allowed
Confusing procedure and function endings
5. You want to create a procedure that swaps two integer signals a and b. Which of the following is the correct procedure declaration and usage?
hard
A. procedure swap(signal x, y : in integer) is
variable temp : integer;
begin
temp := x;
x := y;
y := temp;
end procedure;
-- Usage: swap(a, b);
B. procedure swap(signal x, y : out integer) is
variable temp : integer;
begin
temp := x;
x := y;
y := temp;
end procedure;
-- Usage: swap(a, b);
C. procedure swap(x, y : integer) is
variable temp : integer;
begin
temp := x;
x := y;
y := temp;
end procedure;
-- Usage: swap(a, b);
D. procedure swap(signal x, y : inout integer) is
variable temp : integer;
begin
temp := x;
x <= y;
y <= temp;
end procedure;
-- Usage: swap(a, b);
Solution
Step 1: Determine correct parameter modes for swapping
To swap values, both parameters must be inout or signal with mode allowing read and write. 'inout' is correct.
Step 2: Check procedure declaration and usage
procedure swap(signal x, y : inout integer) is
variable temp : integer;
begin
temp := x;
x <= y;
y <= temp;
end procedure;
-- Usage: swap(a, b); declares parameters as signal x, y : inout integer and uses a temporary variable to swap values correctly. Usage is correct.
Final Answer:
procedure swap(signal x, y : inout integer) is
variable temp : integer;
begin
temp := x;
x <= y;
y <= temp;
end procedure;
-- Usage: swap(a, b); -> Option D
Quick Check:
Swap needs inout parameters [OK]
Hint: Use 'inout' mode to modify both parameters [OK]
Common Mistakes:
Using 'in' mode which is read-only
Using 'out' mode which cannot read input
Omitting 'signal' keyword for signals
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.