Организация памяти микропроцессорного ядра MicroBlaze

№ 5’2004
PDF версия
В предшествующих публикациях цикла были представлены основные характеристики, особенности архитектуры , система команд семейства 32%разрядных микропроцессорных ядер MicroBlaze, предназначенных для реализации встраиваемых систем на основе ПЛИС серий FPGA фирмы Xilinx, и комплекс средств автоматизированного проектирования Xilinx Embedded Development Kit (EDK).

В предшествующих публикациях цикла были представлены основные характеристики, особенности архитектуры [1], система команд [2] семейства 32%разрядных микропроцессорных ядер MicroBlaze, предназначенных для реализации встраиваемых систем на основе ПЛИС серий FPGA фирмы Xilinx, и комплекс средств автоматизированного проектирования Xilinx Embedded Development Kit (EDK) [3]. Прежде чем приступить непосредственно к рассмотрению процесса проектирования микропроцессорных систем на основе ядра MicroBlaze в рамках пакета Xilinx EDK, необходимо остановиться на вопросах, связанных с распределением адресного пространства памяти и организацией хранения данных.

Ограничения адресного пространства, производительности и объема памяти для ядра MicroBlaze

В архитектуре микропроцессорного ядра MicroBlaze используется 32-разрядная шина адреса. Таким образом, адресное пространство памяти ограничивается диапазоном от 0x00000000 до 0xFFFFFFFF. Доступ к памяти может осуществляться через шину Local Memory Bus (LMB) или через шину On-chip Peripheral Bus (OPB) [1]. Локальная шина LMB предназначена, в первую очередь, для обеспечения высокоскоростного доступа к памяти, расположенной непосредственно на кристалле. Эта память реализуется на основе элементов блочного ОЗУ Block RAM (BRAM) ПЛИС семейств FPGA фирмы Xilinx. Глобальная шина OPB может использоваться для сопряжения ядра MicroBlaze и памяти, расположенной как внутри, так и вне кристалла. Кроме того, эта шина предназначена для организации взаимодействия микропроцессорного ядра и периферийных устройств. Следует обратить внимание на то, что подключение памяти, реализуемой на основе внутренних ресурсов ПЛИС, через шину OPB приводит к снижению производительности системы по сравнению с вариантом, когда интерфейс между микропроцессорным ядром и внутренней памятью строится на основе локальной шины LMB. Выполнение операций записи и чтения данных из блочной памяти ПЛИС при использовании интерфейса шины LMB занимает два машинных цикла. Если сопряжение микропроцессорного ядра с памятью, расположенной непосредственно на кристалле, осуществляется по шине OPB, то для выполнения операции записи данных в память требуется три машинных цикла, а для операции чтения — четыре. Время доступа к внешней памяти (по отношению к ПЛИС) во многом зависит от параметров микросхем, применяемых для еереализации. В настоящее время в большинстве случаев время доступа к памяти, расположенной вне кристалла, составляет от пяти до семи машинных циклов.

Суммарный объем памяти, реализуемой непосредственно на кристалле, ограничивается соответствующими физическими ресурсами используемой ПЛИС. Максимальное значение этого параметра зависит от выбранного семейства и типа кристалла FPGA [4–7].

Распределение адресного пространства памяти ядра MicroBlaze

Типовая структура распределения адресного пространства памяти MicroBlaze показана на рис. 1. Начальной (стартовой) позицией адресного пространства памяти является нулевое значение (0x00000000). Конечная граница адресного пространства зависит от конфигурации проектируемой системы, но не может превышать максимального значения (0xFFFFFFFF).

1. Карта типового распределения адресного пространства памяти

В начальной секции адресного пространства располагается диапазон адресов, зарезервированный для памяти, которая расположена непосредственно на кристалле и сопряжена с микропроцессорным ядром по локальной шине LMB. Следующий диапазон адресов предназначен для внутренней памяти ПЛИС, доступ к которой осуществляется по шине OPB. Далее, в направлении увеличения значения адреса, следует диапазон адресов внешней памяти, подключенной к шине OPB. В конечной секции адресного пространства памяти обычно находится диапазон адресов периферийных модулей проектируемой микропроцессорной системы. Между перечисленными диапазонами адресов в общем случае могут присутствовать неиспользуемые интервалы адресного пространства.

