Jump to content

    

Recommended Posts

однажды стертый блок (состояние все "FF") можно сколь угодно записывать информацией до состояния (состояние все "00") (Пример: было после стирания FF, записали первый раз 0x0f, и можно потом записать 0x00, апосля только стирание ). время стирания всего блока обычно равно времени полного программирования оного (точное время зависит от расположения звёзд).

ПС: и запись не 1.2 микро а милисекунды.

Edited by Alex77

Share this post


Link to post
Share on other sites
21 hours ago, Alex77 said:

ПС: и запись не 1.2 микро а милисекунды.

 

Да, опечатался

Про объяснение понял, но как воспользоваться этим - не понятно - я же не храню информацию о том что после стирания (выставили 0xFF) я записал 0x0F, а следовательно могу записать 0x0A например. Но спасибо за информацию, я этого не знал. Я экспериментировал с указанным кодом и если выставить стирание не 256кбайт, а 1024, то пишет он все равно первые 256, а дальше зависает. Но скорее всего это опять моя невнимательность и где-то допущена ошибка. Хотя мне хватает режима стирания 256 и его записи.

Share this post


Link to post
Share on other sites

процесс программирования это есть запись 0 на позицию 1. те каждый байт можно "шить" до восьми раз. как стирается именно эта микросхема я не знаю. аналогичные стираются только блоками по 64-256кб за раз или вся микросхема. процесс программирования обычно это запись во внутренний буфер микросхемы (256-512 байт) с последующим программированием соответствующих ячеек памяти.

Share this post


Link to post
Share on other sites
Quote

можно сколь угодно записывать информацией до состояния (состояние все "00")

Теперь буду знать, почему я не могу перезаписать байты в своей epcq256, спасибо.

Share this post


Link to post
Share on other sites
On 4/17/2019 at 6:25 PM, Lutovid said:

Я понимаю, что скорость не будет высокой, но через джтаг пишется-то прошива во флеш быстрее, а учитывая что я хочу записывать 32 мегабайта - я поседею, пока это все писаться будет.

чисто ради интереса. Я свою epcq256 (32 мегабайта тоже) стираю полностью ровно по даташиду ~240сек. А пишу в нее через pcie. Выходит чуть быстрее, чем через jtag. Процесс стирания не подконтрольный, там никак не ускорить. Где то и выходит на круг все 4.5мин

Edited by new123

Share this post


Link to post
Share on other sites

Всем спасибо, запись заработала нормально!

Правда есть еще 1 вопрос.

Решил попробоватьь сконфигурировать флешку с двумя прошивами. Настройки выставил следующие:

image.png.b37c614d46e3f30ed5bc18fc13f0b10b.png

Размеры прошив 12.3 МБ и 29.7 МБ соответственно.

то есть во флешке по адресу 0x1080000 (c учетом удвоения адреса) будет лежать вторая прошива - это в хексредакторе я и наблюдал.

Общий размер итоговой прошивы 47МБ

Флешка 128МБ так что все вроде бы ок.

Но в результате заливки через джтаг если делать верификацию - она фэйлится:

image.png.233200fa1acdfb862c1dc7c4d9cfdafa.png

Performing Erase Operation...
Erase Operation successful.
Performing Program and Verify Operations...
Program/Verify Operation failed.
Byte 16777216 does not match (FF != 20)
ERROR: [Labtools 27-3144] Invalid option: Byte 16777216 does not match (FF != 20)
program_hw_cfgmem: Time (s): cpu = 00:00:16 ; elapsed = 00:06:06 . Memory (MB): peak = 7032.930 ; gain = 0.000 ; free physical = 13965 ; free virtual = 55011
ERROR: [Common 17-39] 'program_hw_cfgmem' failed due to earlier errors.

В чем может быть проблема? Подскажите пожалуйста

Share this post


Link to post
Share on other sites
1 hour ago, Lutovid said:

В чем может быть проблема? Подскажите пожалуйста

Посмотрите в мануале на плату особенности подключения линий A24 и A25 флеш.

Share this post


Link to post
Share on other sites
15 hours ago, aaarrr said:

Посмотрите в мануале на плату особенности подключения линий A24 и A25 флеш.

Извините за мою непонятливость, я уже читал про них в мануале. Написано:

Multiple bitstreams can be stored in the linear BPI flash memory. The two most significant
address bits (A25, A24) of the flash memory are connected to DIP switch SW16 positions 1
and 2, respectively, and to the bank 65 RS1 and RS0 pins of the FPGA. By placing valid
bitstreams at different offset addresses in the flash memory, various bitstreams can be
selected to configure the FPGA by appropriately setting the DIP switch SW16.

