Sr. No.
|
Name of the Pin
|
Direction
|
Width
|
Description
|
1
|
addr
|
Input
|
4
|
Input address
i.e. address bus
|
2
|
oe
|
input
|
1
|
output enable
|
3
|
wr_l
|
Input
|
1
|
If 0 write in to memory & if 1 read from memory
|
4
|
data
|
Input/Output
|
9
|
Output read/write from/to memory
i.e. bidirectional data bus MSB is parity bit
|
library IEEE;
use IEEE.std_logic_1164.all;
entity memory is
port (data : inout std_logic_vector (8 downto 0); -- databus
addr : in std_logic_vector (3 downto 0); -- address bus
oe, wr_l, clk : in std_logic); -- control signals
end entity;
architecture arch of memory is
----------------------------------------
-- Instantiation of D flipflop component
----------------------------------------
component d_ff is
port (d_in , en , clk : in std_logic;
q : out std_logic);
end component;
-------------------------------------
-- Instantiation of Decoder component
-------------------------------------
component decoder_4x16 is
port (
i : in std_logic_vector (3 downto 0); -- input ports
o : out std_logic_vector (15 downto 0)); -- output ports
end component;
-----------------------------------
-- Instantiation of Tristate buffer
-----------------------------------
component tri_state is
port (
en : in std_logic;
d_in : in std_logic_vector (8 downto 0);
d_out : out std_logic_vector (8 downto 0));
end component;
-------------------------------
-- function to calculate parity
-------------------------------
function parity_gen_func (par : in std_logic_vector (7 downto 0)) return std_logic is
begin
return par(0)xor par(1)xor par(2)xor par(3)xor par(4)xor par(5)xor par(6)xor par(7);
end parity_gen_func;
type temp is array ( 15 downto 0) of std_logic_vector (8 downto 0);
signal row : std_logic_vector (15 downto 0); -- temporary row address container
signal d_ff_out : temp; -- temporary data
signal en_tri_state : std_logic_vector (15 downto 0); --enable signal for
--tristate buffer
begin -- arch
--------------------------
-- Memory address decoding
--------------------------
dec: decoder_4x16 port map (i => addr,
o => row);
-----------------------------------------------
--Selecting flipflop for row and column address
-----------------------------------------------
generate_dff_coloumn: for i in 7 downto 0 generate
generate_dff_row: For j in 15 downto 0 generate
dff: d_ff port map (
d_in => data(i),
en => row(j),
clk => clk,
q => d_ff_out(j)(i));
end generate generate_dff_row;
end generate generate_dff_coloumn;
generate_row_8 : for i in 15 downto 0 generate
assert data(8)=parity_gen_func(data(7 downto 0)) report "parity error" severity error;
dff1 : d_ff port map (
d_in => data(8),
en => row(i),
clk => clk,
q => d_ff_out(i)(8));
end generate generate_row_8;
--------------------------------------------------------
--Tristate buffer for input/output operation for data bus
--------------------------------------------------------
generate_tri_state: for i in 15 downto 0 generate
tri_state_buffer: tri_state port map (
en => en_tri_state(i),
d_in => d_ff_out(i),
d_out => data);
end generate generate_tri_state;
-----------------------------------
--Enable signal for tristate buffer
-----------------------------------
process(row,wr_l,oe)
begin
for i in 15 downto 0 loop
en_tri_state(i) <= ((oe and wr_l) and (row(i)));
end loop;
end process;
end arch ;
D_ff Code
library IEEE;
use IEEE.std_logic_1164.all;
entity d_ff is
port (d_in , en , clk : in std_logic;
q : out std_logic);
end entity;
architecture arch of d_ff is
begin
process(clk,en,d_in)
begin
if (en='1') then
if (clk'event and clk='1') then
q <= d_in;
end if;
end if;
end process;
end arch;
Decoder_4x16 Code
library ieee;
use ieee.std_logic_1164.all;
entity decoder_4x16 is
port (
i : in std_logic_vector (3 downto 0); -- input ports
o : out std_logic_vector (15 downto 0)); -- output ports
end decoder_4x16;
architecture arch of decoder_4x16 is
begin -- deoder_concr_arch
with i select
o <=
"0000000000000001" when "0000",
"0000000000000010" when "0001",
"0000000000000100" when "0010",
"0000000000001000" when "0011",
"0000000000010000" when "0100",
"0000000000100000" when "0101",
"0000000001000000" when "0110",
"0000000010000000" when "0111",
"0000000100000000" when "1000",
"0000001000000000" when "1001",
"0000010000000000" when "1010",
"0000100000000000" when "1011",
"0001000000000000" when "1100",
"0010000000000000" when "1101",
"0100000000000000" when "1110",
"1000000000000000" when "1111",
"XXXXXXXXXXXXXXXX" when others;
end arch;
Tri-state Code
library IEEE;
use IEEE.std_logic_1164.all;
entity tri_state is
port (
en : in std_logic;
d_in : in std_logic_vector (8 downto 0);
d_out : out std_logic_vector (8 downto 0));
end tri_state;
architecture arch of tri_state is
begin -- arch
with en select
d_out <=
d_in when '1',
"ZZZZZZZZZ" when '0',
"XXXXXXXXX" when others;
end arch;
No comments:
Post a Comment