Карта фактического распределения адресного пространства памяти определяется в спецификации аппаратной части проектируемой микропроцессорной системы MHS (Microprocessor Hardware Specification). В файле MHS указывается диапазон адресов для каждого используемого компонента разрабатываемой системы, в том числе, для блочной памяти ПЛИС BRAM, подключаемой к шинам LMB и OPB, внешней памяти и периферийных модулей. Информация о необходимом диапазоне адресов для IP-ядер, входящих в комплект пакета Xilinx EDK, содержится в соответствующей документации. В спецификации аппаратной части разрабатываемой микропроцессорной системы MHS задается базовое и максимальное значение адреса для каждого применяемого IP-компонента.

Часть адресного пространства памяти микропроцессорного ядра MicroBlaze в диапазоне от 0x00000000 по 0x00000018 зарезервирована для выполнения специальных функций. В частности, в ячейках памяти этого диапазона содержится информация об адресах переходов, выполняемых при сбросе микропроцессорного ядра, обработке прерываний и исключений. При включении питания или поступлении сигнала сброса в ядре MicroBlaze управление автоматически передается по адресу 0x00000000. При появлении запроса прерывания осуществляется переход по адресу 0x00000010. В случае возникновения исключений автоматически производится передача управления по адресу 0x00000008.

Размещение исполняемого кода программ в памяти ядра MicroBlaze

Адресное пространство памяти можно условно разбить на две части: системную область и область, используемую прикладными программами. Под системную область, как правило, отводится диапазон адресного пространства, начинающийся с нулевого значения адреса (0x00000000). Использование этой части памяти определяется выбранным режимом исполнения прикладной программы.

Микропроцессорное ядро MicroBlaze поддерживает несколько режимов (сценариев) выполнения прикладных программ. Каждому из этих сценариев соответствует определенная схема размещения программ в адресном пространстве памяти.

Первый вариант сценария используется для выполнения прикладных программ, написанных на языках высокого уровня С/С++, которые не требуют поддержки автозагрузки и отладки. В этом случае в процессе генерации исполняемого кода компоновщик присоединяет к объектному файлу основной программы системный файл crt0.o. Исполняемый код, соответствующий данному системному файлу, загружается в системную область памяти, начиная с нулевого адреса. Исполняемый код прикладной программы располагается непосредственно вслед за кодом файла crt0.o. В более наглядной форме данный способ размещения прикладной программы в адресном пространстве памяти микропроцессорного ядра MicroBlaze поясняет рис. 2, а.

2. Варианты размещения исполняемого кода программ в адресном пространстве памяти

Второй вариант сценария выполнения прикладных программ применяется в случае, когда необходимо обеспечить поддержку отладочных средств Xilinx Microprocessor Debugger (XMD). Для этого в системную область памяти микропроцессорного ядра MicroBlaze должен быть загружен соответствующий модуль xmdstub. Данный модуль располагается в системной области памяти, начиная с нулевого адреса (0x00000000). При этом компоновщик в процессе формирования исполняемого кода присоединяет к объектному файлу основной программы системный файл crt1.o. Сгенерированный исполняемый код прикладной программы, включающий в себя файл crt1.o, размещается в области памяти, которая начинается с фиксированного значения адреса. Для рассматриваемого варианта сценария в качестве значения этого адреса, установленного по умолчанию, используется 0x00000400. Рис. 2, б иллюстрирует размещение исполняемого кода программных модулей в памяти, соответствующее второму варианту сценария.

Третий вариант сценария предназначен для реализации режима автозагрузки прикладной программы. Для осуществления этого сценария в системную область памяти ядра MicroBlaze необходимо загрузить соответствующий специальный модуль bootstub. Данный модуль размещается в системной области памяти с нулевого адреса (0x00000000).

Кроме того, в процессе компоновки исполняемого кода к объектному файлу основной программы должен быть присоединен системный файл crt2.o или crt3.o. Какой из этих системных файлов будет скомпонован с основной программой, зависит от выбранной опции компилятора. Сформированный исполняемый код прикладной программы, включающий в себя файл crt2.o или crt3.o, располагается в области памяти, начинающейся с фиксированного адреса. По умолчанию для данного варианта сценария установлено значение этого адреса 0x00000100. Схема размещения исполняемого кода программных модулей в памяти микропроцессорного ядра MicroBlaze, соответствующая третьему варианту сценария, представлена на рис. 2, в.

Для того чтобы сформировать объектный код разрабатываемой прикладной программы, соответствующий одному из рассмотренных выше сценариев выполнения, следует воспользоваться специальными параметрами компилятора. Параметр -xl-mode-executable используется для компиляции прикладных программ, не требующих при выполнении поддержки средств отладки и автозагрузки. Параметр -xl-mode-xmdstub применяется в процессе компиляции программ, которые должны выполняться в режиме отладки. Параметры компилятора -xl-modebootstrap-xl-mode-bootstrap-reset предназначены для генерации объектного кода прикладных программ, которые должны поддерживать режим автозагрузки.

Организация хранения данных в памяти и регистрах общего назначения ядра MicroBlaze

Как уже упоминалось при рассмотрении команд передачи данных, микропроцессорное ядро MicroBlaze предусматривает три формата записи и извлечения данных из памяти: в виде 32-разрядных (полных) слов, 16-разрядных слов (полуслов) и 8-разрядных слов (побайтно). В процессе разработки программ на языке ассемблера или языках высокого уровня С/С++, а также при создании описаний модулей микропроцессорной системы с использованием языков высокого уровня VHDL и Verilog необходимо располагать информацией о способе нумерации битов данных, передаваемых по шинам и записываемых в регистры общего назначения и порядке размещения байтов, составляющих слово, в адресном пространстве памяти.

В архитектуре MicroBlaze используется следующее соглашение о нумерации разрядов шин и регистров. Старший разряд (старший значащий бит) MSB (most significant bit) имеет нулевой порядковый номер. Соответственно младший разряд (младший значащий бит) LSB (least significant bit) при 32-разрядной архитектуре шин и регистров обозначается порядковым номером 31. При этом следует учитывать, что ряд интерфейсных ядер, предлагаемых фирмой Xilinx, использует противоположный способ нумерации битов данных, при котором нулевой порядковый номер соответствует младшему разряду. В качестве примера ядер, использующих альтернативный способ нумерации битов данных, можно привести модуль интерфейса шины PCI — PCI Core. Данный модуль может применяться в виде компонента, который включается в состав встраиваемых микропроцессорных систем, проектируемых на основе ядра MicroBlaze.

В микропроцессорном ядре MicroBlaze байты, составляющие слово данных, располагаются в адресном пространстве памяти таким образом, при котором старшему значащему байту слова соответствует меньшее (начальное) значение адреса, а младшему байту — большее. При этом нумерация байт в слове начинается со старшего значащего байта. Иными словами, байты слова данных размещаются в адресном пространстве памяти в порядке убывания значимости. Данный способ организации хранения данных в памяти и регистрах в англоязычной литературе обозначается термином Big-endian. Таблицы 1–3 в наглядной форме поясняют порядок нумерации битов и байтов в структуре слов данных различной длины и способ их организации в адресном пространстве памяти ядра MicroBlaze.

Таблица. 1. Организация 32.разрядных слов данных в адресном пространстве памяти и регистрах ядра MicroBlaze
Адрес байта n n+1 n+2 n+3
Номер байта в слове 0 1 2 3
Порядок следования байт в слове Старший байт most significant byte (MSByte)     Младший байт least significant byte (LSByte)
Номер бита в слове 0                                                             31
Порядок следования бит в слове
старший бит   младший бит
most significant bit (MSB)   least significant bit (LSB)
Таблица. 2. Организация 16-разрядных слов данных в адресном пространстве памяти ирегистрах ядра MicroBlaze
Адрес байта n n+1
Номер байта в слове 0 1
Порядок следования байт в слове Старший байт most significant byte (MSByte) Младший байт least significant byte (LSByte)
Номер бита в слове 1                             15
Порядок следования бит в слове
старший бит   младший бит
most significant bit (MSB)   least significant bit (LSB)
Таблица. 3. Организация 8-разрядных слов данных в адресном пространстве памяти и регистрах ядра MicroBlaze
Адрес байта n
Номер байта в слове 0
Номер бита в слове 0             7
Порядок следования бит в слове
старший бит   младший бит
most significant bit (MSB)   least significant bit (LSB)

Некоторые компоненты встраиваемых микропроцессорных систем могут использовать обратный порядок размещения байтов слова данных в адресном пространстве памяти, при котором младший (начальный) адрес соответствует младшему значащему байту.

Такой способ организации данных в адресном пространстве памяти обозначается термином Little-endian. Информация о типе организации данных для применяемого компонента содержится в документации, описывающей этот компонент. Для того чтобы применять компоненты, использующие организацию данных Little-endian, в системах, основанных на микропроцессорном ядре MicroBlaze, в состав VHDL- или Verilog-описаний необходимо включить секцию кода, в которой выполняется преобразование структуры слов данных.

В качестве примера ниже приводится VHDL-описание модуля блочной памяти BRAM, доступ к которой осуществляется через шину OPB. Модуль блочной памяти строится на основе базовых элементов двухпортового ОЗУ, информационная емкость которого составляет 16384 бит (16 кбит). Каждый порт блочной памяти имеет организацию 2048 слов U 8 разрядов с контролем по четности. Таким образом, для создания 32-разрядного модуля блочной памяти необходимо число базовых элементов, кратное 4. Базовый элемент блочного ОЗУ представлен в виде компонента RAMB16_S9_S9.

Шина OPB предполагает использование организации данных Big-endian, а в компонентах базовых элементов блочной памяти применяется Little-endian. Декларация объекта OPB_BRAM, который описывает модуль блочной памяти, подключенной к шине OPB, выглядит следующим образом.

--Interface Between BRAM and MicroBlaze

library IEEE;
use IEEE.std_logic_1164.all;
entity OPB_BRAM is
generic (
        C_BASEADDR : std_logic_vector(0 to 31) := X»B000_0000»;
        C_NO_BRAMS : natural := 4; -- Can be 4,8,16,32 only
        C_VIRTEXII : boolean := true
        );
port (
-- Global signals
OPB_Clk : in std_logic;
OPB_Rst : in std_logic;

-- OPB signals
OPB_ABus : in std_logic_vector(0 to 31);
OPB_BE : in std_logic_vector(0 to 3);
OPB_RNW : in std_logic;
OPB_select : in std_logic;
OPB_seqAddr : in std_logic;
OPB_DBus : in std_logic_vector(0 to 31);
OPB_BRAM_DBus : out std_logic_vector(0 to 31);
OPB_BRAM_errAck : out std_logic;
OPB_BRAM_retry : out std_logic;
OPB_BRAM_toutSup : out std_logic;
OPB_BRAM_xferAck : out std_logic;

-- OPB_BRAM signals (other port)
BRAM_Clk : in std_logic;
BRAM_Addr : in std_logic_vector(0 to 31);
BRAM_WE : in std_logic_vector(0 to 3);
BRAM_Write_Data : in std_logic_vector(0 to 31);
BRAM_Read_Data : out std_logic_vector(0 to 31)
);
end entity OPB_BRAM;

Кроме собственно выражений декларации, описывающих интерфейс и параметры объекта OPB_BRAM, в приведенном фрагменте представлены также ссылки на используемую библиотеку и пакет. Объем создаваемого модуля блочной памяти (в виде числа базовых элементов) определяется с помощью параметра C_NO_BRAMS. Параметр C_BASEADDR предназначен для установки значения базового адреса.

Архитектурное тело объекта OPB_BRAM, представляющего модуль блочной памяти, который предназначен для сопряжения с микропроцессорным ядром через шину OPB, содержит структурное описание этого объекта на языке VHDL. В состав архитектурного тела описания объекта OPB_BRAM входят четыре раздела. В первом разделе приводится декларация компонента RAMB16_S9_S9, представляющего 2-портовое ОЗУ, используемое в качестве базового элемента для построения модуля блочной памяти. Этот раздел содержит следующий VHDL-код.

architecture IMP of OPB_BRAM is

-- BRAM Component Declaration (little-endian)

component RAMB16_S9_S9
port (
       DIA : in std_logic_vector (7 downto 0);
       DIB : in std_logic_vector (7 downto 0);
       DIPA : in std_logic_vector (0 downto 0);
       DIPB : in std_logic_vector (0 downto 0);
       ENA : in std_ulogic;
       ENB : in std_ulogic;
       WEA : in std_ulogic;
       WEB : in std_ulogic;
       SSRA : in std_ulogic;
       SSRB : in std_ulogic;	
	   CLKA : in std_ulogic;
       CLKB : in std_ulogic;
       ADDRA : in std_logic_vector (10 downto 0);
       ADDRB : in std_logic_vector (10 downto 0);
       DOA : out std_logic_vector (7 downto 0);
       DOB : out std_logic_vector (7 downto 0);
       DOPA : out std_logic_vector (0 downto 0);
       DOPB : out std_logic_vector (0 downto 0)
);
end component;