Я не хочу переключать свичами адрес старта, я хочу запустить вторую прошивку через hwicap по адресу, который задам. Поэтому я выставил свич в 0 позицию(те переключатели, которые отвечают за адрес).

image.thumb.png.75bdddcf01d91c869347435f7ddbcc4a.png

А M вектор выставил в мастер BPI

image.png.00287b8f309745a2a5e73f1855371e9a.png

Видимо я опять чего-то не учел...

Share this post


Link to post
Share on other sites
14 minutes ago, aaarrr said:

Эти пины надо задействовать:

Большое спасибо! Действительно дело в этом, надо будет почитать что это за пины и зачем их отдельно задавать...

Share this post


Link to post
Share on other sites

Возникла старая проблема, которую пока накак не получается решить.

Вставил emc в дизайн согласно примеру.(картинка)

image.thumb.png.5060fab7b85dea1b005caba9a63cdd4f.png

Код rtl блока просто выдран из примера(у них он вставлен во враппер, я вынес отдельно)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;	
use unisim.vcomponents.STARTUPE3;

entity Linear_flash_interface is
  port (
  	Clk_out: in STD_LOGIC;
    Linear_Flash_address_in : in STD_LOGIC_VECTOR ( 25 downto 0 );
    Linear_Flash_address : out STD_LOGIC_VECTOR ( 25 downto 0 );
    Linear_Flash_adv_ldn_in : in STD_LOGIC;
    Linear_Flash_adv_ldn : out STD_LOGIC;
    Linear_Flash_ce_n : in std_logic_vector (0 downto 0);
    Linear_Flash_wait : in STD_LOGIC_VECTOR ( 0 to 0 );
    Linear_Flash_wait_out : out STD_LOGIC_VECTOR ( 0 to 0 );
    Linear_Flash_oe_n_in : in STD_LOGIC_VECTOR ( 0 to 0 );
    Linear_Flash_oe_n : out STD_LOGIC_VECTOR ( 0 to 0 );
    Linear_Flash_we_n_in : in STD_LOGIC;
   	Linear_Flash_we_n : out STD_LOGIC;
    RESET : in STD_LOGIC;
    mem_dq_io : inout STD_LOGIC_VECTOR ( 0 to 11 );

    mem_dq_t : in STD_LOGIC_VECTOR ( 15 downto 0 );
    mem_dq_i : out STD_LOGIC_VECTOR ( 0 to 15 );
    mem_dq_o : in STD_LOGIC_VECTOR ( 15 downto 0 )
  );
end Linear_flash_interface;

architecture STRUCTURE of Linear_flash_interface is
    signal dq_o : std_logic_vector (3 downto 0);
    signal dq_o_e, dq_i_e_int : std_logic_vector (15 downto 0);
    signal dq_t : std_logic_vector (3 downto 0);
    signal dq_t_e : std_logic_vector (15 downto 0);
    signal dq_i : std_logic_vector (3 downto 0);
    signal dq_i_e : std_logic_vector (0 to 11);
    ---------------------------------------------
    constant ADD_PIPELINTE : integer := 8;
    signal pipe_signal     : std_logic_vector(ADD_PIPELINTE-1 downto 0);
    signal PREQ_int        : std_logic;
    signal PACK_int        : std_logic;
    signal cnt : integer := 0;
    signal div_temp : std_logic := '0';
    signal startupe3_eos    : std_logic;

    signal GPIO_LED_0_LS: STD_LOGIC;
    signal GPIO_LED_1_LS: STD_LOGIC;
    signal GPIO_LED_2_LS: STD_LOGIC;
    signal GPIO_LED_3_LS: STD_LOGIC;
    signal GPIO_LED_4_LS: STD_LOGIC;
    signal GPIO_LED_5_LS: STD_LOGIC;
    signal GPIO_LED_6_LS: STD_LOGIC;
    signal GPIO_LED_7_LS: STD_LOGIC;
    ---------------------------------------------
