Nios® V/II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® V/II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++

Address Exception

Altera_Forum
Honored Contributor II
1,464 Views

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"; }
0 Kudos
4 Replies
Altera_Forum
Honored Contributor II
245 Views

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
0 Kudos
Altera_Forum
Honored Contributor II
245 Views

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
0 Kudos
Altera_Forum
Honored Contributor II
245 Views

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

0 Kudos
Altera_Forum
Honored Contributor II
245 Views

Hi Jason, 

 

> a formal change request to Altera 

 

You should probably do this at the Altera website. 

 

Regards, 

--Scott
0 Kudos
Reply