diff --git a/hdl/gn4124core/rtl/Manifest.py b/hdl/gn4124core/rtl/Manifest.py index 48fa071bb7ce7fc3dca5450fb012e3a2dafbfa55..cd26e64bb43a7f23d7a8a2c68704b538a9b4871a 100644 --- a/hdl/gn4124core/rtl/Manifest.py +++ b/hdl/gn4124core/rtl/Manifest.py @@ -1,11 +1,13 @@ files = ["dma_controller.vhd", "dma_controller_wb_slave.vhd", - "gn4124_core_pkg.vhd", "l2p_arbiter.vhd", "l2p_dma_master.vhd", "p2l_decode32.vhd", "p2l_dma_master.vhd", "wbmaster32.vhd"] -modules = { "local" : "spartan6" } +modules = { "local" : "spartan6", + "git" : "git://ohwr.org/hdl-core-lib/general-cores.git" } + +fetchto = "ip_cores" diff --git a/hdl/gn4124core/rtl/l2p_dma_master.vhd b/hdl/gn4124core/rtl/l2p_dma_master.vhd index c369163d56a57a4d66de5b4e3726a235a8bfb667..fdbab1f5e5ff769100b601a7216f64eb85e45263 100644 --- a/hdl/gn4124core/rtl/l2p_dma_master.vhd +++ b/hdl/gn4124core/rtl/l2p_dma_master.vhd @@ -16,10 +16,11 @@ -- description: Provides a pipelined Wishbone interface to performs DMA -- transfers from local application to PCI express host. -- --- dependencies: Xilinx FIFOs (fifo_32x512.xco) +-- dependencies: general-cores library (genrams package) -- -------------------------------------------------------------------------------- --- last changes: see svn log +-- last changes: 11-07-2011 (mcattin) Replaced Xilinx Coregen FIFOs with genrams +-- library cores from ohwr.org -------------------------------------------------------------------------------- -- TODO: - byte enable support -------------------------------------------------------------------------------- @@ -28,6 +29,7 @@ library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; use work.gn4124_core_pkg.all; +use work.genram_pkg.all; entity l2p_dma_master is @@ -95,9 +97,9 @@ architecture behaviour of l2p_dma_master is -- c_L2P_MAX_PAYLOAD is the maximum size (in 32-bit words) of the payload of a packet. -- Allowed c_L2P_MAX_PAYLOAD values are: 32, 64, 128, 256, 512, 1024. -- This constant must be set according to the GN4124 and motherboard chipset capabilities. - constant c_L2P_MAX_PAYLOAD : unsigned(10 downto 0) := to_unsigned(32, 11); -- in 32-bit words - constant c_ADDR_FIFO_FULL_THRES : std_logic_vector(8 downto 0) := std_logic_vector(to_unsigned(500, 9)); - constant c_DATA_FIFO_FULL_THRES : std_logic_vector(8 downto 0) := std_logic_vector(to_unsigned(500, 9)); + constant c_L2P_MAX_PAYLOAD : unsigned(10 downto 0) := to_unsigned(32, 11); -- in 32-bit words + constant c_ADDR_FIFO_FULL_THRES : integer := 500; + constant c_DATA_FIFO_FULL_THRES : integer := 500; ----------------------------------------------------------------------------- -- Signals declaration @@ -108,7 +110,7 @@ architecture behaviour of l2p_dma_master is signal dma_length_cnt : unsigned(29 downto 0); -- Sync FIFOs - signal fifo_rst : std_logic; + signal fifo_rst_n : std_logic; signal addr_fifo_rd : std_logic; signal addr_fifo_valid : std_logic; signal addr_fifo_empty : std_logic; @@ -158,11 +160,11 @@ begin ------------------------------------------------------------------------------ -- Creates an active high reset for fifos regardless of c_RST_ACTIVE value gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate - fifo_rst <= not(rst_n_i); + fifo_rst_n <= rst_n_i; end generate; gen_fifo_rst : if c_RST_ACTIVE = '1' generate - fifo_rst <= rst_n_i; + fifo_rst_n <= not(rst_n_i); end generate; ------------------------------------------------------------------------------ @@ -359,7 +361,7 @@ begin end if; else -- arbiter or GN4124 not ready to receive a new packet - ldm_arb_valid_o <= '0'; + ldm_arb_valid_o <= '0'; end if; when L2P_ADDR_H => @@ -486,37 +488,91 @@ begin ------------------------------------------------------------------------------ -- FIFOs for transition between GN4124 core and wishbone clock domain ------------------------------------------------------------------------------ - cmp_addr_fifo : fifo_32x512 + cmp_addr_fifo : generic_async_fifo + generic map ( + g_data_width => 32, + g_size => 512, + g_show_ahead => false, + g_with_rd_empty => true, + g_with_rd_full => false, + g_with_rd_almost_empty => false, + g_with_rd_almost_full => false, + g_with_rd_count => false, + g_with_wr_empty => false, + g_with_wr_full => false, + g_with_wr_almost_empty => false, + g_with_wr_almost_full => true, + g_with_wr_count => false, + g_almost_empty_threshold => 0, + g_almost_full_threshold => c_ADDR_FIFO_FULL_THRES) port map ( - rst => fifo_rst, - wr_clk => clk_i, - rd_clk => l2p_dma_clk_i, - din => addr_fifo_din, - wr_en => addr_fifo_wr, - rd_en => addr_fifo_rd, - prog_full_thresh_assert => c_ADDR_FIFO_FULL_THRES, - prog_full_thresh_negate => c_ADDR_FIFO_FULL_THRES, - dout => addr_fifo_dout, - full => open, - empty => addr_fifo_empty, - valid => addr_fifo_valid, - prog_full => addr_fifo_full); - - cmp_data_fifo : fifo_32x512 + rst_n_i => fifo_rst_n, + clk_wr_i => clk_i, + d_i => addr_fifo_din, + we_i => addr_fifo_wr, + wr_empty_o => open, + wr_full_o => open, + wr_almost_empty_o => open, + wr_almost_full_o => addr_fifo_full, + wr_count_o => open, + clk_rd_i => l2p_dma_clk_i, + q_o => addr_fifo_dout, + rd_i => addr_fifo_rd, + rd_empty_o => addr_fifo_empty, + rd_full_o => open, + rd_almost_empty_o => open, + rd_almost_full_o => open, + rd_count_o => open); + + p_gen_addr_fifo_valid : process(l2p_dma_clk_i) + begin + if rising_edge(l2p_dma_clk_i) then + addr_fifo_valid <= addr_fifo_rd and (not addr_fifo_empty); + end if; + end process; + + cmp_data_fifo : generic_async_fifo + generic map ( + g_data_width => 32, + g_size => 512, + g_show_ahead => false, + g_with_rd_empty => true, + g_with_rd_full => false, + g_with_rd_almost_empty => false, + g_with_rd_almost_full => false, + g_with_rd_count => false, + g_with_wr_empty => false, + g_with_wr_full => false, + g_with_wr_almost_empty => false, + g_with_wr_almost_full => true, + g_with_wr_count => false, + g_almost_empty_threshold => 0, + g_almost_full_threshold => c_DATA_FIFO_FULL_THRES) port map ( - rst => fifo_rst, - wr_clk => l2p_dma_clk_i, - rd_clk => clk_i, - din => data_fifo_din, - wr_en => data_fifo_wr, - rd_en => data_fifo_rd, - prog_full_thresh_assert => c_DATA_FIFO_FULL_THRES, - prog_full_thresh_negate => c_DATA_FIFO_FULL_THRES, - dout => data_fifo_dout, - full => open, - empty => data_fifo_empty, - valid => data_fifo_valid, - prog_full => data_fifo_full); + rst_n_i => fifo_rst_n, + clk_wr_i => l2p_dma_clk_i, + d_i => data_fifo_din, + we_i => data_fifo_wr, + wr_empty_o => open, + wr_full_o => open, + wr_almost_empty_o => open, + wr_almost_full_o => data_fifo_full, + wr_count_o => open, + clk_rd_i => clk_i, + q_o => data_fifo_dout, + rd_i => data_fifo_rd, + rd_empty_o => data_fifo_empty, + rd_full_o => open, + rd_almost_empty_o => open, + rd_almost_full_o => open, + rd_count_o => open); + + p_gen_data_fifo_valid : process(clk_i) + begin + if rising_edge(clk_i) then + data_fifo_valid <= data_fifo_rd and (not data_fifo_empty); + end if; + end process; data_fifo_din <= l2p_dma_dat_i; -- latch data when receiving ack and the cycle has been initiated by this master diff --git a/hdl/gn4124core/rtl/p2l_dma_master.vhd b/hdl/gn4124core/rtl/p2l_dma_master.vhd index bf0c0dce905742b06185e660f15fdcc8c8d0b680..ad50d14ad48553f823b32832c94fc76b92a56488 100644 --- a/hdl/gn4124core/rtl/p2l_dma_master.vhd +++ b/hdl/gn4124core/rtl/p2l_dma_master.vhd @@ -17,10 +17,11 @@ -- transfers from PCI express host to local application. -- This entity is also used to catch the next item in chained DMA. -- --- dependencies: +-- dependencies: general-cores library (genrams package) -- -------------------------------------------------------------------------------- --- last changes: see svn log +-- last changes: 11-07-2011 (mcattin) Replaced Xilinx Coregen FIFOs with genrams +-- library cores from ohwr.org -------------------------------------------------------------------------------- -- TODO: - byte enable support. -------------------------------------------------------------------------------- @@ -29,6 +30,7 @@ library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; use work.gn4124_core_pkg.all; +use work.genram_pkg.all; entity p2l_dma_master is @@ -123,8 +125,8 @@ architecture behaviour of p2l_dma_master is -- c_MAX_READ_REQ_SIZE is the maximum size (in 32-bit words) of the payload of a packet. -- Allowed c_MAX_READ_REQ_SIZE values are: 32, 64, 128, 256, 512, 1024. -- This constant must be set according to the GN4124 and motherboard chipset capabilities. - constant c_MAX_READ_REQ_SIZE : unsigned(10 downto 0) := to_unsigned(1024, 11); - constant c_TO_WB_FIFO_FULL_THRES : std_logic_vector(8 downto 0) := std_logic_vector(to_unsigned(500, 9)); + constant c_MAX_READ_REQ_SIZE : unsigned(10 downto 0) := to_unsigned(1024, 11); + constant c_TO_WB_FIFO_FULL_THRES : integer := 500; ----------------------------------------------------------------------------- -- Signals declaration @@ -151,7 +153,7 @@ architecture behaviour of p2l_dma_master is signal target_addr_cnt : unsigned(29 downto 0); -- sync fifo - signal fifo_rst : std_logic; + signal fifo_rst_n : std_logic; signal to_wb_fifo_empty : std_logic; signal to_wb_fifo_full : std_logic; @@ -182,11 +184,11 @@ begin ------------------------------------------------------------------------------ -- Creates an active high reset for fifos regardless of c_RST_ACTIVE value gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate - fifo_rst <= not(rst_n_i); + fifo_rst_n <= rst_n_i; end generate; gen_fifo_rst : if c_RST_ACTIVE = '1' generate - fifo_rst <= rst_n_i; + fifo_rst_n <= not(rst_n_i); end generate; -- Errors to DMA controller @@ -490,21 +492,48 @@ begin ------------------------------------------------------------------------------ -- FIFOs for transition between GN4124 core and wishbone clock domain ------------------------------------------------------------------------------ - cmp_to_wb_fifo : fifo_64x512 + cmp_to_wb_fifo : generic_async_fifo + generic map ( + g_data_width => 64, + g_size => 512, + g_show_ahead => false, + g_with_rd_empty => true, + g_with_rd_full => false, + g_with_rd_almost_empty => false, + g_with_rd_almost_full => false, + g_with_rd_count => false, + g_with_wr_empty => false, + g_with_wr_full => false, + g_with_wr_almost_empty => false, + g_with_wr_almost_full => true, + g_with_wr_count => false, + g_almost_empty_threshold => 0, + g_almost_full_threshold => c_TO_WB_FIFO_FULL_THRES) port map ( - rst => fifo_rst, - wr_clk => clk_i, - rd_clk => p2l_dma_clk_i, - din => to_wb_fifo_din, - wr_en => to_wb_fifo_wr, - rd_en => to_wb_fifo_rd, - prog_full_thresh_assert => c_TO_WB_FIFO_FULL_THRES, - prog_full_thresh_negate => c_TO_WB_FIFO_FULL_THRES, - dout => to_wb_fifo_dout, - full => open, - empty => to_wb_fifo_empty, - valid => to_wb_fifo_valid, - prog_full => to_wb_fifo_full); + rst_n_i => fifo_rst_n, + clk_wr_i => clk_i, + d_i => to_wb_fifo_din, + we_i => to_wb_fifo_wr, + wr_empty_o => open, + wr_full_o => open, + wr_almost_empty_o => open, + wr_almost_full_o => to_wb_fifo_full, + wr_count_o => open, + clk_rd_i => p2l_dma_clk_i, + q_o => to_wb_fifo_dout, + rd_i => to_wb_fifo_rd, + rd_empty_o => to_wb_fifo_empty, + rd_full_o => open, + rd_almost_empty_o => open, + rd_almost_full_o => open, + rd_count_o => open); + + p_gen_fifo_valid : process(p2l_dma_clk_i) + begin + if rising_edge(p2l_dma_clk_i) then + to_wb_fifo_valid <= to_wb_fifo_rd and (not to_wb_fifo_empty); + end if; + end process; -- pause transfer from GN4124 if fifo is (almost) full p2l_rdy_o <= not(to_wb_fifo_full); diff --git a/hdl/gn4124core/rtl/wbmaster32.vhd b/hdl/gn4124core/rtl/wbmaster32.vhd index 59ffc9ee94d1621ba0c4003e96205bc2ba0982ed..afe591c401e072ffe0e7d8f4a874ae08857bad7d 100644 --- a/hdl/gn4124core/rtl/wbmaster32.vhd +++ b/hdl/gn4124core/rtl/wbmaster32.vhd @@ -16,12 +16,14 @@ -- description: Provides a Wishbone interface for single read and write -- control and status registers -- --- dependencies: Xilinx FIFOs (fifo_32x512.xco, fifo_64x512.xco) +-- dependencies: general-cores library (genrams package) -- -------------------------------------------------------------------------------- -- last changes: 27-09-2010 (mcattin) Split wishbone and gn4124 clock domains -- All signals crossing the clock domains are now going through fifos. -- Dead times optimisation in packet generator. +-- 11-07-2011 (mcattin) Replaced Xilinx Coregen FIFOs with genrams +-- library cores from ohwr.org -------------------------------------------------------------------------------- -- TODO: - byte enable support. -------------------------------------------------------------------------------- @@ -30,6 +32,7 @@ library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; use work.gn4124_core_pkg.all; +use work.genram_pkg.all; entity wbmaster32 is @@ -102,15 +105,15 @@ architecture behaviour of wbmaster32 is ----------------------------------------------------------------------------- -- Constants declaration ----------------------------------------------------------------------------- - constant c_TO_WB_FIFO_FULL_THRES : std_logic_vector(8 downto 0) := std_logic_vector(to_unsigned(500, 9)); - constant c_FROM_WB_FIFO_FULL_THRES : std_logic_vector(8 downto 0) := std_logic_vector(to_unsigned(500, 9)); + constant c_TO_WB_FIFO_FULL_THRES : integer := 500; + constant c_FROM_WB_FIFO_FULL_THRES : integer := 500; ----------------------------------------------------------------------------- -- Signals declaration ----------------------------------------------------------------------------- -- Sync fifos - signal fifo_rst : std_logic; + signal fifo_rst_n : std_logic; signal to_wb_fifo_empty : std_logic; signal to_wb_fifo_full : std_logic; @@ -166,11 +169,11 @@ begin ------------------------------------------------------------------------------ -- Creates an active high reset for fifos regardless of c_RST_ACTIVE value gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate - fifo_rst <= not(rst_n_i); + fifo_rst_n <= rst_n_i; end generate; gen_fifo_rst : if c_RST_ACTIVE = '1' generate - fifo_rst <= rst_n_i; + fifo_rst_n <= not(rst_n_i); end generate; ------------------------------------------------------------------------------ @@ -299,42 +302,82 @@ begin ----------------------------------------------------------------------------- -- fifo for PCIe to WB transfer - cmp_fifo_to_wb : fifo_64x512 + cmp_fifo_to_wb : generic_async_fifo + generic map ( + g_data_width => 64, + g_size => 512, + g_show_ahead => false, + g_with_rd_empty => true, + g_with_rd_full => false, + g_with_rd_almost_empty => false, + g_with_rd_almost_full => false, + g_with_rd_count => false, + g_with_wr_empty => false, + g_with_wr_full => false, + g_with_wr_almost_empty => false, + g_with_wr_almost_full => true, + g_with_wr_count => false, + g_almost_empty_threshold => 0, + g_almost_full_threshold => c_TO_WB_FIFO_FULL_THRES) port map ( - rst => fifo_rst, - wr_clk => clk_i, - rd_clk => wb_clk_i, - din => to_wb_fifo_din, - wr_en => to_wb_fifo_wr, - rd_en => to_wb_fifo_rd, - prog_full_thresh_assert => c_TO_WB_FIFO_FULL_THRES, - prog_full_thresh_negate => c_TO_WB_FIFO_FULL_THRES, - dout => to_wb_fifo_dout, - full => open, - empty => to_wb_fifo_empty, - valid => open, - prog_full => to_wb_fifo_full); + rst_n_i => fifo_rst_n, + clk_wr_i => clk_i, + d_i => to_wb_fifo_din, + we_i => to_wb_fifo_wr, + wr_empty_o => open, + wr_full_o => open, + wr_almost_empty_o => open, + wr_almost_full_o => to_wb_fifo_full, + wr_count_o => open, + clk_rd_i => wb_clk_i, + q_o => to_wb_fifo_dout, + rd_i => to_wb_fifo_rd, + rd_empty_o => to_wb_fifo_empty, + rd_full_o => open, + rd_almost_empty_o => open, + rd_almost_full_o => open, + rd_count_o => open); to_wb_fifo_rw <= to_wb_fifo_dout(63); to_wb_fifo_addr <= to_wb_fifo_dout(62 downto 32); -- 31-bit to_wb_fifo_data <= to_wb_fifo_dout(31 downto 0); -- 32-bit -- fifo for WB to PCIe transfer - cmp_from_wb_fifo : fifo_32x512 + cmp_from_wb_fifo : generic_async_fifo + generic map ( + g_data_width => 32, + g_size => 512, + g_show_ahead => false, + g_with_rd_empty => true, + g_with_rd_full => false, + g_with_rd_almost_empty => false, + g_with_rd_almost_full => false, + g_with_rd_count => false, + g_with_wr_empty => false, + g_with_wr_full => false, + g_with_wr_almost_empty => false, + g_with_wr_almost_full => true, + g_with_wr_count => false, + g_almost_empty_threshold => 0, + g_almost_full_threshold => c_FROM_WB_FIFO_FULL_THRES) port map ( - rst => fifo_rst, - wr_clk => wb_clk_i, - rd_clk => clk_i, - din => from_wb_fifo_din, - wr_en => from_wb_fifo_wr, - rd_en => from_wb_fifo_rd, - prog_full_thresh_assert => c_FROM_WB_FIFO_FULL_THRES, - prog_full_thresh_negate => c_FROM_WB_FIFO_FULL_THRES, - dout => from_wb_fifo_dout, - full => open, - empty => from_wb_fifo_empty, - valid => open, - prog_full => from_wb_fifo_full); + rst_n_i => fifo_rst_n, + clk_wr_i => wb_clk_i, + d_i => from_wb_fifo_din, + we_i => from_wb_fifo_wr, + wr_empty_o => open, + wr_full_o => open, + wr_almost_empty_o => open, + wr_almost_full_o => from_wb_fifo_full, + wr_count_o => open, + clk_rd_i => clk_i, + q_o => from_wb_fifo_dout, + rd_i => from_wb_fifo_rd, + rd_empty_o => from_wb_fifo_empty, + rd_full_o => open, + rd_almost_empty_o => open, + rd_almost_full_o => open, + rd_count_o => open); ----------------------------------------------------------------------------- -- Wishbone master FSM