Перейти к содержанию
    

GoWin EMPU-M1 + Gowin Flash Controller

Всем доброго дня!

Плата Tang Nano 9k c FPGA GW1NR-LV9QN88PC6/I5 ревизия C. Поднимаю SoC Cortex-M1. Пытаюсь запустить программу из User Flash. Для этого в настройках ядра Cortex-M1 вкладка Memory в разделе ITCM Select устанавливаю External Instruction Memory.

В keil соответственно прописываю для:

IROM1 -   Start 0x00000000,   Size 0x10000,

IRAM1 -  Start 0x20000000,   Size 0x8000.

image.png.f2607ec01f99b4d1ae295aacc5154cc0.png

Компилирую HW и SW в настройках Gowin Programmer указываю MCU Mode L и добавляю файлы *.fs и *.bin сохраняю. Все в соответствии с инструкцией Gowin_EMPU_M1 Download Reference Design на странице 15(17) глава 5 Embedded UserFlash Download.

Прошиваю ПЛИС, аппаратная часть запускается (видно по 4-м светодиодам которые подтянуты pull up), но программа не стартует. Флеш память подключаю через IP блок Gowin Flash Controller в настройках указываю шину AHB. Тут я интуитивно принял решение так как сигналы которые выпускает Cortex-M1 на внешнюю флешь соответствуют сигналам шины AHB. Возможно я здесь что то не правильно сделал. В инструкции ни чего по этому поводу не нашел. 

 В Gowin_EMPU_M1 Download Reference Design в разделе 5.3 Design Flow, в пункте 3 сказано "Instantiate UserFlash Controller (GW1N-9C/GW1NR-9C FLASH608K) Memory Map as the instruction memory of Gowin_EMPU_M1." Этот пункт я закрыл как писал выше Gowin Flash Controller-ом. Ссылка на проект.

