Modesim VHDL testbench - testing

I have a problem: I've tried to simulate my project by the testbench, but ModelSim wrote this message:
Error: C:/.../testbench.vhd(62): (vcom-1136) Unknown identifier "arst".
And the same message for each other ports of testbench's component.
Also, next one type of messages, for internal signals of testbench:
Error: C:/.../testbench.vhd(63): (vcom-1484) Unknown formal identifier ARST_STIM
Top-entity top_test and each other entities in one common folder with testbench, so I do not understand what is a reason of the problem. I've posted the code of my testbench below:
-- Created:
-- by - Desmond.UNKNOWN (DESMOND-PC)
-- at - 00:52:37 07.03.2016
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY testbench IS
END testbench;
ARCHITECTURE rtl OF testbench IS
-- Architecture declarations
-- Internal signal declarations
-- Component declarations
COMPONENT top_test
PORT (
arst : IN std_logic;
bithigh : IN std_logic_vector(31 DOWNTO 0);
bitlow : IN std_logic_vector(31 DOWNTO 0);
ca_bh10 : OUT std_logic;
ch_ca_data : IN std_logic_vector(31 DOWNTO 0);
ch_s : IN std_logic_vector(31 DOWNTO 0);
clk120MHz : IN std_logic;
clk240Mhz : IN std_logic;
clock_value_high : IN std_logic_vector(31 DOWNTO 0);
clock_value_low : IN std_logic_vector(31 DOWNTO 0);
dac_1 : OUT std_logic_vector(15 downto 0);
dac_2 : OUT std_logic_vector(15 downto 0);
freq_setup : IN std_logic_vector(31 DOWNTO 0);
led : OUT std_logic;
level : IN std_logic_vector(31 DOWNTO 0);
out_symb : OUT std_logic;
pps : IN std_logic
);
END COMPONENT;
--------------------------------------
signal LED,CA_OUT,MOD_OUT : std_logic;
signal ARST_STIM,CLK_120MHZ,CLK_240MHZ,PPS_STIM : std_logic := '0';
signal BIT_HIGH_STIM,BIT_LOW_STIM,LEVEL_STIM,CA_DATA_STIM,FREQ_STIM,CLK_LOW_STIM,CLK_HIGH_STIM,CH_SELECT_STIM : std_logic_vector (31 downto 0);
signal DAC_1, DAC_2 : std_logic_vector (15 downto 0);
--------------------------------------
constant CLK_120MHZ_PERIOD : TIME := 8.33 ns;
constant CLK_240MHZ_PERIOD : TIME := 4.15 ns;
-------------------------------------
BEGIN
U_0 : top_test
PORT MAP (
ARST_STIM => arst,
CLK_120MHZ => clk120MHz ,
CLK_240MHZ => clk240Mhz,
PPS_STIM => pps,
BIT_HIGH_STIM => bithigh ,
BIT_LOW_STIM => bitlow,
LEVEL_STIM => level,
CA_DATA_STIM => ch_ca_data,
FREQ_STIM => freq_setup,
CLK_LOW_STIM => clock_value_low,
CLK_HIGH_STIM => clock_value_high,
CH_SELECT_STIM => ch_s,
DAC_1 => dac_1,
DAC_2 => dac_2,
CA_OUT => ca_bh10,
LED => led,
MOD_OUT => out_symb
);
--------------------------
CLK_GENERATION : process
begin
CLK_120MHZ <= not CLK_120MHZ after (CLK_120MHZ_PERIOD/2);
CLK_240MHZ <= not CLK_240MHZ after (CLK_240MHZ_PERIOD/2);
end process CLK_GENERATION;
----------------------------
STIM_PROC : process
begin
ARST_STIM <= '1';
PPS_STIM <= '0';
wait for 100 ns;
CH_SELECT_STIM <= (others=>'0');
CLK_LOW_STIM <= "00010111010110001110001000011001";
CLK_HIGH_STIM <= "00000000000000000000000000000001";
FREQ_STIM <= "00000010001000100010001000100010";
LEVEL_STIM <= "00000000000000000000000000110010";
CA_DATA_STIM <= "00000000000000000000000000000110";
BIT_LOW_STIM <= "00100110100101111011000000000000";
BIT_HIGH_STIM <= "10101010010010111110100001010101";
wait for 1800 ns;
PPS_STIM <= '1';
wait for 100 ns;
PPS_STIM <= '0';
wait for 1000 ns;
CH_SELECT_STIM <= "00000000000000000000000000000001";
wait for 999999000 ns;
PPS_STIM <= '1';
wait for 100 ns;
PPS_STIM <= '0';
wait for 10000000 ns;
end process STIM_PROC;
END rtl;

