Commit feba6ffa authored by tstana's avatar tstana

Added the *play* project, as a reference project to the hdlmake tutorial, as…

Added the *play* project, as a reference project to the hdlmake tutorial, as well as an exampleof accessing SPEC registers via the *rawrabbit* driver.

git-svn-id: http://svn.ohwr.org/fmc-adc-100m14b4cha/trunk@131 ddd67a1a-c8ad-4635-afe9-0b8a11d8f8e4
parent 2e6afd3a
--------------------------------------------------------------------------------
-- CERN (BE-CO-HT)
-- Top level entity for Simple PCIe FMC Carrier
-- http://www.ohwr.org/projects/spec
--------------------------------------------------------------------------------
--
-- unit name: Address decoder (addr_dec.vhd)
--
-- author: Theodor Stana (t.stana@cern.ch)
--
-- date of creation: 2011-09-21
--
-- version: 1.0
--
-- description: Top entity for LED control project
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: see svn log.
--------------------------------------------------------------------------------
-- TODO: -
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--=============================================================================
-- Entity declaration for address decoder
--=============================================================================
entity addr_dec is
port (
-- Input signals
cyc_i : in std_logic;
adr_i : in std_logic;
dat_i : in std_logic_vector(63 downto 0);
ack_i : in std_logic_vector(1 downto 0);
-- Output signals
cyc_o : out std_logic_vector(1 downto 0);
ack_o : out std_logic;
dat_o : out std_logic_vector(31 downto 0)
);
end entity;
--=============================================================================
--=============================================================================
-- Architecture declaration for address decoder
--=============================================================================
architecture behavioral of addr_dec is
--=============================================================================
-- architecture begin
--=============================================================================
begin
cyc_o(0) <= cyc_i when (adr_i = '0') else '0';
cyc_o(1) <= cyc_i when (adr_i = '1') else '0';
-- cyc_o(to_integer(unsigned(adr_i))) <= cyc_i;
ack_o <= ack_i(0) when (adr_i = '0') else
ack_i(1); --(to_integer(unsigned(adr_i));
dat_o <= dat_i(31 downto 0) when (adr_i = '0') else
dat_i(63 downto 32);
end architecture;
--=============================================================================
-- architecture end
--=============================================================================
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:43:07 09/11/2012
-- Design Name:
-- Module Name: clk_div - behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.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;
entity clk_div is
-- generic
-- (
-- g_DIV_RATE : integer := 1
-- );
Port
(
clk_i : in STD_LOGIC;
reset_i : in std_logic;
clk_o : out STD_LOGIC
);
end clk_div;
architecture behavioral of clk_div is
signal s_div_cnt : std_logic_vector(32 downto 0) := (others => '0');
--signal s_clk_o :
begin
clk_o <= s_div_cnt(23);
p_div_count: process (reset_i, clk_i)
begin
if (reset_i = '1') then
s_div_cnt <= (others => '0');
elsif rising_edge(clk_i) then
s_div_cnt <= s_div_cnt + 1;
end if;
end process p_div_count;
end behavioral;
--------------------------------------------------------------------------------
-- CERN (BE-CO-HT)
-- IRQ controller
-- http://www.ohwr.org/projects/fmc-adc-100m14b4cha
--------------------------------------------------------------------------------
--
-- unit name: irq_controller (irq_controller.vhd)
--
-- author: Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 18-11-2011
--
-- version: 1.0
--
-- description:
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: see svn log.
--------------------------------------------------------------------------------
-- TODO: -
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
--library UNISIM;
--use UNISIM.vcomponents.all;
entity irq_controller is
port (
-- Clock, reset
clk_i : in std_logic;
rst_n_i : in std_logic;
-- Interrupt sources input, must be 1 clk_i tick long
irq_src_p_i : in std_logic_vector(31 downto 0);
-- IRQ pulse output
irq_p_o : out std_logic;
-- Wishbone interface
wb_adr_i : in std_logic_vector(1 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic
);
end irq_controller;
architecture rtl of irq_controller is
------------------------------------------------------------------------------
-- Components declaration
------------------------------------------------------------------------------
component irq_controller_regs
port (
rst_n_i : in std_logic;
wb_clk_i : in std_logic;
wb_addr_i : in std_logic_vector(1 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
irq_ctrl_multi_irq_o : out std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_i : in std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_load_o : out std_logic;
irq_ctrl_src_o : out std_logic_vector(31 downto 0);
irq_ctrl_src_i : in std_logic_vector(31 downto 0);
irq_ctrl_src_load_o : out std_logic;
irq_ctrl_en_mask_o : out std_logic_vector(31 downto 0)
);
end component irq_controller_regs;
------------------------------------------------------------------------------
-- Signals declaration
------------------------------------------------------------------------------
signal irq_en_mask : std_logic_vector(31 downto 0);
signal irq_pending : std_logic_vector(31 downto 0);
signal irq_pending_d : std_logic_vector(31 downto 0);
signal irq_pending_re : std_logic_vector(31 downto 0);
signal irq_src_rst : std_logic_vector(31 downto 0);
signal irq_src_rst_en : std_logic;
signal multi_irq : std_logic_vector(31 downto 0);
signal multi_irq_rst : std_logic_vector(31 downto 0);
signal multi_irq_rst_en : std_logic;
signal irq_p_or : std_logic_vector(32 downto 0);
begin
------------------------------------------------------------------------------
-- Wishbone interface to IRQ controller registers
------------------------------------------------------------------------------
cmp_irq_controller_regs : irq_controller_regs
port map(
rst_n_i => rst_n_i,
wb_clk_i => clk_i,
wb_addr_i => wb_adr_i,
wb_data_i => wb_dat_i,
wb_data_o => wb_dat_o,
wb_cyc_i => wb_cyc_i,
wb_sel_i => wb_sel_i,
wb_stb_i => wb_stb_i,
wb_we_i => wb_we_i,
wb_ack_o => wb_ack_o,
irq_ctrl_multi_irq_o => multi_irq_rst,
irq_ctrl_multi_irq_load_o => multi_irq_rst_en,
irq_ctrl_multi_irq_i => multi_irq,
irq_ctrl_src_o => irq_src_rst,
irq_ctrl_src_i => irq_pending,
irq_ctrl_src_load_o => irq_src_rst_en,
irq_ctrl_en_mask_o => irq_en_mask
);
------------------------------------------------------------------------------
-- Register interrupt sources
-- IRQ is pending until a '1' is written to the corresponding bit
------------------------------------------------------------------------------
p_irq_src : process (clk_i)
begin
if rising_edge(clk_i) then
for I in 0 to irq_pending'length-1 loop
if rst_n_i = '0' then
irq_pending(I) <= '0';
elsif irq_src_p_i(I) = '1' then
irq_pending(I) <= '1';
elsif irq_src_rst_en = '1' and irq_src_rst(I) = '1' then
irq_pending(I) <= '0';
end if;
end loop; -- I
end if;
end process p_irq_src;
------------------------------------------------------------------------------
-- Multiple interrupt detection
-- Rise a flag if an interrupt occurs while an irq is still pending
-- Write '1' to the flag to clear it
------------------------------------------------------------------------------
p_multi_irq_detect : process (clk_i)
begin
if rising_edge(clk_i) then
for I in 0 to multi_irq'length-1 loop
if rst_n_i = '0' then
multi_irq(I) <= '0';
elsif irq_src_p_i(I) = '1' and irq_pending(I) = '1' then
multi_irq(I) <= '1';
elsif multi_irq_rst_en = '1' and multi_irq_rst(I) = '1' then
multi_irq(I) <= '0';
end if;
end loop; -- I
end if;
end process p_multi_irq_detect;
------------------------------------------------------------------------------
-- Generate IRQ output pulse
------------------------------------------------------------------------------
irq_p_or(0) <= '0';
l_irq_out_pulse : for I in 0 to irq_src_p_i'length-1 generate
irq_p_or(I+1) <= irq_p_or(I) or (irq_src_p_i(I) and irq_en_mask(I));
end generate l_irq_out_pulse;
p_irq_out_pulse : process (clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
irq_p_o <= '0';
else
irq_p_o <= irq_p_or(32);
end if;
end if;
end process p_irq_out_pulse;
end rtl;
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for IRQ controller registers
---------------------------------------------------------------------------------------
-- File : ../rtl/irq_controller_regs.vhd
-- Author : auto-generated by wbgen2 from irq_controller_regs.wb
-- Created : Wed Jan 18 09:43:55 2012
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE irq_controller_regs.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity irq_controller_regs is
port (
rst_n_i : in std_logic;
wb_clk_i : in std_logic;
wb_addr_i : in std_logic_vector(1 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
-- Port for std_logic_vector field: 'Multiple interrupt' in reg: 'Multiple interrupt register'
irq_ctrl_multi_irq_o : out std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_i : in std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_load_o : out std_logic;
-- Port for std_logic_vector field: 'Interrupt sources' in reg: 'Interrupt sources register '
irq_ctrl_src_o : out std_logic_vector(31 downto 0);
irq_ctrl_src_i : in std_logic_vector(31 downto 0);
irq_ctrl_src_load_o : out std_logic;
-- Port for std_logic_vector field: 'Interrupt enable mask' in reg: 'Interrupt enable mask register'
irq_ctrl_en_mask_o : out std_logic_vector(31 downto 0)
);
end irq_controller_regs;
architecture syn of irq_controller_regs is
signal irq_ctrl_en_mask_int : std_logic_vector(31 downto 0);
signal ack_sreg : std_logic_vector(9 downto 0);
signal rddata_reg : std_logic_vector(31 downto 0);
signal wrdata_reg : std_logic_vector(31 downto 0);
signal bwsel_reg : std_logic_vector(3 downto 0);
signal rwaddr_reg : std_logic_vector(1 downto 0);
signal ack_in_progress : std_logic ;
signal wr_int : std_logic ;
signal rd_int : std_logic ;
signal bus_clock_int : std_logic ;
signal allones : std_logic_vector(31 downto 0);
signal allzeros : std_logic_vector(31 downto 0);
begin
-- Some internal signals assignments. For (foreseen) compatibility with other bus standards.
wrdata_reg <= wb_data_i;
bwsel_reg <= wb_sel_i;
bus_clock_int <= wb_clk_i;
rd_int <= wb_cyc_i and (wb_stb_i and (not wb_we_i));
wr_int <= wb_cyc_i and (wb_stb_i and wb_we_i);
allones <= (others => '1');
allzeros <= (others => '0');
--
-- Main register bank access process.
process (bus_clock_int, rst_n_i)
begin
if (rst_n_i = '0') then
ack_sreg <= "0000000000";
ack_in_progress <= '0';
rddata_reg <= "00000000000000000000000000000000";
irq_ctrl_multi_irq_load_o <= '0';
irq_ctrl_src_load_o <= '0';
irq_ctrl_en_mask_int <= "00000000000000000000000000000000";
elsif rising_edge(bus_clock_int) then
-- advance the ACK generator shift register
ack_sreg(8 downto 0) <= ack_sreg(9 downto 1);
ack_sreg(9) <= '0';
if (ack_in_progress = '1') then
if (ack_sreg(0) = '1') then
irq_ctrl_multi_irq_load_o <= '0';
irq_ctrl_src_load_o <= '0';
ack_in_progress <= '0';
else
irq_ctrl_multi_irq_load_o <= '0';
irq_ctrl_src_load_o <= '0';
end if;
else
if ((wb_cyc_i = '1') and (wb_stb_i = '1')) then
case rwaddr_reg(1 downto 0) is
when "00" =>
if (wb_we_i = '1') then
irq_ctrl_multi_irq_load_o <= '1';
else
rddata_reg(31 downto 0) <= irq_ctrl_multi_irq_i;
end if;
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "01" =>
if (wb_we_i = '1') then
irq_ctrl_src_load_o <= '1';
else
rddata_reg(31 downto 0) <= irq_ctrl_src_i;
end if;
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "10" =>
if (wb_we_i = '1') then
irq_ctrl_en_mask_int <= wrdata_reg(31 downto 0);
else
rddata_reg(31 downto 0) <= irq_ctrl_en_mask_int;
end if;
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when others =>
-- prevent the slave from hanging the bus on invalid address
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end case;
end if;
end if;
end if;
end process;
-- Drive the data output bus
wb_data_o <= rddata_reg;
-- Multiple interrupt
irq_ctrl_multi_irq_o <= wrdata_reg(31 downto 0);
-- Interrupt sources
irq_ctrl_src_o <= wrdata_reg(31 downto 0);
-- Interrupt enable mask
irq_ctrl_en_mask_o <= irq_ctrl_en_mask_int;
rwaddr_reg <= wb_addr_i;
-- ACK signal generation. Just pass the LSB of ACK counter.
wb_ack_o <= ack_sreg(0);
end syn;
--------------------------------------------------------------------------------
-- CERN (BE-CO-HT)
-- Top level entity for Simple PCIe FMC Carrier
-- http://www.ohwr.org/projects/spec
--------------------------------------------------------------------------------
--
-- unit name: LED control (led_ctrl.vhd)
--
-- author: Theodor Stana (t.stana@cern.ch)
--
-- date of creation: 2011-09-14
--
-- version: 1.0
--
-- description: Top entity for LED control project
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: see svn log.
--------------------------------------------------------------------------------
-- TODO: -
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.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;
--=============================================================================
-- Entity declaration for LED control
--=============================================================================
entity led_ctrl is
Port (
-------------------------------------------------------------------------
-- WISHBONE SLAVE PORTS
-------------------------------------------------------------------------
-- input signals
clk_i : in STD_LOGIC;
rst_i : in STD_LOGIC;
wb_dat_i : in std_logic;
wb_adr_i : in std_logic;
wb_stb_i : in STD_LOGIC;
wb_we_i : in STD_LOGIC;
wb_cyc_i : in STD_LOGIC;
-- output signals
wb_ack_o : out STD_LOGIC;
wb_dat_o : out std_logic;
-------------------------------------------------------------------------
-- OTHER ENTITY PORTS
-------------------------------------------------------------------------
irq_o : out std_logic_vector(1 downto 0);
leds_o : out STD_LOGIC_VECTOR (1 downto 0)
);
end led_ctrl;
--=============================================================================
--=============================================================================
-- Architecture declaration for leds_sm
--=============================================================================
architecture behavioral of led_ctrl is
-----------------------------------------------------------------------------
-- Signals
-----------------------------------------------------------------------------
signal s_ctrl_reg : std_logic_vector(1 downto 0);
-- signal s_adr : std_logic;
signal s_dat : std_logic;
signal s_irq : std_logic_vector(1 downto 0);
--=============================================================================
-- architecture begin
--=============================================================================
begin
-----------------------------------------------------------------------------
-- Input and output logic
-----------------------------------------------------------------------------
-- output logic
leds_o <= s_ctrl_reg;
wb_dat_o <= s_dat;
irq_o <= s_irq;
-----------------------------------------------------------------------------
-- WISHBONE registers process
-----------------------------------------------------------------------------
p_wb_reg: process (clk_i, rst_i) is
begin
if rising_edge(clk_i) then
if (rst_i = '1') then
wb_ack_o <= '0';
s_dat <= '0';
s_ctrl_reg <= "00";
s_irq <= "00";
else
wb_ack_o <= '0';
s_irq <= "00";
if (wb_stb_i = '1') and (wb_cyc_i = '1') then
wb_ack_o <= '1';
if (wb_we_i = '1') then
-- s_irq <= '1'; -- IRQ on write to any of the registers
if (wb_adr_i = '0') then
s_ctrl_reg(0) <= wb_dat_i;
s_irq(0) <= '1';
else
s_ctrl_reg(1) <= wb_dat_i;
s_irq(1) <= '1';
end if;
else
if (wb_adr_i = '0') then
s_dat <= s_ctrl_reg(0);
else
s_dat <= s_ctrl_reg(1);
end if;
end if;
end if;
end if;
end if;
end process p_wb_reg;
-----------------------------------------------------------------------------
end behavioral;
--==================================================================================
-- architecture end
--==================================================================================
This diff is collapsed.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 08:01:04 09/11/2012
-- Design Name:
-- Module Name: leds_sm - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.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;
--==================================================================================
-- Entity declaration for LEDs state machine
--==================================================================================
entity leds_sm is
Port
(
-- global input signals
clk_i : in STD_LOGIC;
reset_i : in STD_LOGIC;
-- global output signals
led1a_o : out STD_LOGIC; -- LED1A, '1' = on
-- '0' = off
led1b_o : out STD_LOGIC -- LED1B, '1' = on
-- '0' = off
);
end leds_sm;
--==================================================================================
----==================================================================================
---- Architecture declaration for leds_sm
----==================================================================================
architecture behavioral of leds_sm is
signal s_cnt : std_logic_vector(1 downto 0) := (others => '0');
----==================================================================================
---- architecture begin
----==================================================================================
begin
----------------------------------------------------------------
-- Entity input and output logic
----------------------------------------------------------------
led1a_o <= s_cnt(0);
led1b_o <= s_cnt(1);
----------------------------------------------------------------
----------------------------------------------------------------
-- Counter process
----------------------------------------------------------------
p_count: process (clk_i, reset_i)
begin
if (reset_i = '1') then
s_cnt <= "00";
elsif rising_edge(clk_i) then
s_cnt <= s_cnt + 1;
end if;
end process p_count;
----------------------------------------------------------------
end;
----==================================================================================
---- architecture end
----==================================================================================
----==================================================================================
---- Architecture declaration for leds_sm
----==================================================================================
--architecture behavioral of leds_sm is
--
---------------------------------------------------------------------
---- LED state machine type and signal declaration
---------------------------------------------------------------------
-- type t_state_mach is (ST_IDLE, ST_LED1A, ST_LED1B);
--
-- signal s_state_pres : t_state_mach;
---------------------------------------------------------------------
--
---------------------------------------------------------------------
---- Internal signals for entity outputs
---------------------------------------------------------------------
-- signal s_led1a, s_led1b : std_logic;
---------------------------------------------------------------------
--
--
----==================================================================================
---- architecture begin
----==================================================================================
--begin
--
-- ----------------------------------------------------------------
-- -- Entity input and output logic
-- ----------------------------------------------------------------
-- led1a_o <= s_led1a;
-- led1b_o <= s_led1b;
-- ----------------------------------------------------------------
--
-- ----------------------------------------------------------------
-- -- State logic for LED FSM
-- ----------------------------------------------------------------
-- fsm_proc: process (reset_i, clk_i)
-- begin
--
-- if (reset_i = '1') then
-- s_state_pres <= ST_IDLE;
--
-- elsif rising_edge(clk_i) then
--
-- case s_state_pres is
--
-- when ST_IDLE =>
-- s_state_pres <= ST_LED1A;
--
-- when ST_LED1A =>
-- s_state_pres <= ST_LED1B;
--
-- when ST_LED1B =>
-- s_state_pres <= ST_IDLE;
--
-- when others =>
-- s_state_pres <= ST_IDLE;
--
-- end case;
--
-- end if;
--
-- end process fsm_proc;
-- ----------------------------------------------------------------
--
-- ----------------------------------------------------------------
-- -- Output logic for LED FSM
-- ----------------------------------------------------------------
-- fsm_proc: process (reset_i, clk_i)
-- begin
--
-- if (reset_i = '1') then
-- s_led1a <= '0';
-- s_led1b <= '0';
--
-- elsif rising_edge(clk_i) then
--
-- case s_state_pres is
--
-- when ST_IDLE =>
-- s_led1a <= '0';
-- s_led1b <= '0';
--
-- when ST_LED1A =>
-- s_led1a <= '1';
-- s_led1b <= '0';
--
-- when ST_LED1B =>
-- s_led1a <= '0';
-- s_led1b <= '1';
--
-- when others =>
-- s_led1a <= '1';
-- s_led1b <= '1';
--
-- end case;
--
-- end if;
--
-- end process fsm_proc;
-- ----------------------------------------------------------------
--
--end Behavioral;
----==================================================================================
---- architecture end
----==================================================================================
This diff is collapsed.
vlib work
vcom -explicit -93 "../hdl/design/led_ctrl.vhd"
vcom -explicit -93 "../hdl/design/irq_controller_regs.vhd"
vcom -explicit -93 "../hdl/design/irq_controller.vhd"
vcom -explicit -93 "../hdl/design/addr_dec.vhd"
vcom -explicit -93 "../hdl/tb/testbench.vhd"
vsim -voptargs="+acc" -debugdb -lib work work.testbench
log -r /*
# add wave *
do wave.do
run 4 us
onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate /testbench/s_clk
add wave -noupdate /testbench/s_rst
add wave -noupdate -radix unsigned /testbench/s_wb_dat
add wave -noupdate /testbench/s_wb_we
add wave -noupdate -radix unsigned /testbench/s_irq
add wave -noupdate /testbench/s_irq_p
add wave -noupdate /testbench/s_leds_irq
add wave -noupdate /testbench/s_wb_stb
add wave -noupdate /testbench/s_wb_cyc
add wave -noupdate /testbench/s_ack
add wave -noupdate /testbench/s_leds
add wave -noupdate -height 16 /testbench/s_state
add wave -noupdate -radix hexadecimal /testbench/s_fsm_data
add wave -noupdate /testbench/s_fsm_ctrl
add wave -noupdate /testbench/s_fsm_act
add wave -noupdate -radix hexadecimal /testbench/s_wb_dat_i
add wave -noupdate -radix hexadecimal /testbench/s_wb_dat_o
add wave -noupdate -radix hexadecimal -childformat {{/testbench/s_wb_adr(31) -radix hexadecimal} {/testbench/s_wb_adr(30) -radix hexadecimal} {/testbench/s_wb_adr(29) -radix hexadecimal} {/testbench/s_wb_adr(28) -radix hexadecimal} {/testbench/s_wb_adr(27) -radix hexadecimal} {/testbench/s_wb_adr(26) -radix hexadecimal} {/testbench/s_wb_adr(25) -radix hexadecimal} {/testbench/s_wb_adr(24) -radix hexadecimal} {/testbench/s_wb_adr(23) -radix hexadecimal} {/testbench/s_wb_adr(22) -radix hexadecimal} {/testbench/s_wb_adr(21) -radix hexadecimal} {/testbench/s_wb_adr(20) -radix hexadecimal} {/testbench/s_wb_adr(19) -radix hexadecimal} {/testbench/s_wb_adr(18) -radix hexadecimal} {/testbench/s_wb_adr(17) -radix hexadecimal} {/testbench/s_wb_adr(16) -radix hexadecimal} {/testbench/s_wb_adr(15) -radix hexadecimal} {/testbench/s_wb_adr(14) -radix hexadecimal} {/testbench/s_wb_adr(13) -radix hexadecimal} {/testbench/s_wb_adr(12) -radix hexadecimal} {/testbench/s_wb_adr(11) -radix hexadecimal} {/testbench/s_wb_adr(10) -radix hexadecimal} {/testbench/s_wb_adr(9) -radix hexadecimal} {/testbench/s_wb_adr(8) -radix hexadecimal} {/testbench/s_wb_adr(7) -radix hexadecimal} {/testbench/s_wb_adr(6) -radix hexadecimal} {/testbench/s_wb_adr(5) -radix hexadecimal} {/testbench/s_wb_adr(4) -radix hexadecimal} {/testbench/s_wb_adr(3) -radix hexadecimal} {/testbench/s_wb_adr(2) -radix hexadecimal} {/testbench/s_wb_adr(1) -radix hexadecimal} {/testbench/s_wb_adr(0) -radix hexadecimal}} -subitemconfig {/testbench/s_wb_adr(31) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(30) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(29) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(28) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(27) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(26) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(25) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(24) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(23) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(22) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(21) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(20) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(19) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(18) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(17) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(16) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(15) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(14) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(13) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(12) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(11) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(10) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(9) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(8) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(7) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(6) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(5) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(4) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(3) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(2) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(1) {-height 13 -radix hexadecimal} /testbench/s_wb_adr(0) {-height 13 -radix hexadecimal}} /testbench/s_wb_adr
add wave -noupdate -divider {ADDRESS DECODER}
add wave -noupdate /testbench/cmp_addr_dec/cyc_i
add wave -noupdate /testbench/cmp_addr_dec/adr_i
add wave -noupdate -radix hexadecimal /testbench/cmp_addr_dec/dat_i
add wave -noupdate /testbench/cmp_addr_dec/ack_i
add wave -noupdate /testbench/cmp_addr_dec/cyc_o
add wave -noupdate /testbench/cmp_addr_dec/ack_o
add wave -noupdate -radix hexadecimal /testbench/cmp_addr_dec/dat_o
add wave -noupdate -divider LEDs
add wave -noupdate /testbench/uut/wb_cyc_i
add wave -noupdate /testbench/uut/wb_ack_o
add wave -noupdate /testbench/uut/irq_o
add wave -noupdate /testbench/uut/leds_o
add wave -noupdate /testbench/uut/s_ctrl_reg
add wave -noupdate /testbench/uut/s_dat
add wave -noupdate /testbench/uut/s_irq
add wave -noupdate -divider IRQ
add wave -noupdate -radix hexadecimal /testbench/cmp_irq_ctrl/irq_src_p_i
add wave -noupdate /testbench/cmp_irq_ctrl/irq_p_o
add wave -noupdate /testbench/cmp_irq_ctrl/wb_cyc_i
add wave -noupdate /testbench/cmp_irq_ctrl/wb_stb_i
add wave -noupdate /testbench/cmp_irq_ctrl/wb_we_i
add wave -noupdate /testbench/cmp_irq_ctrl/cmp_irq_controller_regs/rwaddr_reg
add wave -noupdate /testbench/cmp_irq_ctrl/wb_ack_o
add wave -noupdate -radix hexadecimal /testbench/cmp_irq_ctrl/irq_pending
add wave -noupdate -radix hexadecimal /testbench/cmp_irq_ctrl/irq_en_mask
add wave -noupdate -radix hexadecimal /testbench/cmp_irq_ctrl/irq_src_rst
add wave -noupdate /testbench/cmp_irq_ctrl/irq_src_rst_en
add wave -noupdate -radix hexadecimal /testbench/cmp_irq_ctrl/cmp_irq_controller_regs/irq_ctrl_src_i
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 1} {2394 ns} 0}
configure wave -namecolwidth 268
configure wave -valuecolwidth 116
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits ns
update
WaveRestoreZoom {1007 ns} {3005 ns}
#! /usr/bin/env python
# coding: utf8
# Copyright CERN, 2011
# Author: Matthieu Cattin <matthieu.cattin@cern.ch>
# Licence: GPL v2 or later.
# Website: http://www.ohwr.org
# Last modifications: 10/5/2012
# Import system modules
import sys
import time
import os
# Add common modules and libraries location to path
sys.path.append('../../../')
sys.path.append('../../../gnurabbit/python/')
sys.path.append('../../../common/')
# Import common modules
from ptsexcept import *
import rr
# Import specific modules
from fmc_adc_spec import *
"""
Load firmware
"""
def main (default_directory='.'):
# Constants declaration
TEST_NB = 0
#FMC_ADC_ADDR = '1a39:0004/1a39:0004@000B:0000'
#FMC_ADC_BITSTREAM = '../firmwares/spec_fmcadc100m14b4cha.bin'
#FMC_ADC_BITSTREAM = os.path.join(default_directory, FMC_ADC_BITSTREAM)
EXPECTED_BITSTREAM_TYPE = 0x1
FMC_ADC_BITSTREAM = sys.argv[1]
start_test_time = time.time()
print "\n================================================================================"
print "==> Test%02d start\n" % TEST_NB
# SPEC object declaration
print "Loading hardware access library and opening device.\n"
spec = rr.Gennum()
# Bind SPEC object to FMC ADC card
#for name, value in spec.parse_addr(FMC_ADC_ADDR).iteritems():
# print "%9s:0x%04X"%(name, value)
#spec.bind(FMC_ADC_ADDR)
# Load FMC ADC firmware
print "Loading FMC ADC firmware: %s\n" % FMC_ADC_BITSTREAM
spec.load_firmware(FMC_ADC_BITSTREAM)
time.sleep(2)
print "==> End of test%02d" % TEST_NB
print "================================================================================"
end_test_time = time.time()
print "Test%02d elapsed time: %.2f seconds\n" % (TEST_NB, end_test_time-start_test_time)
if __name__ == '__main__' :
main()
#!/usr/bin/env python
# Copyright CERN, 2011
# Author: Theodor Stana <t.stana@cern.ch>
# Licence: GPL v2 or later.
# Import system modules
import sys
import time
import os
# Add common modules and libraries location to path
#sys.path.append('../')
sys.path.append('../../../../')
sys.path.append('../../../../gnurabbit/python/')
sys.path.append('../../../../common/')
# Import common modules
from ptsexcept import *
import rr
from csr import *
import gn4124
'''
PLAY project
Playing with the connection-panel LEDs on the FmcAdc100m14b4cha board.
'''
#def wr()
#reg = int(sys.argv[1])
#val = int(sys.argv[2])
#regs.wr_reg(reg,val)
def main():
# Define register constants
IRQ_MULTI = 0x0
IRQ_SRC = 0x4
IRQ_EN_MASK = 0x8
# Create a SPEC object using RawRabbit driver
spec = rr.Gennum()
spec.irqena()
# Define the registers' base addresses
irq_regs = CCSR(spec, 0)
led_regs = CCSR(spec, 16)
# Enable interrupt on LED write
irq_regs.wr_reg(IRQ_EN_MASK, 0x3)
msk = irq_regs.rd_reg(IRQ_EN_MASK)
print "Mask: 0x%x" % msk
act = ''
while (act != "q"):
act = raw_input("(w)rite/(r)ead/(q)uit? ")
act = act.lower()
if (act == "w"):
print "WRITE"
reg = input("reg? ")
val = input("val? ")
led_regs.wr_reg(reg,val)
time.sleep(0.002)
spec.irqwait()
print "interrupt!"
# multi = irq_regs.rd_reg(IRQ_MULTI)
# print "multi: 0x%x" % multi
# msk = irq_regs.rd_reg(IRQ_EN_MASK)
# print "Mask: 0x%x" % msk
src = irq_regs.rd_reg(IRQ_SRC)
print "src : 0x%x" % src
print "wrote to LED %d" % src
val = led_regs.rd_reg(reg)
print "value 0x%x" % val
irq_regs.wr_reg(IRQ_SRC, src)
elif (act == "r"):
print "READ"
reg = input("reg? ")
val = led_regs.rd_reg(reg)
# print "register: 0x%1x" % reg
print "value: 0x%1x" % val
elif (act == "q"):
print "quitting"
else:
print "Wrong input!!"
if __name__ == "__main__":
main()
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment