LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Sponsors
  • Mirrors
  • Logos
  • Contact us
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Overview :: News :: Downloads :: Tracker    

    UART 16550 core: Tracker : wishbone SEL_I problem

    Monitor this item

    You will be notified via email when status of this item is changed or if somebody adds a comment.

    Your email

      wishbone SEL_I problem

    Type BUG
    Status CLOSED
    Top
    I am using the UART core in 32-bit configuration (BIG ENDIAN).
    The UART does not respond correctly to the SEL_I signal.

    The simplest case to exhibit the problem is as follows (all wishbone transactions):

    reset UART
    read from Receive buffer \w SEL_I = 4'b0001
    wb_adr_i = 32'h00000000

    I expect wb_dat_o[7:0] = 8'hxx
    but get wb_dat_o[7:0] = 8'h00

    But if I set
    SEL_I = 4'b1000
    wb_dat_o[31:24] =8'hxx
    as expected.

    for the case SEL_I = 4'b0001
    wb_interface sends
    wb_adr_int = 8'h03
    to regs

    The following code will not select the correct output

    // Asynchronous reading here because the outputs are sampled in uart_wb.v file
    always @(dl or dlab or ier or iir or scratch
    or lcr or lsr or msr or rf_data_out or wb_addr_i or wb_re_i) // asynchrounous reading
    begin
    case (wb_addr_i)
    `UART_REG_RB : wb_dat_o = dlab ? dl[`UART_DL1] : rf_data_out[10:3];
    `UART_REG_IE : wb_dat_o = dlab ? dl[`UART_DL2] : ier;
    `UART_REG_II : wb_dat_o = {4'b1100,iir};
    `UART_REG_LC : wb_dat_o = lcr;
    `UART_REG_LS : wb_dat_o = lsr;
    `UART_REG_MS : wb_dat_o = msr;
    `UART_REG_SR : wb_dat_o = scratch;
    default: wb_dat_o = 8'b0; // ??
    endcase // case(wb_addr_i)
    end // always @ (dl or dlab or ier or iir or scratch...


    I would expect

    `UART_REG_RB : wb_dat_o = dlab ? dl[`UART_DL1] : rf_data_out[10:3];

    to execute but since wb_addr_i = 8'h03 it will not execute.


    Answer:
    First of all let me tell you, that the UART16550 is used in 32-bit BIGENDIAN mode
    in our system and it works without any problems.
    Now let's go to the problem. You didn't understand the functionality of the UART16650 core.
    If you make a 32-bit big_endian read to the address 0x0 and use select = 0x1, this means that
    you're reading from the address 0x3 (on the 8-bit bus).

    So the address wb_adr_i = 0x0 + wb_sel_i = 0x1 is changed to address wb_adr_int = 0x3,
    which is used for reading the data from the registers.

    If you have further problems, contact me directly at igor.mohor@g...

    Best regards,
    Igor

     
    Stats

    Nobody is monitoring this item

    Progress
     
    Submited date 21-Dec-2004
    Submited by luke.darnell@g...
     
    Assigned date
    Assigned to
     
    Closed date 22-Dec-2004
    Closed by Igor Mohor

    Top

    Comments

    No comments yet..

    Add your comment

    Your email:

    Retype key:
    Top

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.