Второй раздел включает в себя стандартные конструкции, используемые для декларации внутренних сигналов и переменных. Текст данного раздела не представлен в настоящей статье. Вся необходимая информация о типе используемых внутренних сигналов и переменных приводится далее в виде комментариев.

Третий раздел архитектурного тела описания объекта OPB_BRAM содержит последовательность выражений, выполняющих преобразование структуры слов данных из формата Little-endian в формат Big-endian. Содержимое этого раздела выглядит следующим образом:

--Swap BRAM Little-endian Data to Big-endian

BE_to_LE : for I in 0 to 31 generate
opb_dbus_le(I ) 

В четвертом разделе архитектурного тела описания объекта OPB_BRAM представлены выражения, предназначенные для создания экземпляров компонентов базовых элементов ОЗУ, образующих модуль блочнойпамяти. Этот раздел содержит следующий VHDL-код:

--BRAM Instantiation

All_Brams : for I in 0 to C_NO_BRAMS-1 generate
By_8 : if (C_NO_BRAMS = 4) generate
RAMB16_S9_S9_I : RAMB16_S9_S9
port map (
DIA => opb_DBUS_LE(((I+1)*8-1) downto I*8), --[in std_logic_vector(
7 downto 0)]
DIB =>bram_Write_Data_LE(((I+1)*8)-1 downto I*8), --[in
std_logic_vector (7 downto 0)]
DIPA => null_1, -- [in std_logic_vector (7 downto 0)]
DIPB => null_1, -- [in std_logic_vector (7 downto 0)]
ENA => '1', -- [in std_ulogic]
ENB => '1', -- [in std_ulogic]
WEA => opb_WE(I), -- [in std_ulogic]
WEB => BRAM_WE(I), -- [in std_ulogic]
SSRA => '0', -- [in std_ulogic]
SSRB => '0', -- [in std_ulogic]
CLKA => OPB_Clk, -- [in std_ulogic]
CLKB => BRAM_Clk, -- [in std_ulogic]
ADDRA => opb_ABus_LE(12 downto 2), -- [in std_logic_vector (10
downto 0)]
ADDRB => bram_Addr_LE(12 downto 2), -- [in std_logic_vector (10
downto 0)]
DOA=>opb_BRAM_DBus_LE_I(((I+1)*8-1)downto I*8),--[out
std_logic_vector(7 downto 0)]
DOB =>bram_Read_Data_LE(((I+1)*8-1) downto I*8),--[out
std_logic_vector(7 downto 0)]
DOPA => open, -- [out std_logic_vector (0 downto 0)]
DOPB => open -- [out std_logic_vector (0 downto 0)]
);
end generate By_8;

В представленном разделе все выражения, в которых описывается соответствие портов компонентов и используемых внутренних сигналов и переменных, сопровождаются комментариями, в которых указывается тип этих сигналов и переменных.

Литература

  1. Зотов В.
    MicroBlaze — семейство тридцатидвухразрядных микропроцессорных ядер, реализуемых на основе ПЛИС фирмы Xilinx //
    Компоненты и технологии. 2003. № 9.
  2. Зотов В.
    Система команд микропроцессорного ядра MicroBlaze // Компоненты и технологии. 2004. № 1-3.
  3. Зотов В.
    Embedded Development Kit — система проектирования встраиваемых микропроцессорных систем на основе ПЛИС серий FPGA фирмы Xilinx.
    2004. № 3.
  4. Кнышев Д. А., Кузелин М. О. ПЛИС фирмы «Xilinx»: описание структуры основных семейств. М.: Издательский дом «Додека-XXI». 2001.
  5. Кузелин М.
    ПЛИС фирмы Xilinx: семейство Spartan™-II //
    Компоненты и технологии. 2001. № 3.
  6. Кузелин М. ПЛИС фирмы Xilinx: семейство Virtex™-II // Chip News / Инженерная микроэлектроника. 2002. № 2.
  7. Spartan-3 FPGA Handbook. Xilinx Inc. 2003.