`resetall

module Gowin_EMPU_M1_template (
  LED,
  TDI,
  TMS,
  TCK,
  TDO,
  UART1RXD,
  UART1TXD,
  HCLK,		//System Clock
  hwRstn	//System Reset
);

input HCLK;          // System clock
input hwRstn;        // System reset

//UART0
input UART1RXD;
output UART1TXD;

//JTAG
inout TDI;
inout TMS;
inout TCK;
inout TDO;

//LED
output [3:0] LED;

wire MCLK;            //mcu clock

Gowin_rPLL u_Gowin_rPLL
(
  .clkout(MCLK),    //output clkout 40MHz
  .clkin(HCLK)      //input clkin 50MHz
);


wire [31:0] EXTFLASH_HRDATA;
wire EXTFLASH_HREADY;
wire [1:0] EXTFLASH_HRESP;
wire [1:0] EXTFLASH_HTRANS;
wire [2:0] EXTFLASH_HSIZE;
wire EXTFLASH_HWRITE;
wire [31:0] EXTFLASH_HADDR;
wire [31:0] EXTFLASH_HWDATA;
wire EXTFLASH_HSEL;
wire EXTFLASH_HCLK;


Gowin_EMPU_M1_Top your_instance_name(
    .LOCKUP(), //output LOCKUP
    .HALTED(), //output HALTED
    .GPIOIN(16'h0000), //input [15:0] GPIOIN
    .GPIOOUT(LED), //output [15:0] GPIOOUT
    .GPIOOUTEN(), //output [15:0] GPIOOUTEN
    .JTAG_3(), //inout JTAG_3
    .JTAG_4(), //inout JTAG_4
    .JTAG_5(TDI), //inout JTAG_5
    .JTAG_6(), //inout JTAG_6
    .JTAG_7(TMS), //inout JTAG_7
    .JTAG_8(), //inout JTAG_8
    .JTAG_9(TCK), //inout JTAG_9
    .JTAG_10(), //inout JTAG_10
    .JTAG_11(), //inout JTAG_11
    .JTAG_12(), //inout JTAG_12
    .JTAG_13(TDO), //inout JTAG_13
    .JTAG_14(), //inout JTAG_14
    .JTAG_15(), //inout JTAG_15
    .JTAG_16(), //inout JTAG_16
    .JTAG_17(), //inout JTAG_17
    .JTAG_18(), //inout JTAG_18
    .UART0RXD(1'b0), //input UART0RXD
    .UART0TXD(), //output UART0TXD
    .UART1RXD(UART1RXD), //input UART1RXD
    .UART1TXD(UART1TXD), //output UART1TXD
    .TIMER0EXTIN(1'b0), //input TIMER0EXTIN
    .TIMER1EXTIN(1'b0), //input TIMER1EXTIN
    .EXTFLASH0HRDATA(EXTFLASH_HRDATA), //input [31:0] EXTFLASH0HRDATA
    .EXTFLASH0HREADYOUT(EXTFLASH_HREADY), //input EXTFLASH0HREADYOUT
    .EXTFLASH0HRESP(EXTFLASH_HRESP), //input [1:0] EXTFLASH0HRESP
    .EXTFLASH0HTRANS(EXTFLASH_HTRANS), //output [1:0] EXTFLASH0HTRANS
    .EXTFLASH0HBURST(), //output [2:0] EXTFLASH0HBURST
    .EXTFLASH0HPROT(), //output [3:0] EXTFLASH0HPROT
    .EXTFLASH0HSIZE(EXTFLASH_HSIZE), //output [2:0] EXTFLASH0HSIZE
    .EXTFLASH0HWRITE(EXTFLASH_HWRITE), //output EXTFLASH0HWRITE
    .EXTFLASH0HREADYMUX(), //output EXTFLASH0HREADYMUX
    .EXTFLASH0HMASTER(), //output [3:0] EXTFLASH0HMASTER
    .EXTFLASH0HMASTLOCK(), //output EXTFLASH0HMASTLOCK
    .EXTFLASH0HADDR(EXTFLASH_HADDR), //output [31:0] EXTFLASH0HADDR
    .EXTFLASH0HWDATA(EXTFLASH_HWDATA), //output [31:0] EXTFLASH0HWDATA
    .EXTFLASH0HSEL(EXTFLASH_HSEL), //output EXTFLASH0HSEL
    .EXTFLASH0HCLK(EXTFLASH_HCLK), //output EXTFLASH0HCLK
    .EXTFLASH0HRESET(EXTFLASH_HRESETn), //output EXTFLASH0HRESET
    .HCLK(MCLK), //input HCLK
    .hwRstn(hwRstn) //input hwRstn
);


Gowin_Flash_Controller_Top program_flash_memory (
    .AHB_HRDATA(EXTFLASH_HRDATA), //output [31:0] AHB_HRDATA
    .AHB_HREADY(EXTFLASH_HREADY), //output AHB_HREADY
    .AHB_HRESP(EXTFLASH_HRESP), //output [1:0] AHB_HRESP
    .AHB_HTRANS(EXTFLASH_HTRANS), //input [1:0] AHB_HTRANS
    .AHB_HSIZE(EXTFLASH_HSIZE), //input [2:0] AHB_HSIZE
    .AHB_HWRITE(EXTFLASH_HWRITE), //input AHB_HWRITE
    .AHB_HADDR(EXTFLASH_HADDR), //input [31:0] AHB_HADDR
    .AHB_HWDATA(EXTFLASH_HWDATA), //input [31:0] AHB_HWDATA
    .AHB_HSEL(EXTFLASH_HSEL), //input AHB_HSEL
    .AHB_HCLK(EXTFLASH_HCLK), //input AHB_HCLK
    .AHB_HRESETn(EXTFLASH_HRESETn) //input AHB_HRESETn
);


endmodule

Что я мог здесь пропустить?

BSRAM в качестве ITCM в соответствии с главой 2 инструкции Gowin_EMPU_M1 Download Reference Design у меня все заработало.

 

Изменено пользователем en-valb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/23/2023 at 3:19 PM, en-valb said:

Всем доброго дня!

Плата Tang Nano 9k c FPGA GW1NR-LV9QN88PC6/I5 ревизия C. Поднимаю SoC Cortex-M1. Пытаюсь запустить программу из User Flash. Для этого в настройках ядра Cortex-M1 вкладка Memory в разделе ITCM Select устанавливаю External Instruction Memory.

В keil соответственно прописываю для:

IROM1 -   Start 0x00000000,   Size 0x10000,

IRAM1 -  Start 0x20000000,   Size 0x8000.

image.png.f2607ec01f99b4d1ae295aacc5154cc0.png

Компилирую HW и SW в настройках Gowin Programmer указываю MCU Mode L и добавляю файлы *.fs и *.bin сохраняю. Все в соответствии с инструкцией Gowin_EMPU_M1 Download Reference Design на странице 15(17) глава 5 Embedded UserFlash Download.

Прошиваю ПЛИС, аппаратная часть запускается (видно по 4-м светодиодам которые подтянуты pull up), но программа не стартует. Флеш память подключаю через IP блок Gowin Flash Controller в настройках указываю шину AHB. Тут я интуитивно принял решение так как сигналы которые выпускает Cortex-M1 на внешнюю флешь соответствуют сигналам шины AHB. Возможно я здесь что то не правильно сделал. В инструкции ни чего по этому поводу не нашел. 

 В Gowin_EMPU_M1 Download Reference Design в разделе 5.3 Design Flow, в пункте 3 сказано "Instantiate UserFlash Controller (GW1N-9C/GW1NR-9C FLASH608K) Memory Map as the instruction memory of Gowin_EMPU_M1." Этот пункт я закрыл как писал выше Gowin Flash Controller-ом. Ссылка на проект.

`resetall