Related

Q : Serializer/Deserializer problems

I want to implement a Serializer/Deserializer (SerDes) in VHDL. Actually, it is more like a simple Shift register. The shift register store a value and shifts to convert information from parallel to serial.The output of the register is 16 bits. It has an 16-bit Parallel input, which allows us to load the register with a new value. The load input allows to load a new value when a falling edge of the clock arrives.
Moreover, I also made a testBench with two SerDes component connected together to implement a sort of loop/ring. Unfortunately, I don't know why when I send a data with the value "1234" from the parallel input I receive "3412" in my parallel output : waveform testBench.
Below my code :
SerDes.vhd :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity SerDes is
generic (
Dbits : integer := 16
);
Port (
serial_clk : in STD_LOGIC;
clk : in STD_LOGIC;
rstn : in STD_LOGIC;
load : in STD_LOGIC;
enable : in STD_LOGIC;
serial_in : in STD_LOGIC;
parallel_in : in STD_LOGIC_VECTOR(Dbits-1 downto 0);
dout : out STD_LOGIC;
parallel_out : out STD_LOGIC_VECTOR(Dbits-1 downto 0)
);
end SerDes;
architecture Behavioral of SerDes is
signal rx_counter : integer := 0 ;
signal shift_reg : STD_LOGIC_VECTOR(Dbits-1 downto 0);
type TYPE_STATE is (Idle,ShiftIn);
signal CURRENT_STATE : TYPE_STATE := Idle;
signal serial_clock_D : STD_LOGIC := '0';
begin
serialization : process(serial_clk,rstn) --Envoyer une donnée parallèle et la récupérer sur la sortie série
begin
if (rstn = '0') then
shift_reg <= (others => '0');
rx_counter <= 0;
serial_clock_D <= '0';
CURRENT_STATE <= Idle;
elsif (clk = '1' and clk'event) then
case CURRENT_STATE is
when Idle =>
if (enable = '1') then
CURRENT_STATE <= ShiftIn;
else
CURRENT_STATE <= Idle;
end if;
if (load = '1') then
shift_reg <= parallel_in;
end if;
parallel_out <= shift_reg;
rx_counter <= 0;
when ShiftIn =>
if(serial_clk = '1' and serial_clock_D = '0') then
shift_reg <= shift_reg(14 downto 0) & serial_in;
end if;
if (rx_counter = Dbits-1) then
CURRENT_STATE <= Idle;
else
rx_counter <= rx_counter + 1;
end if;
end case;
end if;
end process;
dout <= shift_reg(15);
end Behavioral;
SERDESTestbench.vhd :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity SERDES_Testbench is
-- Port ( );
end SERDES_Testbench;
architecture Behavioral of SERDES_Testbench is
constant Dbits : integer := 16;
component SerDes is
generic (
Dbits : integer := 16
);
Port (
serial_clk : in STD_LOGIC;
clk : in STD_LOGIC;
rstn : in STD_LOGIC;
load : in STD_LOGIC;
enable : in STD_LOGIC;
serial_in : in STD_LOGIC;
parallel_in : in STD_LOGIC_VECTOR(Dbits-1 downto 0);
dout : out STD_LOGIC;
parallel_out : out STD_LOGIC_VECTOR(Dbits-1 downto 0)
);
end component;
signal serial_clk : STD_LOGIC := '0';
signal clk : STD_LOGIC := '0';
signal rstn : STD_LOGIC;
signal load : STD_LOGIC := '1';
signal enable : STD_LOGIC := '0';
signal serial_in : STD_LOGIC;
signal parallel_in : STD_LOGIC_VECTOR(Dbits-1 downto 0) := (others => '0');
signal dout : STD_LOGIC;
signal parallel_out : STD_LOGIC_VECTOR(Dbits-1 downto 0);
signal dout2 : STD_LOGIC;
signal parallel_out2 : STD_LOGIC_VECTOR(Dbits-1 downto 0);
signal end_of_simu : STD_LOGIC := '0';
begin
SR1 : SerDes
generic map(
Dbits => Dbits
)
Port map(
serial_clk => serial_clk,
clk => clk,
rstn => rstn,
load => load,
enable => enable,
serial_in => dout2,
parallel_in => parallel_in,
dout => dout,
parallel_out => parallel_out
);
SR2 : SerDes
generic map(
Dbits => Dbits
)
Port map(
serial_clk => serial_clk,
clk => clk,
rstn => rstn,
load => load,
enable => enable,
serial_in => dout,
parallel_in => parallel_in,
dout => dout2,
parallel_out => parallel_out2
);
stimulus : process
begin
rstn <= '0';
wait for 100 ns;
rstn <= '1';
wait for 100 ns;
parallel_in <= X"1234";
enable <= '1';
wait;
end process;
clocking : process
begin
IF end_of_simu /= '1' THEN
clk <= not clk;
wait for 5 ns;
ELSE
assert false report "end of test" severity note;
WAIT;
END IF;
end process;
sclk_gen : process
begin
IF end_of_simu /= '1' THEN
serial_clk <= not serial_clk;
wait for 100 ns;
ELSE
assert false report "end of test" severity note;
WAIT;
END IF;
end process;
end Behavioral;

Entity does not match component port

I have a vhdl code written for a shifter made with d-flip flops and multiplexers which runs and checks with successful syntax. However, now that i'm working on the testbench i'm running into some errors.
The VHDL Code is:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX41 IS
PORT (i3, i2, i1, i0 : IN BIT;
s: IN BIT_VECTOR(1 DOWNTO 0);
o: OUT BIT);
END MUX41;
ARCHITECTURE arch_mux41 OF MUX41 IS
BEGIN
PROCESS(i3, i2, i1, i0, s)
BEGIN
CASE s IS
WHEN "00" => o <= i0;
WHEN "01" => o <= i1;
WHEN "10" => o <= i2;
WHEN "11" => o <= i3;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END arch_mux41;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DFF IS
PORT(d, clk : IN BIT;
q, qb : OUT BIT);
END DFF;
ARCHITECTURE arch_dff OF DFF IS
BEGIN
PROCESS(clk)
VARIABLE q_temp : BIT;
BEGIN
IF(clk'EVENT AND clk='1')THEN
q_temp := d;
END IF;
q <= q_temp;
qb <= NOT q_temp;
END PROCESS;
END arch_dff;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY UShift IS
PORT(clk, il, ir : IN BIT;
s: IN BIT_VECTOR(1 DOWNTO 0);
i : IN BIT_VECTOR(3 DOWNTO 0);
q : OUT BIT_VECTOR(3 DOWNTO 0));
END UShift;
ARCHITECTURE struct OF UShift IS
COMPONENT MUX41
PORT (i3, i2, i1, i0 : IN BIT;
s: IN BIT_VECTOR(1 DOWNTO 0);
o: OUT BIT);
END COMPONENT;
COMPONENT DFF
PORT(d, clk : IN BIT;
q, qb : OUT BIT);
END COMPONENT;
FOR U1, U2, U3, U4: MUX41 USE ENTITY WORK.MUX41(arch_mux41);
FOR U5, U6, U7, U8: DFF USE ENTITY WORK.DFF(arch_dff);
SIGNAL o: BIT_VECTOR(3 DOWNTO 0);
SIGNAL qb: BIT_VECTOR(3 DOWNTO 0);
SIGNAL qt:BIT_VECTOR(3 DOWNTO 0);
BEGIN
U1:MUX41 PORT MAP(il,qt(2), i(3), qt(3), s, o(3));
U2:MUX41 PORT MAP(qt(3), qt(1), i(2), qt(2), s, o(2));
U3:MUX41 PORT MAP(qt(2), qt(0), i(1), qt(1), s, o(1));
U4:MUX41 PORT MAP(qt(1), ir, i(0), qt(0), s, o(0));
U5:DFF PORT MAP(o(3), clk, qt(3), qb(3));
U6:DFF PORT MAP(o(2), clk, qt(2), qb(2));
U7:DFF PORT MAP(o(1), clk, qt(1), qb(1));
U8:DFF PORT MAP(o(0), clk, qt(0), qb(0));
q <= qt;
END struct;
The error messages that come up only appear when checking for the syntax in the testbench. They state that the entity does not match component port for "clk", "il", "ir", "i", "s", and "q". Does anyone have any ideas on what I may have wrong? I have read some suggestions online for similar issue but none have applied actually applied to this particular code.
The testbench is:
LIBRARY ieee;
USE IEEE.STD_LOGIC_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY UShift_test IS
END UShift_test;
ARCHITECTURE behavior OF UShift_test IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT UShift
PORT(clk : IN std_logic; il : IN std_logic; ir : IN std_logic; i : IN std_logic_vector(3 downto 0); s:IN std_logic_vector(1 downto 0);
q : OUT std_logic_vector(3 downto 0));
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal il : std_logic := '0';
signal ir : std_logic := '0';
signal s : std_logic_vector(1 downto 0) := (others => '0');
signal i : std_logic_vector(3 downto 0) := (others => '0');
--Outputs
signal q : std_logic_vector(3 downto 0);
-- Clock period definitions
constant clk_period : time := 20 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: UShift PORT MAP (
clk => clk,
il => il,
ir => ir,
s => s,
i => i,
q => q);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
---- test clr
ir<= '0';
wait for 40ns;
---- test parallel loading
ir<= '1';
s<= "11";
i<= "0010";
wait for 40ns;
---- test shift right
s<= "01";
il<='1';
wait;
end process;
END;
Yes. Here is the entity for UShift:
ENTITY UShift IS
PORT(clk, il, ir : IN BIT;
s: IN BIT_VECTOR(1 DOWNTO 0);
i : IN BIT_VECTOR(3 DOWNTO 0);
q : OUT BIT_VECTOR(3 DOWNTO 0));
END UShift;
Here is the corresponding component in UShift_test:
COMPONENT UShift
PORT(clk : IN std_logic; il : IN std_logic; ir : IN std_logic; i : IN std_logic_vector(3 downto 0); s:IN std_logic_vector(1 downto 0);
q : OUT std_logic_vector(3 downto 0));
END COMPONENT;`:
As you can see, they are different. Unless you use a configuration with a port map which includes type conversion functions, the component and entity should be identical. I highly recommend you don't try to fix this using a configuration, instead I recommend you change the types to match. You have used type BIT in your designs, which is unusual. Unless there is a good reason for that, I'd change type BIT to type STD_LOGIC (and the corresponding vectors, obviously).
And, why are you using component instantiation? Direct instantiation is easier and is less typing and the extra flexibility offered by component instantiation is usually not required. Here is an example that compares the two methods: https://www.edaplayground.com/x/2QrS.

Vhdl Test Bench Unknown Syntax Error

I am trying to write a testbench but Vivado tells me that I have a Syntax error on a specific line. I am not able to realize what have I done wrong. Can anyone help.
Here is my tb code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.Numeric_Std.all;
entity mmu_tb is
end mmu_tb;
architecture test of mmu_tb is
component mmu
port (
virt : in std_logic_vector(15 downto 0);
phys : out std_logic_vector(15 downto 0);
clock : in std_logic;
we : in std_logic;
datain : in std_logic_vector(7 downto 0)
);
end component;
signal virt std_logic_vector(15 downto 0);
signal phys std_logic_vector(15 downto 0);
signal clock std_logic;
signal we std_logic;
signal datain std_logic_vector(7 downto 0);
constant clock_period: time := 10 ns;
signal stop_the_clock: boolean;
begin
mmu : mmu port map ( virt => virt,
phys => phys,
clock => clock,
we => we,
datain => datain);
stimulus : process
begin
-- whatever
end process;
clocking: process
begin
while not stop_the_clock loop
clock <= '1', '0' after clock_period / 2;
wait for clock_period ;
end loop;
wait;
end process;
end test;
And here is the error I get:
[HDL 9-806] Syntax error near "std_logic_vector". ["C:/ram/ram/ram.srcs/sim_1/new/mmu_tb.vhd":20]
Thank you for your time.
Missing :, so line 20 should be:
signal virt : std_logic_vector(15 downto 0);
and similar for subsequent lines.

Error with wait conditions

I am a beginner to VHDL, and I am trying to make a multiplier, but the code I have to use from the book is not compiling right with the xilinx software. The code is:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity testMult is
Port ( ISwitch : in STD_LOGIC_VECTOR (3 downto 0);
IPress : in STD_LOGIC;
IRegIn : in STD_LOGIC_VECTOR (31 downto 0);
IRegOut : out STD_LOGIC_VECTOR (31 downto 0);
Iclk : in STD_LOGIC);
end testMult;
architecture Beh of testMult is
component asMult
port(ISwitch : in STD_LOGIC_VECTOR (3 downto 0);
IRegA : in STD_LOGIC_VECTOR (7 downto 0);
IRegB : in STD_LOGIC_VECTOR (7 downto 0);
IRegProd : out STD_LOGIC_VECTOR (15 downto 0);
Iclk : in STD_LOGIC;
St : in STD_LOGIC;
Done : out STD_LOGIC);
end component;
constant aValue : std_logic_vector:= IRegIn(7 downto 0);
constant bValue : std_logic_vector:= IRegIn(15 downto 8);
signal Done : std_logic;
signal St : std_logic;
signal IRegA, IRegB : std_logic_vector(7 downto 0);
signal IRegProd : std_logic_vector(15 downto 0);
signal CLK : std_logic;
begin
CLK <= not CLK after 10 ns;
process
begin
if IPress = '1' then
IRegA <= aValue;
IRegB <= bValue;
St <= '0';
wait until CLK = '1' and CLK'event;
St <= '1';
wait until Done = '0' and Done'event;
IRegOut <= IRegProd & IRegIn(15 downto 8) & IRegin(7 downto 0);
end if;
end process;
asMult1 : asMult port map (ISwitch, aValue, bValue, IRegProd, Iclk, St, Done);
end Beh;
But I keep getting this error: line 36: Same wait conditions expected in all Multiple Waits.
Are you trying to synthesize that code, or you just want to simulate it? The code won't synthesize because:
CLK <= not CLK after 10 ns is not a synthesizable statement, and
The synthesis tools are equiped to handle only simpler kinds of processes. Try to break up your code into processes that are either purely combinational, or synchronous processes sensitive to the same edge of the same clock.
If you only want to simulate the code, there are still other problems with your example, but at least it compiles ok with Modelsim ASE 10.1b. My guess would be your compiler is trying to synthesize the code.
That's simulation code - you can run a simulation in ISIM.
After you have that working, you can synthesise part of it (the asmult block), but you can't synthesise your top level block as it is full of test-bench, simulation-only, code, like waiting on events (which can only be done in very specific ways for synthesis) and after.

FPGA BRAM Stack Implementation Xilinx 7-Series

I am creating a stack based on the artix-7 fabric on the zynq soc. To create the stack I want to use the BRAM, I'm having a problem that the BRAM read output doesn't change, I've used BRAMS many times before (not 7-series so I may be missing something subtle) and am totally perplexed as to why it is doing this.
I filled the stack with values: 1, 2 ,3
When I then call pop successively the only value it reads out is 3 for each pop and read address (even after waiting for the one clock read delay). I have also tried with dual port rams and had the same issue, i'm sticking to single port as it simpler to try and workout what is going wrong!
I have verified the logic behavior using an array based ram which has the correct behavior. For verification I also checked the logic from this source: http://vhdlguru.blogspot.co.uk/2011/01/implementation-of-stack-in-vhdl.html.
So the issue appears to be with the BRAM, either it is not reading properly or for some reason it is writing the value 3 to all previous memory address which makes no sense as each data item is synced with a write signal and correct address.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use IEEE.numeric_std.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
library UNISIM;
use UNISIM.VComponents.all;
-- Stack implementation for 32 bit data items using BRAM componenets
entity stack_32_BRAM is
generic( ADDR : integer :=32);
Port ( clk : in STD_LOGIC;
rst : in STD_LOGIC;
en : in STD_LOGIC;
push_pop : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (31 downto 0);
data_out : out STD_LOGIC_VECTOR (31 downto 0));
end stack_32_BRAM;
architecture Behavioral of stack_32_BRAM is
COMPONENT BRAM_32_1K
PORT (
clka : IN STD_LOGIC;
rsta : IN STD_LOGIC;
wea : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
addra : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
dina : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
douta : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
clkb : IN STD_LOGIC;
rstb : IN STD_LOGIC;
web : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
addrb : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
dinb : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
doutb : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END COMPONENT;
COMPONENT BRAM_32_1K_SP
PORT (
clka : IN STD_LOGIC;
rsta : IN STD_LOGIC;
wea : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
addra : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
dina : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
douta : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END COMPONENT;
--The read ptr is a function of the write ptr
signal stack_ptr_read, stack_ptr_write : std_logic_vector(ADDR-1 downto 0) := (others =>'0');
signal full, empty : std_logic := '0';
signal WEA : std_logic_vector(3 downto 0) :=(others=>'0'); -- 4-bit input: A port write enable
signal addra, addrb, dinb, doutb, dina, douta : std_logic_vector(31 downto 0) := (others => '0');
signal rsta, rstb :std_logic := '0' ;
type ram is array (4 downto -2) of std_logic_vector(31 downto 0) ;
signal mem : ram :=(others=>(others=>'0'));
begin
---STACK LOGIC ---
PUSH : process (clk, push_pop, en, full, empty)
begin
if(clk'event and clk='1') then
WEA <= "0000";
if(en='1' and push_pop = '1' and full = '0') then
mem(to_integer(unsigned(stack_ptr_write))) <= data_in;
WEA <= "1111";
dina <= data_in ;
ADDRA <= stack_ptr_write;
stack_ptr_write <= stack_ptr_write + 1;
elsif(en='1' and push_pop = '0' and empty = '0') then
data_out <= douta ;--
doutb <= mem(to_integer(unsigned(stack_ptr_write - 1)));
ADDRA <= stack_ptr_write - 1;
stack_ptr_write <= stack_ptr_write - 1;
end if;
end if;
end process;
BRAM_SP : BRAM_32_1K_SP
PORT MAP (
clka => clk,
rsta => rsta,
wea => wea,
addra => addra,
dina => dina,
douta => douta
);
end Behavioral;
Many thanks
Sam
The solution entails several things:
1) You have to explicitly reset the signals with the rst port in every process. Initializing them in their declaration just doesn't cut it.
The process' code with a proper reset and sensitivity list should then look like this:
PUSH : process (rst, clk)
begin
if (rst = '1') then --supposing active-high async. reset
WEA <= (others => '0');
ADDRA <= (others => '0');
dina <= (others => '0');
data_out <= (others => '0');
full <= '0';
empty <= '0';
stack_ptr_write <= (others => '0');
elsif(clk'event and clk='1') then
--your code
2) I understand you have several layers/tries of code here in the same place. This is messy to read. I see you are using a "mem" to hold your example (so that WEA, ADDRA, dina, etc are ignorable), but when you get back to BRAM_32_1K_SP remember to check it has 32 bits addresses which, coupled with 32 bits data, mean that you have a 32 * 2**32 bits ram... that is around 128 Gbits, typo I guess.
However, to make a clearer question you should leave only the code pertaining to the memory solution you're having a problem with.
3) your code does include some typos that you should fix, like assigning "doutb" in the process, whereas I guess you wanted to assign data_out instead:
data_out <= mem(to_integer(unsigned(stack_ptr_write - 1)));
And this is the reason why you don't see what you want at the output.