Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
14 years ago

Multiplexing bidirectionnal busses

Hi,

I'm working on a project where i need to write some datas directly into ddr via altmemphy controller and to access these datas through Nios.

My problem is that I don't know how to multiplex dq and dqs signals which are bidirectionnal.

I tried to do this as shown in joined picture but i still have an error at compilation :

Error: The bidir pin "ddr_dq[15]" is fed by multiple output buffers

Here is how I wrote the mux :


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
ENTITY mux IS
PORT(
    mux_select    : in std_logic;
    a_ddr_addr    : in std_logic_vector(12 downto 0);
    a_ddr_ba      : in std_logic_vector(1 downto 0);
    a_ddr_cas_n   : in std_logic;
    a_ddr_cke     : in std_logic;
   
    a_ddr_cs_n    : in std_logic;
    a_ddr_dm      : in std_logic_vector(1 downto 0);
    
    a_ddr_ras_n   : in std_logic;
    a_ddr_we_n    : in std_logic;
    b_ddr_addr    : in std_logic_vector(12 downto 0);
    b_ddr_ba      : in std_logic_vector(1 downto 0);
    b_ddr_cas_n   : in std_logic;
    b_ddr_cke     : in std_logic;
    
    b_ddr_cs_n    : in std_logic;
    b_ddr_dm      : in std_logic_vector(1 downto 0);
   
    b_ddr_ras_n   : in std_logic;
    b_ddr_we_n    : in std_logic;
    
    ddr_addr_out  : out std_logic_vector(12 downto 0);
    ddr_ba_out    : out std_logic_vector(1 downto 0);
    ddr_cas_n_out : out std_logic;
    ddr_cke_out   : out std_logic;
    ddr_clk_n_out : out std_logic;
    ddr_clk_out   : out std_logic;
    ddr_cs_n_out  : out std_logic;
    ddr_dm_out    : out std_logic_vector(1 downto 0);
    ddr_dq_out    : out std_logic_vector(15 downto 0);
    ddr_dqs_out   : out std_logic_vector(1 downto 0);
    ddr_ras_n_out : out std_logic;
    ddr_we_n_out  : out std_logic;
    
    a_ddr_clk_n   : in std_logic;
    a_ddr_clk     : in std_logic;
    b_ddr_clk_n   : in std_logic;
    b_ddr_clk     : in std_logic;
    a_ddr_dq      : in std_logic_vector(15 downto 0);
    a_ddr_dqs     : in std_logic_vector(1 downto 0);
    b_ddr_dq      : in std_logic_vector(15 downto 0);
    b_ddr_dqs     : in std_logic_vector(1 downto 0)
    
    
    );
END ENTITY;
ARCHITECTURE A_mux OF mux IS
BEGIN
ddr_addr_out    <= a_ddr_addr   when (mux_select='1') else b_ddr_addr;
ddr_ba_out      <= a_ddr_ba     when (mux_select='1') else b_ddr_ba;
ddr_cas_n_out   <= a_ddr_cas_n  when (mux_select='1') else b_ddr_cas_n;
ddr_cke_out     <= a_ddr_cke    when (mux_select='1') else b_ddr_cke; 
ddr_clk_n_out   <= a_ddr_clk_n  when (mux_select='1') else b_ddr_clk_n;
ddr_clk_out     <= a_ddr_clk    when (mux_select='1') else b_ddr_clk;  
ddr_cs_n_out    <= a_ddr_cs_n   when (mux_select='1') else b_ddr_cs_n; 
ddr_dm_out      <= a_ddr_dm     when (mux_select='1') else b_ddr_dm;   
ddr_dq_out      <= a_ddr_dq     when (mux_select='1') else b_ddr_dq;   
ddr_dqs_out     <= a_ddr_dqs    when (mux_select='1') else b_ddr_dqs;  
ddr_ras_n_out   <= a_ddr_ras_n  when (mux_select='1') else b_ddr_ras_n;
ddr_we_n_out    <= a_ddr_we_n   when (mux_select='1') else b_ddr_we_n; 
END ARCHITECTURE;
Any idea to solve this problem ?

Thanks

Julien

3 Replies

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    It's not possible to place a multiplexer between the DDR RAM and altmemphy.

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    I write video datas into ddr memory to have the fastest bandwitch possible.

    But I also need to write some datas over the video (date, clock, inlaying text ...). That's why using a Nios algorithm was better for this part.

    So my question is : Do I have to do all of these by using only NIOS or without using Nios at all ?
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Create a component with an Avalon master to access the RAM and integrate it in the SOPC project instead.

    It will be easier to write than a DDR SDRAM controller, and it will make your component independent from the RAM technology it is accessing.