begin
PREQ_REG_P:process(Clk_out)is  
begin
     if(Clk_out'event and Clk_out = '1') then
         if(reset = '1')then
              pipe_signal(0) <= '0';
         elsif(PREQ_int = '1')then
              pipe_signal(0) <= '1';
         end if;
     end if;
end process PREQ_REG_P;

PIPE_PACK_P:process(Clk_out)is 
begin
     if(Clk_out'event and Clk_out = '1') then
         if(reset = '1')then
              pipe_signal(ADD_PIPELINTE-1 downto 1) <= (others => '0');
         else
              pipe_signal(1) <= pipe_signal(0);
              pipe_signal(2) <= pipe_signal(1);
              pipe_signal(3) <= pipe_signal(2);
              pipe_signal(4) <= pipe_signal(3);
              pipe_signal(5) <= pipe_signal(4);
              pipe_signal(6) <= pipe_signal(5);
              pipe_signal(7) <= pipe_signal(6);
                if (cnt >= 50000000) then
                           div_temp <= not(div_temp);
                           cnt <= 0;
                  else    
                      cnt <= (cnt + 1);
                end if;
                GPIO_LED_0_LS <= not(div_temp);
                GPIO_LED_1_LS <= '0';
                GPIO_LED_2_LS <= '0';
                GPIO_LED_3_LS <= '0';
                GPIO_LED_4_LS <= '0';   --startupe3_eos;
                GPIO_LED_5_LS <= '0';
                GPIO_LED_6_LS <= '0';
                GPIO_LED_7_LS <= not (startupe3_eos);
         end if;
             
     end if;
        
end process PIPE_PACK_P;

PACK_int  <= pipe_signal(7); 

Linear_Flash_address(25 downto 0) <= Linear_Flash_address_in(25 downto 0);
Linear_Flash_adv_ldn <= Linear_Flash_adv_ldn_in;
Linear_Flash_oe_n(0) <= Linear_Flash_oe_n_in(0);
Linear_Flash_we_n <= Linear_Flash_we_n_in;
Linear_Flash_wait_out(0) <= Linear_Flash_wait(0);
dq_t_e(15 downto 0) <= mem_dq_t(15 downto 0);
mem_dq_i <= dq_i_e( 0 to 11) & dq_i;
dq_o_e(15 downto 0) <= mem_dq_o;

         STARTUPE3_inst : component STARTUPE3
         -----------------------
         generic map
         (
                PROG_USR      => "FALSE", -- Activate program event security feature.
                SIM_CCLK_FREQ => 0.0      -- Set the Configuration Clock Frequency(ns) for simulation.
         )
         port map
         (
               CFGCLK => open,                  -- 1-bit output: Configuration main clock output
               CFGMCLK => open,                 -- 1-bit output: Configuration internal oscillator clock output
               DI => dq_i,                      -- 4-bit output: Allow receiving on the D input pin
               EOS => startupe3_eos,            -- 1-bit output: Active-High output signal indicating the End Of Startup
               PREQ => open,                    -- 1-bit output: PROGRAM request to fabric output
               DO => dq_o_e(3 downto 0),        -- 4-bit input: Allows control of the D pin output
               DTS => dq_t_e(3 downto 0),       -- 4-bit input: Allows tristate of the D pin
               FCSBO => Linear_Flash_ce_n(0),   -- 1-bit input: Contols the FCS_B pin for flash access
               FCSBTS => '0',                   -- 1-bit input: Tristate the FCS_B pin
               GSR => '0',                      -- 1-bit input: Global Set/Reset input (GSR cannot be used for the port)
               GTS => '0',                      -- 1-bit input: Global 3-state input (GTS cannot be used for the port name)
               KEYCLEARB => '1',                -- 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
               PACK => PACK_int,                -- 1-bit input: PROGRAM acknowledge input
               USRCCLKO => Clk_out,             -- 1-bit input: User CCLK input
               USRCCLKTS => '0',                -- 1-bit input: User CCLK 3-state enable input
               USRDONEO => '1',                 -- 1-bit input: User DONE pin output control
               USRDONETS => '1'                 -- 1-bit input: User DONE 3-state enable output
             );

 mem_dq_iobuf_4 : IOBUF
   port map
   (
     I  => dq_o_e(4),
     IO => mem_dq_io(0),
     O  => dq_i_e(11),
     T  => dq_t_e(4)
   );

 mem_dq_iobuf_5 : IOBUF
   port map
   (
     I  => dq_o_e(5),
     IO => mem_dq_io(1),
     O  => dq_i_e(10),
     T  => dq_t_e(5)
   );   
   
 mem_dq_iobuf_6 : IOBUF
   port map
   (
     I  => dq_o_e(6),
     IO => mem_dq_io(2),
     O  => dq_i_e(9),
     T  => dq_t_e(6)
   );

 mem_dq_iobuf_7 : IOBUF
   port map
   (
     I  => dq_o_e(7),
     IO => mem_dq_io(3),
     O  => dq_i_e(8),
     T  => dq_t_e(7)
   );      

 mem_dq_iobuf_8 : IOBUF
   port map
   (
     I  => dq_o_e(8),
     IO => mem_dq_io(4),
     O  => dq_i_e(7),
     T  => dq_t_e(8)
   );

 mem_dq_iobuf_9 : IOBUF
   port map
   (
     I  => dq_o_e(9),
     IO => mem_dq_io(5),
     O  => dq_i_e(6),
     T  => dq_t_e(9)
   );   
   
 mem_dq_iobuf_10 : IOBUF
   port map
   (
     I  => dq_o_e(10),
     IO => mem_dq_io(6),
     O  => dq_i_e(5),
     T  => dq_t_e(10)
   );

 mem_dq_iobuf_11 : IOBUF
   port map
   (
     I  => dq_o_e(11),
     IO => mem_dq_io(7),
     O  => dq_i_e(4),
     T  => dq_t_e(11)
   );    
   
 mem_dq_iobuf_12 : IOBUF
   port map
   (
     I  => dq_o_e(12),
     IO => mem_dq_io(8),
     O  => dq_i_e(3),
     T  => dq_t_e(12)
   );

 mem_dq_iobuf_13 : IOBUF
   port map
   (
     I  => dq_o_e(13),
     IO => mem_dq_io(9),
     O  => dq_i_e(2),
     T  => dq_t_e(13)
   );  
 mem_dq_iobuf_14 : IOBUF
   port map
   (
     I  => dq_o_e(14),
     IO => mem_dq_io(10),
     O  => dq_i_e(1),
     T  => dq_t_e(14)
   );    
   
 mem_dq_iobuf_15 : IOBUF
   port map
   (
     I  => dq_o_e(15),
     IO => mem_dq_io(11),
     O  => dq_i_e(0),
     T  => dq_t_e(15)
   );

end STRUCTURE;

Дальше ноги идут непосредственно на выход.

В такой конфигурации все работает хорошо, но как только я убираю ila читаться из флешки перестает...

В превую очередь я грешил на констрэйнты, но они заданы согласно даташиту

#### Max Tco -- Clock to input delay for flash
set tco_max 5.5
set tco_min 5.5
#### Trace delays for VCU108 board
set tdata_trace_delay_max 0.25
set tdata_trace_delay_min 0.25
set tclk_trace_delay_max 0.2
set tclk_trace_delay_min 0.2
set startup_delay_max 7.000
set startup_delay_min 1.350
set board_del_max 1.000
set board_del_min 0.500

set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tco_max + $tdata_trace_delay_max+ $tclk_trace_delay_max + $startup_delay_max + $board_del_max] [get_ports {mem_dq_io[*]}]
set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tco_min + $tdata_trace_delay_min+ $tclk_trace_delay_min + $startup_delay_min + $board_del_min] [get_ports {mem_dq_io[*]}]

