Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Symulacja układu zaimplementowanego w strukture

Prymulka 20 Lip 2008 20:07 4791 33
  • #31
    l_smolinski
    Poziom 10  
    J.A napisał:

    w przypadku tej drugiej zmiany musisz popatrzec, z czym i jak to jest
    polaczone, zeby nie doprowadzic do 'skrzyzowania' linii;


    Code:

    module user_logic
    (
      // -- ADD USER PORTS BELOW THIS LINE ---------------
      // --USER ports added here
      // -- ADD USER PORTS ABOVE THIS LINE ---------------

      // -- DO NOT EDIT BELOW THIS LINE ------------------
      // -- Bus protocol ports, do not add to or delete
      Bus2IP_Clk,                     // Bus to IP clock
      Bus2IP_Reset,                   // Bus to IP reset
      Bus2IP_Data,                    // Bus to IP data bus for user logic
      Bus2IP_BE,                      // Bus to IP byte enables for user logic
      Bus2IP_Burst,                   // Bus to IP burst-mode qualifier
      Bus2IP_RdCE,                    // Bus to IP read chip enable for user logic
      Bus2IP_WrCE,                    // Bus to IP write chip enable for user logic
      Bus2IP_RdReq,                   // Bus to IP read request
      Bus2IP_WrReq,                   // Bus to IP write request
      IP2Bus_Data,                    // IP to Bus data bus for user logic
      IP2Bus_Retry,                   // IP to Bus retry response
      IP2Bus_Error,                   // IP to Bus error response
      IP2Bus_ToutSup,                 // IP to Bus timeout suppress
      IP2Bus_AddrAck,                 // IP to Bus address acknowledgement
      IP2Bus_Busy,                    // IP to Bus busy response
      IP2Bus_RdAck,                   // IP to Bus read transfer acknowledgement
      IP2Bus_WrAck                    // IP to Bus write transfer acknowledgement
      // -- DO NOT EDIT ABOVE THIS LINE ------------------
    ); // user_logic

    // -- ADD USER PARAMETERS BELOW THIS LINE ------------
    // --USER parameters added here
    // -- ADD USER PARAMETERS ABOVE THIS LINE ------------

    // -- DO NOT EDIT BELOW THIS LINE --------------------
    // -- Bus protocol parameters, do not add to or delete
    parameter C_DWIDTH                       = 64;
    parameter C_NUM_CE                       = 4;
    // -- DO NOT EDIT ABOVE THIS LINE --------------------

    // -- ADD USER PORTS BELOW THIS LINE -----------------
    // --USER ports added here
    // -- ADD USER PORTS ABOVE THIS LINE -----------------

    // -- DO NOT EDIT BELOW THIS LINE --------------------
    // -- Bus protocol ports, do not add to or delete
    input                                     Bus2IP_Clk;
    input                                     Bus2IP_Reset;
    input      [0 : C_DWIDTH-1]               Bus2IP_Data;
    input      [0 : C_DWIDTH/8-1]             Bus2IP_BE;
    input                                     Bus2IP_Burst;
    input      [0 : C_NUM_CE-1]               Bus2IP_RdCE;
    input      [0 : C_NUM_CE-1]               Bus2IP_WrCE;
    input                                     Bus2IP_RdReq;
    input                                     Bus2IP_WrReq;
    output     [0 : C_DWIDTH-1]               IP2Bus_Data;
    output                                    IP2Bus_Retry;
    output                                    IP2Bus_Error;
    output                                    IP2Bus_ToutSup;
    output                                    IP2Bus_AddrAck;
    output                                    IP2Bus_Busy;
    output                                    IP2Bus_RdAck;
    output                                    IP2Bus_WrAck;
    // -- DO NOT EDIT ABOVE THIS LINE --------------------

    //----------------------------------------------------------------------------
    // Implementation
    //----------------------------------------------------------------------------

      // --USER nets declarations added here, as needed for user logic

      // Nets for user logic slave model s/w accessible register example
      reg        [0 : C_DWIDTH-1]               slv_reg0;
      reg        [0 : C_DWIDTH-1]               slv_reg1;
      reg        [0 : C_DWIDTH-1]               slv_reg2;
      reg        [0 : C_DWIDTH-1]               slv_reg3;
      wire       [0 : 3]                        slv_reg_write_select;
      wire       [0 : 3]                        slv_reg_read_select;
      reg        [0 : C_DWIDTH-1]               slv_ip2bus_data;
      wire                                      slv_read_ack;
      wire                                      slv_write_ack;
      integer                                   byte_index, bit_index;

      // --USER logic implementation added here

      // ------------------------------------------------------
      // Example code to read/write user logic slave model s/w accessible registers
      //
      // Note:
      // The example code presented here is to show you one way of reading/writing
      // software accessible registers implemented in the user logic slave model.
      // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
      // to one software accessible register by the top level template. For example,
      // if you have four 32 bit software accessible registers in the user logic, you
      // are basically operating on the following memory mapped registers:
      //
      //    Bus2IP_WrCE or   Memory Mapped
      //       Bus2IP_RdCE   Register
      //            "1000"   C_BASEADDR + 0x0
      //            "0100"   C_BASEADDR + 0x4
      //            "0010"   C_BASEADDR + 0x8
      //            "0001"   C_BASEADDR + 0xC
      //
      // ------------------------------------------------------
     
      assign
        slv_reg_write_select = Bus2IP_WrCE[0:3],
        slv_reg_read_select  = Bus2IP_RdCE[0:3],
        slv_write_ack        = Bus2IP_WrCE[0] || Bus2IP_WrCE[1] || Bus2IP_WrCE[2] || Bus2IP_WrCE[3],
        slv_read_ack         = Bus2IP_RdCE[0] || Bus2IP_RdCE[1] || Bus2IP_RdCE[2] || Bus2IP_RdCE[3];

      // implement slave model register(s)
      always @( posedge Bus2IP_Clk )
        begin: SLAVE_REG_WRITE_PROC

          if ( Bus2IP_Reset == 1 )
            begin
              slv_reg0 <= 0;
              slv_reg1 <= 0;
              slv_reg2 <= 0;
              slv_reg3 <= 0;
            end
          else
            case ( slv_reg_write_select )
              4'b1000 :
                for ( byte_index = 0; byte_index <= (C_DWIDTH/8)-1; byte_index = byte_index+1 )
                  if ( Bus2IP_BE[byte_index] == 1 )
                    for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
                      slv_reg0[bit_index] <= Bus2IP_Data[bit_index];
              4'b0100 :
                for ( byte_index = 0; byte_index <= (C_DWIDTH/8)-1; byte_index = byte_index+1 )
                  if ( Bus2IP_BE[byte_index] == 1 )
                    for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
                      slv_reg1[bit_index] <= Bus2IP_Data[bit_index];
              4'b0010 :
                for ( byte_index = 0; byte_index <= (C_DWIDTH/8)-1; byte_index = byte_index+1 )
                  if ( Bus2IP_BE[byte_index] == 1 )
                    for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
                      slv_reg2[bit_index] <= Bus2IP_Data[bit_index];
              4'b0001 :
                for ( byte_index = 0; byte_index <= (C_DWIDTH/8)-1; byte_index = byte_index+1 )
                  if ( Bus2IP_BE[byte_index] == 1 )
                    for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
                      slv_reg3[bit_index] <= Bus2IP_Data[bit_index];
              default : ;
            endcase

        end // SLAVE_REG_WRITE_PROC

      // implement slave model register read mux
      always @( slv_reg_read_select or slv_reg0 or slv_reg1 or slv_reg2 or slv_reg3 )
        begin: SLAVE_REG_READ_PROC

          case ( slv_reg_read_select )
            4'b1000 : slv_ip2bus_data <= slv_reg0;
            4'b0100 : slv_ip2bus_data <= slv_reg1;
            4'b0010 : slv_ip2bus_data <= slv_reg2;
            4'b0001 : slv_ip2bus_data <= slv_reg3;
            default : slv_ip2bus_data <= 0;
          endcase

        end // SLAVE_REG_READ_PROC

      // ------------------------------------------------------------
      // Example code to drive IP to Bus signals
      // ------------------------------------------------------------

      assign IP2Bus_Data        = slv_ip2bus_data;
      assign IP2Bus_WrAck       = slv_write_ack;
      assign IP2Bus_RdAck       = slv_read_ack;
      assign IP2Bus_AddrAck     = slv_write_ack || slv_read_ack;
      assign IP2Bus_Busy        = 0;
      assign IP2Bus_Error       = 0;
      assign IP2Bus_Retry       = 0;
      assign IP2Bus_ToutSup     = 0;

    endmodule




    Wydaj sie ze nie mogę od tak sobie zamienić numeracji tych rejestrów... musiał bym te for-y przerobic jeszcze. Dodam ze srodowisko edk generuje mi odrazu sterowniki dla procesora power pc laczacego sie za pomoca magistrali plb z modulem. Jak bede kombinowal z tym co zostalo wygenerowane to jeszcze sterowniki sam bede musial napisac...Chyba nie bede nic tam ruszal.


    Z innej beczki: prubuje rozdzielić projekt na domeny zegarowe, czy ktos mogl by mi wyjasnic czy mi sie to udalo. Powinienem miec teraz dwa zegary 100 Mhz i 25 Mhz.

    Martwi mnie ta informacja:

    Code:

    Number of Timing Constraints that were not applied: 1



    Code:


    **************************
    Generating Clock Report
    **************************

    +---------------------+--------------+------+------+------------+-------------+
    |        Clock Net    |   Resource   |Locked|Fanout|Net Skew(ns)|Max Delay(ns)|
    +---------------------+--------------+------+------+------------+-------------+
    |dsocm_porta_BRAM_Clk |              |      |      |            |             |
    |                     |     BUFGMUX0P| No   | 1128 |  0.273     |  1.250      |
    +---------------------+--------------+------+------+------------+-------------+
    |          proc_clk_s |     BUFGMUX1S| No   |    2 |  0.000     |  1.132      |
    +---------------------+--------------+------+------+------------+-------------+
    |jtagppc_0_0_JTGC405T |              |      |      |            |             |
    |                  CK |         Local|      |    2 |  1.792     |  4.548      |
    +---------------------+--------------+------+------+------------+-------------+

    * Net Skew is the difference between the minimum and maximum routing
    only delays for the net. Note this is different from Clock Skew which
    is reported in TRCE timing report. Clock Skew is the difference between
    the minimum and maximum path delays which includes logic delays.

    Timing Score: 0


    Number of Timing Constraints that were not applied: 1

    Asterisk (*) preceding a constraint indicates it was not met.
       This may be due to a setup or hold violation.

    -----------------------------------------------------------------------------------------
      Constraint                                | Requested  | Actual     | Logic  | Absolute|
                                                |            |            | Levels | Slack   |
    -----------------------------------------------------------------------------------------
      TS_dcm_0_dcm_0_CLK0_BUF = PERIOD TIMEGRP  | 10.000ns   | 2.628ns    | 0      | 7.372ns |
      "dcm_0_dcm_0_CLK0_BUF" TS_sys_clk_pin     |            |            |        |         |
           HIGH 50%                             |            |            |        |         |
    -----------------------------------------------------------------------------------------
      TS_dcm_0_dcm_0_CLKDV_BUF = PERIOD TIMEGRP | 40.000ns   | 21.545ns   | 4      | 18.455ns|
       "dcm_0_dcm_0_CLKDV_BUF"         TS_sys_c |            |            |        |         |
      lk_pin * 4 HIGH 50%                       |            |            |        |         |
    -----------------------------------------------------------------------------------------
      TS_sys_clk_pin = PERIOD TIMEGRP "sys_clk_ | N/A        | N/A        | N/A    | N/A     |
      pin" 10 ns HIGH 50%                       |            |            |        |         |
    -----------------------------------------------------------------------------------------
      PATH "TS_RST1_path" TIG                   | N/A        | 3.366ns    | 1      | N/A     |
    ------------------------------------------------------------------------------------------


    All constraints were met.
    INFO:Timing:2761 - N/A entries in the Constraints list may indicate that the
       constraint does not cover any paths or that it has no requested value.


    Generating Pad Report.


    All signals are completely routed.

    Total REAL time to PAR completion: 4 mins 17 secs
    Total CPU time to PAR completion: 3 mins 49 secs

    Peak Memory Usage:  260 MB

    Placement: Completed - No errors found.
    Routing: Completed - No errors found.
    Timing: Completed - No errors found.

    Number of error messages: 0
    Number of warning messages: 1
    Number of info messages: 0


    Writing design to file system.ncd




    PAR done!


    "wrapper" - spotkalem sie juz z tak nazwanymi modulami, prosil bym o szersze wyjasnienie co sie dzieje w modulach z tym przyrostkiem??


    Dzeki za odpowiedzi jestescie bardzo pomocni, pozdrawiam.
  • #32
    rgasiore
    Poziom 1  
    Prymulka napisał:
    Witam

    Mam zrobiony pewien projekt na Virtex II. Generalnie jest już skończony, symulacja funkcjonalna ok. Chciałbym jeszcze zasymulować jego działanie jak się zachowa po zaimplementowaniu w strukture (gdyż będę korzystał z częstotliwości około 100 MHz). Nie wiem w jaki sposób to zrobić, czy ewentualnie jakiego programu/opcji w ISE użyć. Będę wdzięczny za pomoc.

    Pozdrawiam

    z tego co sie orientuje to narzedzia powinny miec opcje generowania plikow SDF obok net listy.. . inne narzedzia np. Active Vhdl potrafia przeprowadzic symulacje z uwzglednienime pliku SFD w ktorym to sa opisane wszlekie teoretyczne opoznienia jakie moga wystapic w rzeczywistym ukladzie. W testbenchu ustawia sie odpowiednie timescale (Verilog) i jedziemy... more info mail me
  • #33
    J.A
    Poziom 28  
    l_smolinski napisał:
    Wydaje sie ze nie mogę od tak sobie zamienić numeracji tych rejestrów

    no rzeczywiscie, raczej nie;
    odpowiadajac mialem przed oczami to, co generuje tzw. megawizard
    altery zapomnialem, ze Ty pracujesz z xilinxem;
    a ten megawizard produkuje wlasnie wrapper dookola makra altery;
    a wrapper to 'otoczka' dookola jakiegos gotowego modulu, ktora
    laczy go z zewnetrznym swiatem, w Twoim wypadku mogloby to wygladac
    jakos tak [wrapper dookola licznika]:
    Code:


    module wrapper
    (
       input        clk,
       input        load, sel,
       input  [7:0] data1,data2,
       output [7:0] q
    ); 

    wire [0:7] data = sel ? data1: data2;

    cnt cnt_i
    (
      .clk(clk),       
      .load(load),
      .data_in(data), 
      .q(q)
    );
    endmodule

    module cnt
    (
      input            clk, load,
      input      [0:7] data_in,
      output reg [0:7] q
    );

    always @(posedge clk)
      if (load)  q <= data_in;
      else       q <= q + 1;
     
    endmodule


    i na koniec timing contrain, nie mam wprawy w rozumieniu
    komunikatow xilinxa, wiec moge sie mylic, ale wyglada
    na to, ze jeden w warunkow zapisales tak, ze narzedzie
    go nie rozumie/nie moze zastosowac - stad wiadomosc
    'not applied', a pozniej troche mylacy komunikat, ze
    jedno z wymagan nie zostalo osiagniete [bo w ogole nie
    zastosowane]

    J.A
  • #34
    griva
    Poziom 17  
    Code:
    TS_sys_clk_pin = PERIOD TIMEGRP "sys_clk_ | N/A        | N/A        | N/A    | N/A     |
    
      pin" 10 ns HIGH 50%                       |            |            |        |         |
    -----------------------------------------------------------------------------------------
      PATH "TS_RST1_path" TIG     



    to oznacza ze Ty albo EDK nie sprecyzowales jaki timing ma byc na tej linii, jaka czestotliwosc, mozliwe ze jest to dodane automatycznie przez EDK do jakiegos modulu debugowego/debuggera

    stworz timingowa grupe w pliku ucf i wszystko powinno byc ok