Forum Discussion

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

Address Exception

Hi

We are using a SRAM that has a 16-bit wide data bus and /BLE and /BHE signals for byte-write.

Writing bytes to addresses 0 to 7 works, with BLE and BHE behaving as expected, although A0 is always at logic 0 (so presumably we must connect A1..A18 to the SRAM).

Writing words to addresses 0 to 3 is fine when the addresses are even. When the addresses are odd, though, writing $55AA to the SRAM causes 2 write cycles to consecutive addresses, BUT $55AA is presented on the data bus throughout. So writing $55AA to address 1 causes the bytes $AA,$55,$AA,$55 to appear from addresses 0 to 3, which is clearly wrong. No BLE or BHE activity appears.

This reminds me very much of my 68000 days. Is there an address exception? If so this kind of "misbehaviour" could be OK if an exception is raised.

The PTF file contents are below (note we're using the "dynamic bus sizing[memory]" option):

##  This class.ptf file built by Component Editor#  2005.06.23.15:36:32# #  DO NOT MODIFY THIS FILE#  If you hand-modify this file you will likely#  interfere with Component Editor's ability to#  read and edit it. And then Component Editor#  will overwrite your changes anyway. So, for#  the very best results, just relax and#  DO NOT MODIFY THIS FILE# 
CLASS is61lv256
{
  ASSOCIATED_FILES 
  {
    Add_Program = "the_wizard_ui";
    Edit_Program = "the_wizard_ui";
    Generator_Program = "cb_generator.pl";
  }
  MODULE_DEFAULTS 
  {
    class = "is61lv256";
    class_version = "2.0";
    SYSTEM_BUILDER_INFO 
    {
      Instantiate_In_System_Module = "0";
      Is_Enabled = "1";
      Date_Modified = "--unknown--";
      Top_Level_Ports_Are_Enumerated = "1";
    }
    WIZARD_SCRIPT_ARGUMENTS 
    {
    }
    SIMULATION 
    {
      DISPLAY 
      {
      }
    }
    COMPONENT_BUILDER 
    {
      GLS_SETTINGS 
      {
      }
    }
    PORT_WIRING 
    {
    }
    SLAVE avalonS
    {
      SYSTEM_BUILDER_INFO 
      {
        Bus_Type = "avalon_tristate";
        Address_Width = "18";
        Address_Alignment = "dynamic";
        Data_Width = "16";
        Has_Base_Address = "1";
        Has_IRQ = "0";
        Setup_Time = "10ns";
        Hold_Time = "10ns";
        Read_Wait_States = "20ns";
        Write_Wait_States = "20ns";
        Read_Latency = "0";
        Maximum_Pending_Read_Transactions = "0";
        Is_Printable_Device = "0";
        Is_Memory_Device = "1";
        Is_Readable = "1";
        Is_Writable = "1";
        Minimum_Uninterrupted_Run_Length = "1";
      }
      COMPONENT_BUILDER 
      {
        ATS_SETTINGS 
        {
          Setup_Value = "10";
          Read_Wait_Value = "20";
          Write_Wait_Value = "20";
          Hold_Value = "10";
          Timing_Units = "ns";
          Read_Latency_Value = "0";
          Max_Pending_Read_Transactions_Value = "1";
          Address_Alignment = "dynamic";
          Is_Printable_Device = "0";
          interface_name = "Avalon Tristate Slave";
          Minimum_Arbitration_Shares = "1";
          external_wait = "0";
          Is_Memory_Device = "1";
        }
      }
      PORT_WIRING 
      {
        PORT Adds
        {
          width = "18";
          width_expression = "";
          direction = "input";
          type = "address";
          is_shared = "1";
        }
        PORT Data
        {
          width = "16";
          width_expression = "";
          direction = "inout";
          type = "data";
          is_shared = "1";
        }
        PORT WE_N
        {
          width = "1";
          width_expression = "";
          direction = "input";
          type = "write_n";
          is_shared = "0";
        }
        PORT OE_N
        {
          width = "1";
          width_expression = "";
          direction = "input";
          type = "read_n";
          is_shared = "0";
        }
        PORT SRAM_CE_N
        {
          width = "1";
          width_expression = "";
          direction = "input";
          type = "chipselect_n";
          is_shared = "0";
        }
        PORT avalon_clk
        {
          width = "1";
          width_expression = "";
          direction = "input";
          type = "clk";
          is_shared = "0";
        }
        PORT BE
        {
          width = "2";
          width_expression = "";
          direction = "input";
          type = "byteenable_n";
          is_shared = "1";
        }
      }
    }
  }
  USER_INTERFACE 
  {
    USER_LABELS 
    {
      name = "IS61LV256";
      technology = "User Logic";
    }
    WIZARD_UI the_wizard_ui
    {
      title = "IS61LV256 - {{ $MOD }}";
      CONTEXT 
      {
        H = "WIZARD_SCRIPT_ARGUMENTS/hdl_parameters";
        M = "";
        SBI_ = "SYSTEM_BUILDER_INFO";
        SBI_avalonS = "SLAVE avalonS/SYSTEM_BUILDER_INFO";
      }
      PAGES main
      {
        PAGE 1
        {
          align = "left";
          title = "IS61LV256 2.0 Settings";
          layout = "vertical";
          TEXT 
          {
            title = "Built on: 2005.06.23.15:36:32";
          }
          TEXT 
          {
            title = "Class name: is61lv256";
          }
          TEXT 
          {
            title = "Class version: 2.0";
          }
          TEXT 
          {
            title = "Component name: IS61LV256";
          }
          TEXT 
          {
            title = "Component Group: User Logic";
          }
        }
      }
    }
  }
  DEFAULT_GENERATOR 
  {
    top_module_name = "";
    black_box = "1";
    vhdl_synthesis_files = "";
    verilog_synthesis_files = "";
    black_box_files = "";
  }
  COMPONENT_BUILDER 
  {
    CACHED_HDL_INFO 
    {
     #  cached hdl info, emitted by cbGuinevereApp.CBFrameRealtime.getDocumentCachedHDLInfoSection:123
     #  used only by Component Builder
    }
    HDL_PARAMETERS 
    {
     #  generated by cbDocument.CBDocument.getParameterContainer:385
     #  used only by Component Editor
    }
    SW_FILES 
    {
    }
    built_on = "2005.06.23.15:36:32";
  }
  CB_GENERATOR 
  {
    HDL_FILES 
    {
    }
    top_module_name = "";
    emit_system_h = "0";
  }
  SOPC_Builder_Version = "5.00";
}

4 Replies

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

    is your wiring correct ?

    i use ISSI IS61LV25616AL 256k x 16

    wiring: NIOS [A18..A1] -> SRAM [A17..A0]

    userlogic is setup as following:

    Bus Interface Type: Avalon Memory Slave

    PORT NAME | Width | Direction | Shared | Type

    address | 18 | input | yes | address

    write_n | 1 | input | yes | write_n

    read_n | 1 | input | yes | read_n

    writedata | 16 | inout | yes | data

    chipselect_n | 1 | input | --- | chipselect_n

    be_n | 2 | input | yes | byteenable_n

    system clock frequency is 50 Mhz

    i use 1 setup, 1 wait, 1 wait cycle
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Hi Jason,

    > Writing words to addresses 0 to 3 is fine when the addresses are even. When the

    > addresses are odd, though,

    ...

    Don't do this -- writing a halfword to an odd address results in and undefined

    operation. Take a look at the instruction set for details.

    > Is there an address exception?

    No.

    Regards,

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

    Could I make this (addition of Address Exception) a formal change request to Altera, please?

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

    Hi Jason,

    > a formal change request to Altera

    You should probably do this at the Altera website.

    Regards,

    --Scott