set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $startup_delay_max + $board_del_max] [get_ports {mem_dq_io[*]}]
set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $startup_delay_min + $board_del_min] [get_ports {mem_dq_io[*]}]

set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports {Linear_Flash_address[*]}]
set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports {Linear_Flash_address[*]}]

set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports {Linear_Flash_oe_n[0]}]
set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports {Linear_Flash_oe_n[0]}]

set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports Linear_Flash_we_n]
set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports Linear_Flash_we_n]

set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports Linear_Flash_adv_ldn]
set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports Linear_Flash_adv_ldn]

#### Input delay constraints (max/min) for Linear_flash_wait[0]

set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tco_max + $tdata_trace_delay_max + $tclk_trace_delay_max + $board_del_max] [get_ports {Linear_Flash_wait[0]}]

set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tco_min + $tdata_trace_delay_min + $tclk_trace_delay_min + $board_del_min] [get_ports {Linear_Flash_wait[0]}]

set_input_delay -max [expr $tdata_trace_delay_max + $tclk_trace_delay_max + $board_del_max] [get_ports RESET]
set_input_delay -min [expr $tdata_trace_delay_min - $tclk_trace_delay_max + $board_del_min] [get_ports RESET]

Так же я с такими проблемами сталкивался когда есть кривые комбинационные схемы или есть тайминг игнор на некоторые цепи и он некорректен. Но в данном случае этого нет.

Попробовал зафиксировать положение блока в констрейнтах - это так же результата не дало. Так же попробовал перейти на более новую вивадо - тоже без результата. Частоты выставил как в примере - так что тут тоже проблем вроде не должно быть.

Подскажите пожалуйста, где может быть проблема?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this