by Guy Eschemann on September 13, 2011
Even though Xilinx doesn’t officially support Ubuntu Linux for its ISE Design Suite, it is technically possible to run ISE 13.2 under the 64-bit version of Ubuntu Linux 10.04 (LTS).
Out of the box, the ISE Project Navigator and most command-line tools work fine. I only had problems starting the SmartXplorer tool and the PlanAhead environment.
SmartXplorer reported the following error:
bash: ./smartxplorer: No such file or directory
This is because SmartXplorer is a 32-bit application, and it requires additional libraries for running in a 64-bit environment. The problem is easily fixed by installing the 32-bit libraries for the Intel architecture:
sudo apt-get install ia32-libs
PlanAhead reported the following error:
[: 43: GNU/Linux: unexpected operator
/opt/Xilinx/13.2/ISE_DS/PlanAhead/bin/rdiArgs.sh: 15: Syntax error: "(" unexpected
The fix, as I’ve been told on the Xilinx Forum, is to change the first line of every script in the /opt/Xilinx/13.2/ISE_DS/PlanAhead/bin directory from “#!/bin/sh” to “#!/bin/bash” — that worked for me.
by Guy Eschemann on May 5, 2011
Let’s take writing to an external SRAM as an example. The data is written into the SRAM at the rising edge of the “wr” signal, and you need to make sure that the “data” signal is stable during a given time before (the “setup time”) and after (the “hold time”) the rising edge of “wr”.

How do you check that your VHDL module meets the setup and hold time requirements of the SRAM?
Of course, you could just have a look at the waveforms in your VHDL simulation and measure these times using cursors. A better way to do it is to have your VHDL testbench automatically perform these checks for you using two checker processes.
Here’s a simple entity that does just that:
--------------------------------------------------------------------------------
-- Purpose : Checks that the data signal meets the given setup and hold times
-- with respect to the rising edge of the wr signal.
-- Author : Guy.Eschemann@gmail.com
-- Created : 03-May-2011
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity setup_hold_check is
generic (
g_setup_time : time := 5 ns;
g_hold_time : time := 10 ns);
port (
wr : in std_logic;
data : in std_logic_vector(7 downto 0));
end setup_hold_check;
architecture behavioral of setup_hold_check is
begin
p_check_setup_time : process (wr, data)
begin
if rising_edge(wr) then
assert data'stable(g_setup_time)
report "Setup time violation" severity error;
end if;
end process;
p_check_hold_time : process (wr'delayed(g_hold_time))
begin
if rising_edge(wr'delayed(g_hold_time)) then
assert data'last_event = 0 ns or data'last_event > g_hold_time
report "Hold time violation" severity error;
end if;
end process;
end behavioral;