module Gowin_EMPU_M1_template (
  LED,
  TDI,
  TMS,
  TCK,
  TDO,
  UART1RXD,
  UART1TXD,
  HCLK,		//System Clock
  hwRstn	//System Reset
);

input HCLK;          // System clock
input hwRstn;        // System reset

//UART0
input UART1RXD;
output UART1TXD;

//JTAG
inout TDI;
inout TMS;
inout TCK;
inout TDO;

//LED
output [3:0] LED;

wire MCLK;            //mcu clock

Gowin_rPLL u_Gowin_rPLL
(
  .clkout(MCLK),    //output clkout 40MHz
  .clkin(HCLK)      //input clkin 50MHz
);


wire [31:0] EXTFLASH_HRDATA;
wire EXTFLASH_HREADY;
wire [1:0] EXTFLASH_HRESP;
wire [1:0] EXTFLASH_HTRANS;
wire [2:0] EXTFLASH_HSIZE;
wire EXTFLASH_HWRITE;
wire [31:0] EXTFLASH_HADDR;
wire [31:0] EXTFLASH_HWDATA;
wire EXTFLASH_HSEL;
wire EXTFLASH_HCLK;


Gowin_EMPU_M1_Top your_instance_name(
    .LOCKUP(), //output LOCKUP
    .HALTED(), //output HALTED
    .GPIOIN(16'h0000), //input [15:0] GPIOIN
    .GPIOOUT(LED), //output [15:0] GPIOOUT
    .GPIOOUTEN(), //output [15:0] GPIOOUTEN
    .JTAG_3(), //inout JTAG_3
    .JTAG_4(), //inout JTAG_4
    .JTAG_5(TDI), //inout JTAG_5
    .JTAG_6(), //inout JTAG_6
    .JTAG_7(TMS), //inout JTAG_7
    .JTAG_8(), //inout JTAG_8
    .JTAG_9(TCK), //inout JTAG_9
    .JTAG_10(), //inout JTAG_10
    .JTAG_11(), //inout JTAG_11
    .JTAG_12(), //inout JTAG_12
    .JTAG_13(TDO), //inout JTAG_13
    .JTAG_14(), //inout JTAG_14
    .JTAG_15(), //inout JTAG_15
    .JTAG_16(), //inout JTAG_16
    .JTAG_17(), //inout JTAG_17
    .JTAG_18(), //inout JTAG_18
    .UART0RXD(1'b0), //input UART0RXD
    .UART0TXD(), //output UART0TXD
    .UART1RXD(UART1RXD), //input UART1RXD
    .UART1TXD(UART1TXD), //output UART1TXD
    .TIMER0EXTIN(1'b0), //input TIMER0EXTIN
    .TIMER1EXTIN(1'b0), //input TIMER1EXTIN
    .EXTFLASH0HRDATA(EXTFLASH_HRDATA), //input [31:0] EXTFLASH0HRDATA
    .EXTFLASH0HREADYOUT(EXTFLASH_HREADY), //input EXTFLASH0HREADYOUT
    .EXTFLASH0HRESP(EXTFLASH_HRESP), //input [1:0] EXTFLASH0HRESP
    .EXTFLASH0HTRANS(EXTFLASH_HTRANS), //output [1:0] EXTFLASH0HTRANS
    .EXTFLASH0HBURST(), //output [2:0] EXTFLASH0HBURST
    .EXTFLASH0HPROT(), //output [3:0] EXTFLASH0HPROT
    .EXTFLASH0HSIZE(EXTFLASH_HSIZE), //output [2:0] EXTFLASH0HSIZE
    .EXTFLASH0HWRITE(EXTFLASH_HWRITE), //output EXTFLASH0HWRITE
    .EXTFLASH0HREADYMUX(), //output EXTFLASH0HREADYMUX
    .EXTFLASH0HMASTER(), //output [3:0] EXTFLASH0HMASTER
    .EXTFLASH0HMASTLOCK(), //output EXTFLASH0HMASTLOCK
    .EXTFLASH0HADDR(EXTFLASH_HADDR), //output [31:0] EXTFLASH0HADDR
    .EXTFLASH0HWDATA(EXTFLASH_HWDATA), //output [31:0] EXTFLASH0HWDATA
    .EXTFLASH0HSEL(EXTFLASH_HSEL), //output EXTFLASH0HSEL
    .EXTFLASH0HCLK(EXTFLASH_HCLK), //output EXTFLASH0HCLK
    .EXTFLASH0HRESET(EXTFLASH_HRESETn), //output EXTFLASH0HRESET
    .HCLK(MCLK), //input HCLK
    .hwRstn(hwRstn) //input hwRstn
);


Gowin_Flash_Controller_Top program_flash_memory (
    .AHB_HRDATA(EXTFLASH_HRDATA), //output [31:0] AHB_HRDATA
    .AHB_HREADY(EXTFLASH_HREADY), //output AHB_HREADY
    .AHB_HRESP(EXTFLASH_HRESP), //output [1:0] AHB_HRESP
    .AHB_HTRANS(EXTFLASH_HTRANS), //input [1:0] AHB_HTRANS
    .AHB_HSIZE(EXTFLASH_HSIZE), //input [2:0] AHB_HSIZE
    .AHB_HWRITE(EXTFLASH_HWRITE), //input AHB_HWRITE
    .AHB_HADDR(EXTFLASH_HADDR), //input [31:0] AHB_HADDR
    .AHB_HWDATA(EXTFLASH_HWDATA), //input [31:0] AHB_HWDATA
    .AHB_HSEL(EXTFLASH_HSEL), //input AHB_HSEL
    .AHB_HCLK(EXTFLASH_HCLK), //input AHB_HCLK
    .AHB_HRESETn(EXTFLASH_HRESETn) //input AHB_HRESETn
);


endmodule

Что я мог здесь пропустить?

BSRAM в качестве ITCM в соответствии с главой 2 инструкции Gowin_EMPU_M1 Download Reference Design у меня все заработало.

 

 

Заработало! В  инструкции Gowin_EMPU_M1 Download Reference Design есть ссылка  на архив с разными проектами там есть в папке solution проект DK_START_GW1N9_V1.1 с контроллером flash памяти. В проекте DK_START_GW1N9_V1.1  есть файл userflash_controller.v необходимо этот файл включить в проект вместо IP Gowin Flash Controller. Почему то в IP Core Generator Gowin Flash Controller не поддерживает режим отображения памяти. Хотя в описании ядра написано "...and AHB Bus interface is to connect AHB Bus in MCU with AHB Bus, as an instruction memory or data storage for MCU...". Ссылка на проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне СЛУЧАЙНО удалось загрузить прошивку МК без инстантинации контроллера флеш. При генерации IP EMPU-M1 оставляем ITCM без инициализации (сколько надо кб). Потом просто программируем в режиме MCU mode L. И всё работает. Получается не документированная фича какая-то. Я искал способ прошивки МК без снижения частоты, которое происходит при введении этого флеш контроллера (у меня 25 Мгц с дебагом). (Способ с merge-bit как для GW2A не работает)

Интересно, что область памяти, где флеш (начиная с адреса 0x0), можно затирать через отладчик. Но после выключения питания всё возвращается обратно. То есть каким-то образом режим MCU mode L умеет заводить прошивку МК в ITCM память и сразу прошивать в конфигурационный флеш плис. Только что при этом содержит User Flash пока не могу посмотреть.

Изменено пользователем Dimitrius

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ложная тревога. Оказалось, что отладчик J_link загружает код в MCU через Keil, хотя пишет, что no flash operation selected. Но это тоже плюс, работать можно быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...