Channel Directions in VHDL
When using signals as procedure parameters, you can specify if a signal is meant to only send or receive values. This specificity increases the type-safety of the program.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_TEXTIO.ALL;
use STD.TEXTIO.ALL;
entity ChannelDirections is
end ChannelDirections;
architecture Behavioral of ChannelDirections is
signal pings : std_logic_vector(7 downto 0);
signal pongs : std_logic_vector(7 downto 0);
procedure ping (signal pings : out std_logic_vector(7 downto 0);
constant msg : in string) is
begin
for i in 1 to msg'length loop
pings <= std_logic_vector(to_unsigned(character'pos(msg(i)), 8));
wait for 10 ns;
end loop;
end procedure;
procedure pong (signal pings : in std_logic_vector(7 downto 0);
signal pongs : out std_logic_vector(7 downto 0)) is
begin
pongs <= pings;
wait for 10 ns;
end procedure;
begin
process
variable l : line;
begin
ping(pings, "passed message");
pong(pings, pongs);
write(l, character'val(to_integer(unsigned(pongs))));
writeline(output, l);
wait;
end process;
end Behavioral;This ping procedure only accepts a signal for sending values. It would be a compile-time error to try to read from this signal within the procedure.
The pong procedure accepts one signal for receives (pings) and a second for sends (pongs).
In the main process, we create two signals pings and pongs. We then call the ping procedure with the pings signal and a message. After that, we call the pong procedure with both signals. Finally, we print the received message.
To run this VHDL code, you would typically use a VHDL simulator such as ModelSim or GHDL. The exact commands may vary depending on your simulation environment, but it might look something like this:
$ ghdl -a channel_directions.vhd
$ ghdl -e channel_directions
$ ghdl -r channel_directions
passed messageThis example demonstrates how VHDL can use signal directions to enforce type safety in signal communication between procedures, similar to channel directions in other languages.
Comments powered by Disqus