xosotin chelseathông tin chuyển nhượngcâu lạc bộ bóng đá arsenalbóng đá atalantabundesligacầu thủ haalandUEFAevertonxosofutebol ao vivofutemaxmulticanaisonbetbóng đá world cupbóng đá inter milantin juventusbenzemala ligaclb leicester cityMUman citymessi lionelsalahnapolineymarpsgronaldoserie atottenhamvalenciaAS ROMALeverkusenac milanmbappenapolinewcastleaston villaliverpoolfa cupreal madridpremier leagueAjaxbao bong da247EPLbarcelonabournemouthaff cupasean footballbên lề sân cỏbáo bóng đá mớibóng đá cúp thế giớitin bóng đá ViệtUEFAbáo bóng đá việt namHuyền thoại bóng đágiải ngoại hạng anhSeagametap chi bong da the gioitin bong da lutrận đấu hôm nayviệt nam bóng đátin nong bong daBóng đá nữthể thao 7m24h bóng đábóng đá hôm naythe thao ngoai hang anhtin nhanh bóng đáphòng thay đồ bóng đábóng đá phủikèo nhà cái onbetbóng đá lu 2thông tin phòng thay đồthe thao vuaapp đánh lô đềdudoanxosoxổ số giải đặc biệthôm nay xổ sốkèo đẹp hôm nayketquaxosokq xskqxsmnsoi cầu ba miềnsoi cau thong kesxkt hôm naythế giới xổ sốxổ số 24hxo.soxoso3mienxo so ba mienxoso dac bietxosodientoanxổ số dự đoánvé số chiều xổxoso ket quaxosokienthietxoso kq hôm nayxoso ktxổ số megaxổ số mới nhất hôm nayxoso truc tiepxoso ViệtSX3MIENxs dự đoánxs mien bac hom nayxs miên namxsmientrungxsmn thu 7con số may mắn hôm nayKQXS 3 miền Bắc Trung Nam Nhanhdự đoán xổ số 3 miềndò vé sốdu doan xo so hom nayket qua xo xoket qua xo so.vntrúng thưởng xo sokq xoso trực tiếpket qua xskqxs 247số miền nams0x0 mienbacxosobamien hôm naysố đẹp hôm naysố đẹp trực tuyếnnuôi số đẹpxo so hom quaxoso ketquaxstruc tiep hom nayxổ số kiến thiết trực tiếpxổ số kq hôm nayso xo kq trực tuyenkết quả xổ số miền bắc trực tiếpxo so miền namxổ số miền nam trực tiếptrực tiếp xổ số hôm nayket wa xsKQ XOSOxoso onlinexo so truc tiep hom nayxsttso mien bac trong ngàyKQXS3Msố so mien bacdu doan xo so onlinedu doan cau loxổ số kenokqxs vnKQXOSOKQXS hôm naytrực tiếp kết quả xổ số ba miềncap lo dep nhat hom naysoi cầu chuẩn hôm nayso ket qua xo soXem kết quả xổ số nhanh nhấtSX3MIENXSMB chủ nhậtKQXSMNkết quả mở giải trực tuyếnGiờ vàng chốt số OnlineĐánh Đề Con Gìdò số miền namdò vé số hôm nayso mo so debach thủ lô đẹp nhất hôm naycầu đề hôm naykết quả xổ số kiến thiết toàn quốccau dep 88xsmb rong bach kimket qua xs 2023dự đoán xổ số hàng ngàyBạch thủ đề miền BắcSoi Cầu MB thần tàisoi cau vip 247soi cầu tốtsoi cầu miễn phísoi cau mb vipxsmb hom nayxs vietlottxsmn hôm naycầu lô đẹpthống kê lô kép xổ số miền Bắcquay thử xsmnxổ số thần tàiQuay thử XSMTxổ số chiều nayxo so mien nam hom nayweb đánh lô đề trực tuyến uy tínKQXS hôm nayxsmb ngày hôm nayXSMT chủ nhậtxổ số Power 6/55KQXS A trúng roycao thủ chốt sốbảng xổ số đặc biệtsoi cầu 247 vipsoi cầu wap 666Soi cầu miễn phí 888 VIPSoi Cau Chuan MBđộc thủ desố miền bắcthần tài cho sốKết quả xổ số thần tàiXem trực tiếp xổ sốXIN SỐ THẦN TÀI THỔ ĐỊACầu lô số đẹplô đẹp vip 24hsoi cầu miễn phí 888xổ số kiến thiết chiều nayXSMN thứ 7 hàng tuầnKết quả Xổ số Hồ Chí Minhnhà cái xổ số Việt NamXổ Số Đại PhátXổ số mới nhất Hôm Nayso xo mb hom nayxxmb88quay thu mbXo so Minh ChinhXS Minh Ngọc trực tiếp hôm nayXSMN 88XSTDxs than taixổ số UY TIN NHẤTxs vietlott 88SOI CẦU SIÊU CHUẨNSoiCauVietlô đẹp hôm nay vipket qua so xo hom naykqxsmb 30 ngàydự đoán xổ số 3 miềnSoi cầu 3 càng chuẩn xácbạch thủ lônuoi lo chuanbắt lô chuẩn theo ngàykq xo-solô 3 càngnuôi lô đề siêu vipcầu Lô Xiên XSMBđề về bao nhiêuSoi cầu x3xổ số kiến thiết ngày hôm nayquay thử xsmttruc tiep kết quả sxmntrực tiếp miền bắckết quả xổ số chấm vnbảng xs đặc biệt năm 2023soi cau xsmbxổ số hà nội hôm naysxmtxsmt hôm nayxs truc tiep mbketqua xo so onlinekqxs onlinexo số hôm nayXS3MTin xs hôm nayxsmn thu2XSMN hom nayxổ số miền bắc trực tiếp hôm naySO XOxsmbsxmn hôm nay188betlink188 xo sosoi cầu vip 88lô tô việtsoi lô việtXS247xs ba miềnchốt lô đẹp nhất hôm naychốt số xsmbCHƠI LÔ TÔsoi cau mn hom naychốt lô chuẩndu doan sxmtdự đoán xổ số onlinerồng bạch kim chốt 3 càng miễn phí hôm naythống kê lô gan miền bắcdàn đề lôCầu Kèo Đặc Biệtchốt cầu may mắnkết quả xổ số miền bắc hômSoi cầu vàng 777thẻ bài onlinedu doan mn 888soi cầu miền nam vipsoi cầu mt vipdàn de hôm nay7 cao thủ chốt sốsoi cau mien phi 7777 cao thủ chốt số nức tiếng3 càng miền bắcrồng bạch kim 777dàn de bất bạion newsddxsmn188betw88w88789bettf88sin88suvipsunwintf88five8812betsv88vn88Top 10 nhà cái uy tínsky88iwinlucky88nhacaisin88oxbetm88vn88w88789betiwinf8betrio66rio66lucky88oxbetvn88188bet789betMay-88five88one88sin88bk88xbetoxbetMU88188BETSV88RIO66ONBET88188betM88M88SV88Jun-68Jun-88one88iwinv9betw388OXBETw388w388onbetonbetonbetonbet88onbet88onbet88onbet88onbetonbetonbetonbetqh88mu88Nhà cái uy tínpog79vp777vp777vipbetvipbetuk88uk88typhu88typhu88tk88tk88sm66sm66me88me888live8live8livesm66me88win798livesm66me88win79pog79pog79vp777vp777uk88uk88tk88tk88luck8luck8kingbet86kingbet86k188k188hr99hr99123b8xbetvnvipbetsv66zbettaisunwin-vntyphu88vn138vwinvwinvi68ee881xbetrio66zbetvn138i9betvipfi88clubcf68onbet88ee88typhu88onbetonbetkhuyenmai12bet-moblie12betmoblietaimienphi247vi68clupcf68clupvipbeti9betqh88onb123onbefsoi cầunổ hũbắn cáđá gàđá gàgame bàicasinosoi cầuxóc đĩagame bàigiải mã giấc mơbầu cuaslot gamecasinonổ hủdàn đềBắn cácasinodàn đềnổ hũtài xỉuslot gamecasinobắn cáđá gàgame bàithể thaogame bàisoi cầukqsssoi cầucờ tướngbắn cágame bàixóc đĩaAG百家乐AG百家乐AG真人AG真人爱游戏华体会华体会im体育kok体育开云体育开云体育开云体育乐鱼体育乐鱼体育欧宝体育ob体育亚博体育亚博体育亚博体育亚博体育亚博体育亚博体育开云体育开云体育棋牌棋牌沙巴体育买球平台新葡京娱乐开云体育mu88qh88

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *