Skocz do zawartości

AVR Soft-CPU (ATMega103) - projekt Vivado dla FPGA Artix7


FlyingDutch

Pomocna odpowiedź

Cześć,

postanowiłem zaimplementować na jednej z moich płytek FPGA - CmodA7 (z układem Artix7)  soft-procesor zgodny z rdzeniem ATmega103 i posiadający całkiem sporo układów peryferyjnych.

Oto strona projektu na portalu opencores.org:

https://opencores.org/projects/avr_core

UWAGA! - po pobraniu archiwum ze strony projektu znajdziemy dwie implementacje avr-core: w katalogu "trunk" -wersja 14 (Verilog) i w katalogu "web uploads" wersja 8 (VHDL). Ja wybrałem do implementacji wersję 8 VHDL. Oto zawartość katalogów ze źródłami dla wersji 8:

Catalogs01.thumb.png.8210cbcc976e4d3535c9e6308c73586c.png

Projekt jest dość leciwy i był zaimplementowany na starym układzie FPGA Virtex Xilinx'a. Niestety w plikach źródłowych były użyte prymitywy Xilinx'a dla układu Virtex (bloki pamięci BRAM 4K i magistarali 8 bit) co powodowało około 70-ciu błędów na etapie syntezy (bloki te nazywały się RAMB4_S8). Bloki pamięci Virtex'a zostały przeze mnie zastąpione blokami pamięci o identycznej budowie IP-Core Xilinx Vivado (BRAM memory), tak , że nie ma już żadnych błędów podczas fazy syntezy. UWAGA!:  projekt zajmuje 96 procent pamięci BRAM dla kostki FPGA Artix7 z płytki CmodA7 i z powodu potrzebnej ilości pamięci BRAM nie da się zaimplementować na płytkach Elbert v.2 (Spartan3) lub Mimas v.2 (spartan6).

Tutaj link do użytej przeze mnie w projekcie płytki FPGA Digilent CmodA7:

https://reference.digilentinc.com/reference/programmable-logic/cmod-a7/start?redirect=1id=cmod_a7/cm

Miałem też podczas fazy implementacji błąd routingu zegara dla modułu JTAG, aby go rozwiązać musiałem użyć dyrektywy:

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets TCK_IBUF]

W pliku user constraints (xdc) - tutaj pełna zawartość tego pliku dla płytki FPGA CmodA7:

## Clock signal 12 MHz
set_property -dict { PACKAGE_PIN L17   IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_14 Sch=gclk
create_clock -add -name sys_clk_pin -period 83.33 -waveform {0 41.66} [get_ports {clk}];

## Buttons
set_property -dict { PACKAGE_PIN A18   IOSTANDARD LVCMOS33 } [get_ports { nrst }]; #IO_L19N_T3_VREF_16 Sch=btn[0]

## GPIO Pins
## Pins 15 and 16 should remain commented if using them as analog inputs
set_property -dict { PACKAGE_PIN M3    IOSTANDARD LVCMOS33 } [get_ports { rxd }]; #IO_L8N_T1_AD14N_35 Sch=pio[01]
set_property -dict { PACKAGE_PIN L3    IOSTANDARD LVCMOS33 } [get_ports { txd }]; #IO_L8P_T1_AD14P_35 Sch=pio[02]

set_property -dict { PACKAGE_PIN A16   IOSTANDARD LVCMOS33 } [get_ports { porta[7] }]; #IO_L12P_T1_MRCC_16 Sch=pio[03]
set_property -dict { PACKAGE_PIN K3    IOSTANDARD LVCMOS33 } [get_ports { porta[6] }]; #IO_L7N_T1_AD6N_35 Sch=pio[04]
set_property -dict { PACKAGE_PIN C15   IOSTANDARD LVCMOS33 } [get_ports { porta[5] }]; #IO_L11P_T1_SRCC_16 Sch=pio[05]
set_property -dict { PACKAGE_PIN H1    IOSTANDARD LVCMOS33 } [get_ports { porta[4] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=pio[06]
set_property -dict { PACKAGE_PIN A15   IOSTANDARD LVCMOS33 } [get_ports { porta[3] }]; #IO_L6N_T0_VREF_16 Sch=pio[07]
set_property -dict { PACKAGE_PIN B15   IOSTANDARD LVCMOS33 } [get_ports { porta[2] }]; #IO_L11N_T1_SRCC_16 Sch=pio[08]
set_property -dict { PACKAGE_PIN A14   IOSTANDARD LVCMOS33 } [get_ports { porta[1] }]; #IO_L6P_T0_16 Sch=pio[09]
set_property -dict { PACKAGE_PIN J3    IOSTANDARD LVCMOS33 } [get_ports { porta[0] }]; #IO_L7P_T1_AD6P_35 Sch=pio[10]

set_property -dict { PACKAGE_PIN J1    IOSTANDARD LVCMOS33 } [get_ports { portb[7] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=pio[11]
set_property -dict { PACKAGE_PIN K2    IOSTANDARD LVCMOS33 } [get_ports { portb[6] }]; #IO_L5P_T0_AD13P_35 Sch=pio[12]
set_property -dict { PACKAGE_PIN L1    IOSTANDARD LVCMOS33 } [get_ports { portb[5] }]; #IO_L6N_T0_VREF_35 Sch=pio[13]
set_property -dict { PACKAGE_PIN L2    IOSTANDARD LVCMOS33 } [get_ports { portb[4] }]; #IO_L5N_T0_AD13N_35 Sch=pio[14]
set_property -dict { PACKAGE_PIN M1    IOSTANDARD LVCMOS33 } [get_ports { portb[3] }]; #IO_L9N_T1_DQS_AD7N_35 Sch=pio[17]
set_property -dict { PACKAGE_PIN N3    IOSTANDARD LVCMOS33 } [get_ports { portb[2] }]; #IO_L12P_T1_MRCC_35 Sch=pio[18]
set_property -dict { PACKAGE_PIN P3    IOSTANDARD LVCMOS33 } [get_ports { portb[1] }]; #IO_L12N_T1_MRCC_35 Sch=pio[19]
set_property -dict { PACKAGE_PIN M2    IOSTANDARD LVCMOS33 } [get_ports { portb[0] }]; #IO_L9P_T1_DQS_AD7P_35 Sch=pio[20]

set_property -dict { PACKAGE_PIN N1    IOSTANDARD LVCMOS33 } [get_ports { INTx[7] }]; #IO_L10N_T1_AD15N_35 Sch=pio[21]
set_property -dict { PACKAGE_PIN N2    IOSTANDARD LVCMOS33 } [get_ports { INTx[6] }]; #IO_L10P_T1_AD15P_35 Sch=pio[22]
set_property -dict { PACKAGE_PIN P1    IOSTANDARD LVCMOS33 } [get_ports { INTx[5] }]; #IO_L19N_T3_VREF_35 Sch=pio[23]
set_property -dict { PACKAGE_PIN R3    IOSTANDARD LVCMOS33 } [get_ports { INTx[4] }]; #IO_L2P_T0_34 Sch=pio[26]
set_property -dict { PACKAGE_PIN T3    IOSTANDARD LVCMOS33 } [get_ports { INTx[3] }]; #IO_L2N_T0_34 Sch=pio[27]
set_property -dict { PACKAGE_PIN R2    IOSTANDARD LVCMOS33 } [get_ports { INTx[2] }]; #IO_L1P_T0_34 Sch=pio[28]
set_property -dict { PACKAGE_PIN T1    IOSTANDARD LVCMOS33 } [get_ports { INTx[1] }]; #IO_L3P_T0_DQS_34 Sch=pio[29]
set_property -dict { PACKAGE_PIN T2    IOSTANDARD LVCMOS33 } [get_ports { INTx[0] }]; #IO_L1N_T0_34 Sch=pio[30]

set_property -dict { PACKAGE_PIN U1    IOSTANDARD LVCMOS33 } [get_ports { TMS }]; #IO_L3N_T0_DQS_34 Sch=pio[31]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets TCK_IBUF]
set_property -dict { PACKAGE_PIN W2    IOSTANDARD LVCMOS33 } [get_ports { TCK }]; #IO_L5N_T0_34 Sch=pio[32]
set_property -dict { PACKAGE_PIN V2    IOSTANDARD LVCMOS33 } [get_ports { TDI }]; #IO_L5P_T0_34 Sch=pio[33]
set_property -dict { PACKAGE_PIN W3    IOSTANDARD LVCMOS33 } [get_ports { TDO }]; #IO_L6N_T0_VREF_34 Sch=pio[34]
set_property -dict { PACKAGE_PIN V3    IOSTANDARD LVCMOS33 } [get_ports { TRSTn }]; #IO_L6P_T0_34 Sch=pio[35]

zmieniając zawartość pliku "user constraint" w projekcie (i typ FPGA w właściwościach projektu) powinno się dać uruchomić ten projekt na innych płytkach FPGA z ukłądem Artix7 (np. Arty).

Podejrzewam, że bład routingu zegara dla JTAG (pin TCK z top entity) może być specyficzny dla mojej płytki FPGA. Tak więc zamieszczam pełny syntetyzujący się bez błędów projekt AVR core w Vivado2018.2. Chciałbym jak najszybciej wypróbować ten projekt na zestawie FPGA, ale do wczytania programu do soft procesora AVR jest potrzebny programator JTAG dla układów AVR, którego aktualnie nie mam dostępnego.

Jeśli komuś chciałoby się wypróbować ten soft-procesor (z jakimś prostym programem dla AVR) i opisać to byłbym bardzo wdzięczny 😀

Ja będę to robił za parę dni jak będę miał dostęp do programatora JTAG dla AVR i wrócę z wyjazdu służbowego. Później chciałbym użyć tego CPU do wypróbowania "Vivado HLS" i przetłumaczenia kilku bibliotek dla Arduino (w języku C++) na VHDL, oraz rozbudowy tego układu AVR o układ VGA z możliwością wyświetlania danych alfa-numerycznych na ekranie monitora.

Tutaj opis portów top entity projektu:

entity top_avr_core_v8 is port(
                               nrst   : in    std_logic;
                               clk    : in    std_logic;
                               porta  : inout std_logic_vector(7 downto 0);
                               portb  : inout std_logic_vector(7 downto 0);
	                           -- UART 
	                           rxd    : in    std_logic;
	                           txd    : out   std_logic;
							   -- External interrupts
							   INTx   : in    std_logic_vector(7 downto 0); 
							   -- JTAG related signals
	                           TMS    : in    std_logic;
                               TCK	  : in    std_logic;
                               TDI    : in    std_logic;
                               TDO    : out   std_logic;
	                           TRSTn  : in    std_logic -- Optional JTAG input
							   );
end top_avr_core_v8;

A tutaj screen z Vivado po implementacji projektu:

VivadoImplOK.thumb.png.cea07b6dff916330f13d386363f766f7.png

No tak wszystko jest tylko nie dodałem projektu Vivado (2018.2). Robię to teraz:

AVR_ATMega103_SoftCPU01.zip

BTW: za jakiś czas będę też próbował zaimplementować ten "AVR Core" dla taniego zestawu FPGA Intela "CoreEP4CE10" z układem  Altera Cyclone IV  - patrz link:

https://kamami.pl/zestawy-uruchomieniowe/561809-coreep4ce10-plytka-z-ukladem-fpga-altera-ep4ce10f17c8n-z-rodziny-cyclone-iv.html

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 2
Link do komentarza
Share on other sites

(edytowany)

Cześć,

rozwiązałem problem z pinem zegara dla programatora JTAG. Przeniosłem pin TCK z lokalizacji :

set_property -dict { PACKAGE_PIN W2    IOSTANDARD LVCMOS33 } [get_ports { TCK }]; #IO_L5N_T0_34 Sch=pio[32]

na pin W5 Artix'a (pin 36 GPIO) - jest to pin typu  MRCC i ma odpowiedni routing pomiędzy zegarem a portem I/O:

set_property -dict { PACKAGE_PIN W5    IOSTANDARD LVCMOS33 } [get_ports { TCK }]; #IO_L12P_T1_MRCC_34 Sch=pio[36]

Teraz mogłem z pliku 'user constraints" xdc usunąć dyrektywę:

#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets TCK_IBUF]

i nie ma żadnych ostrzeżeń związanych z pinem zegara dla programatora JTAG. Tak więc poprawny plik "user constraints" xdc dla mojej płytki FPGA jest następujący:

## Clock signal 12 MHz
set_property -dict { PACKAGE_PIN L17   IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_14 Sch=gclk
create_clock -add -name sys_clk_pin -period 83.33 -waveform {0 41.66} [get_ports {clk}];

## Buttons
set_property -dict { PACKAGE_PIN A18   IOSTANDARD LVCMOS33 } [get_ports { nrst }]; #IO_L19N_T3_VREF_16 Sch=btn[0]

## GPIO Pins
## Pins 15 and 16 should remain commented if using them as analog inputs
set_property -dict { PACKAGE_PIN M3    IOSTANDARD LVCMOS33 } [get_ports { rxd }]; #IO_L8N_T1_AD14N_35 Sch=pio[01]
set_property -dict { PACKAGE_PIN L3    IOSTANDARD LVCMOS33 } [get_ports { txd }]; #IO_L8P_T1_AD14P_35 Sch=pio[02]

set_property -dict { PACKAGE_PIN A16   IOSTANDARD LVCMOS33 } [get_ports { porta[7] }]; #IO_L12P_T1_MRCC_16 Sch=pio[03]
set_property -dict { PACKAGE_PIN K3    IOSTANDARD LVCMOS33 } [get_ports { porta[6] }]; #IO_L7N_T1_AD6N_35 Sch=pio[04]
set_property -dict { PACKAGE_PIN C15   IOSTANDARD LVCMOS33 } [get_ports { porta[5] }]; #IO_L11P_T1_SRCC_16 Sch=pio[05]
set_property -dict { PACKAGE_PIN H1    IOSTANDARD LVCMOS33 } [get_ports { porta[4] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=pio[06]
set_property -dict { PACKAGE_PIN A15   IOSTANDARD LVCMOS33 } [get_ports { porta[3] }]; #IO_L6N_T0_VREF_16 Sch=pio[07]
set_property -dict { PACKAGE_PIN B15   IOSTANDARD LVCMOS33 } [get_ports { porta[2] }]; #IO_L11N_T1_SRCC_16 Sch=pio[08]
set_property -dict { PACKAGE_PIN A14   IOSTANDARD LVCMOS33 } [get_ports { porta[1] }]; #IO_L6P_T0_16 Sch=pio[09]
set_property -dict { PACKAGE_PIN J3    IOSTANDARD LVCMOS33 } [get_ports { porta[0] }]; #IO_L7P_T1_AD6P_35 Sch=pio[10]

set_property -dict { PACKAGE_PIN J1    IOSTANDARD LVCMOS33 } [get_ports { portb[7] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=pio[11]
set_property -dict { PACKAGE_PIN K2    IOSTANDARD LVCMOS33 } [get_ports { portb[6] }]; #IO_L5P_T0_AD13P_35 Sch=pio[12]
set_property -dict { PACKAGE_PIN L1    IOSTANDARD LVCMOS33 } [get_ports { portb[5] }]; #IO_L6N_T0_VREF_35 Sch=pio[13]
set_property -dict { PACKAGE_PIN L2    IOSTANDARD LVCMOS33 } [get_ports { portb[4] }]; #IO_L5N_T0_AD13N_35 Sch=pio[14]
set_property -dict { PACKAGE_PIN M1    IOSTANDARD LVCMOS33 } [get_ports { portb[3] }]; #IO_L9N_T1_DQS_AD7N_35 Sch=pio[17]
set_property -dict { PACKAGE_PIN N3    IOSTANDARD LVCMOS33 } [get_ports { portb[2] }]; #IO_L12P_T1_MRCC_35 Sch=pio[18]
set_property -dict { PACKAGE_PIN P3    IOSTANDARD LVCMOS33 } [get_ports { portb[1] }]; #IO_L12N_T1_MRCC_35 Sch=pio[19]
set_property -dict { PACKAGE_PIN M2    IOSTANDARD LVCMOS33 } [get_ports { portb[0] }]; #IO_L9P_T1_DQS_AD7P_35 Sch=pio[20]

set_property -dict { PACKAGE_PIN N1    IOSTANDARD LVCMOS33 } [get_ports { INTx[7] }]; #IO_L10N_T1_AD15N_35 Sch=pio[21]
set_property -dict { PACKAGE_PIN N2    IOSTANDARD LVCMOS33 } [get_ports { INTx[6] }]; #IO_L10P_T1_AD15P_35 Sch=pio[22]
set_property -dict { PACKAGE_PIN P1    IOSTANDARD LVCMOS33 } [get_ports { INTx[5] }]; #IO_L19N_T3_VREF_35 Sch=pio[23]
set_property -dict { PACKAGE_PIN R3    IOSTANDARD LVCMOS33 } [get_ports { INTx[4] }]; #IO_L2P_T0_34 Sch=pio[26]
set_property -dict { PACKAGE_PIN T3    IOSTANDARD LVCMOS33 } [get_ports { INTx[3] }]; #IO_L2N_T0_34 Sch=pio[27]
set_property -dict { PACKAGE_PIN R2    IOSTANDARD LVCMOS33 } [get_ports { INTx[2] }]; #IO_L1P_T0_34 Sch=pio[28]
set_property -dict { PACKAGE_PIN T1    IOSTANDARD LVCMOS33 } [get_ports { INTx[1] }]; #IO_L3P_T0_DQS_34 Sch=pio[29]
set_property -dict { PACKAGE_PIN T2    IOSTANDARD LVCMOS33 } [get_ports { INTx[0] }]; #IO_L1N_T0_34 Sch=pio[30]

set_property -dict { PACKAGE_PIN U1    IOSTANDARD LVCMOS33 } [get_ports { TMS }]; #IO_L3N_T0_DQS_34 Sch=pio[31]
set_property -dict { PACKAGE_PIN W5    IOSTANDARD LVCMOS33 } [get_ports { TCK }]; #IO_L12P_T1_MRCC_34 Sch=pio[36]
set_property -dict { PACKAGE_PIN V2    IOSTANDARD LVCMOS33 } [get_ports { TDI }]; #IO_L5P_T0_34 Sch=pio[33]
set_property -dict { PACKAGE_PIN W3    IOSTANDARD LVCMOS33 } [get_ports { TDO }]; #IO_L6N_T0_VREF_34 Sch=pio[34]
set_property -dict { PACKAGE_PIN V3    IOSTANDARD LVCMOS33 } [get_ports { TRSTn }]; #IO_L6P_T0_34 Sch=pio[35]

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 1
Link do komentarza
Share on other sites

Cześć,

mały update: oryginalnie ATMega103 nie miała interfejsu programowania JTAG, więc ten soft-procesor najprawdopodobniej trzeba programować jako ATMega128 (ATMega103 i ATMega128 są do siebie bardzo podobne i ATMege128 można za pomocą fuse-bits ustawić w trybie zgodności z ATMega103). Niestety obowiązki w pracy i brak czasu nie pozwoliły mi jeszcze tego sprawdzić.

Pozdrawiam

  • Lubię! 2
Link do komentarza
Share on other sites

(edytowany)

Cześć,

dopiero dzisiaj dotarł do mnie klon programatora/debuggera ICE/JTAG dla MCU AVR kupiony na AliExpress. To taki model:

https://www.aliexpress.com/item/32871295257.html?spm=a2g0s.9042311.0.0.38364c4dJomjd4

Niestety wcześniej nie posiadałem żadnego programatora JTAG dla procesorów AVR (przez epidemię koronawirusa paczka była mocno opóżniona). Dzisiaj spróbuję zaprogramować ten soft-processor na zestawie FPGA CmodA7. Przewiduję sporo trudności bo jest to dość zabytkowy model programatora (jak i sama AtMega128 jest leciwa) i nie wiem jaka wersja kompilatora będzie poprawnie obsługiwała ten programator.

Pozdrawiam

BTW: robiłem próby z Arduino i "MegaCore", ale na razie nieudało mi się zaprogramować "AVR core".

Edytowano przez FlyingDutch
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Cześć,

walczę dalej z zaprogramowaniem AVR-core za pomocą programatora opisanego w poście powyżej(klon ICE JTAG AVR) i ArduinoIDE pod Windows10. Dla wersji ArduinoIDE  niższej niż 1.9.0 Beta - ArduinoIDE "nie widzi" programatora. Dla wersji Arduino 1.9.0 beta mam następujący błąd:

Cytat

avrdude: Version 6.3, compiled on Dec 16 2016 at 13:33:19
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\mgabr\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf"

         Using Port                    : usb
         Using Programmer              : atmelice_isp
avrdude: jtag3_open_common(): Did not find any device matching VID 0x03eb and PID list: 0x2141

avrdude done.  Thank you.

An error occurred while uploading the sketch

Tutaj zrzut ekranu:

Arduino9.thumb.png.2c86bb6c46ad7a3f411ebd44a78a0215.png

Dla informacji - programator JTAG ICE podłączony do zestawu FPGA poprzez translatory poziomów logicznych. Poprawiłem też obsługę pinu "nrst" (reset AVR-core), dałem zewnętrzny rezystor 10 K jako "pulldown" do masy i przeniosłem ten sygnał na zewnętrzny pin (reset poziomem wysokim). Jest to zmiana jednej linijki w pliku constraints:

## Buttons
set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports { nrst }]; #IO_L19P_T3_34 Sch=pio[45]

Co do samego programowania to edytowałem plik konfiguracyjny "avrdude.conf" zmieniając VID i PID (USB) dla mojego programatora (odczytane z Managera urządzeń Windows) ale te próby nie zakończyły się powodzeniem.

Aktualnie planuję następujące działania:

1) Spróbować zaprogramować AVR-Core pod Linuksem korzystając z Arduino

2) Poszukać jakiejś starszej wersji "AVR Studio" i spróbować z niego zaprogramować układ (Windows)

Jeśli komuś nasuwają się jakieś uwagi, lub podpowiedzi będę wdzięczny za podzielenie się nimi.

Pozdrawiam

mały update:

1) Linux na razie odpada bo definitywnie padł mi dysk z partycjami Linuksowymi

2) Zrobiłem próbę z Windows 7 (64) na VirtualBox'ie : zainstalowałem driver do "Atmel JTAG ICE" i "AVR Studio 4.13" skomplilowałem program "Blink" i próbowałem uruchomić "Debug'a" z "AVR Studio" - niestety ten sam problem co z Arduino  (PID urządzenia się nie zgadza) - patrz zrzut ekranu:

Win7AVRStu4_01.thumb.png.eb4fa2970e544e270be9c4069cefa7d0.png

Ma ktoś pomysł jak to obejść ?

Update 2:

Po próbach z kilkoma sterownikami, kilkoma wersjami "AVR Studio" i grzebaniu w plikach konfiguracy6jnych "avrdude" (Arduino) doszedłem do wniosku, że nie obejdzie się bez zmian w kodzie źródłowym programu "AVRDude" i jego kompilacji. Ewidentnie ten chiński klon "AVR JTAG ICE" ma inne ID sprzętu niż oryginalny programator a właśnie "AVRDude" oraz "AVR Studio" oczekują konkretnych ID sprzętowych (zmiany w pliku konfiguracyjnym avrdude nie usuwają problemu).

Pobrałem źródła "AVRDude" z tej strony i je analizuję:

http://download.savannah.gnu.org/releases/avrdude/

Tutaj strona projektu "AVRDude":

https://savannah.nongnu.org/projects/avrdude/

Pobrałem wersję avrdude 6.3 z podanej wyżej strony. W pliku źródłowym "jtag3.c" (Fragment zaczynający się od linii 1322) znalazłem komunikat wyświetlany przez ArduinoIDE:

  if (strncmp(port, "usb", 3) != 0) {
    avrdude_message(MSG_INFO, "%s: jtag3_open_common(): JTAGICE3/EDBG port names must start with \"usb\"\n",
                    progname);
    return -1;
  }

  serdev = &usb_serdev_frame;
  if (pgm->usbvid)
    pinfo.usbinfo.vid = pgm->usbvid;
  else
    pinfo.usbinfo.vid = USB_VENDOR_ATMEL;

  /* If the config entry did not specify a USB PID, insert the default one. */
  if (lfirst(pgm->usbpid) == NULL)
    ladd(pgm->usbpid, (void *)USB_DEVICE_JTAGICE3);

  for (usbpid = lfirst(pgm->usbpid); rv < 0 && usbpid != NULL; usbpid = lnext(usbpid)) {
    pinfo.usbinfo.flags = PINFO_FL_SILENT;
    pinfo.usbinfo.pid = *(int *)(ldata(usbpid));
    pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_3;
    pgm->fd.usb.rep = USBDEV_BULK_EP_READ_3;
    pgm->fd.usb.wep = USBDEV_BULK_EP_WRITE_3;
    pgm->fd.usb.eep = USBDEV_EVT_EP_READ_3;

    strcpy(pgm->port, port);
    rv = serial_open(port, pinfo, &pgm->fd);
  }
  if (rv < 0) {
    avrdude_message(MSG_INFO, "%s: jtag3_open_common(): Did not find any device matching VID 0x%04x and PID list: ",
                    progname, (unsigned)pinfo.usbinfo.vid);
    int notfirst = 0;
    for (usbpid = lfirst(pgm->usbpid); usbpid != NULL; usbpid = lnext(usbpid)) {
      if (notfirst)
        avrdude_message(MSG_INFO, ", ");
      avrdude_message(MSG_INFO, "0x%04x", (unsigned int)(*(int *)(ldata(usbpid))));
      notfirst = 1;
    }
    fputc('\n', stderr);

    return -1;
  }

Podejrzewam, że ten if jest odpowiedzialny za niepowodzenie moich prób z edycją pliku konfiguracyjnego:

 if (pgm->usbvid)
    pinfo.usbinfo.vid = pgm->usbvid;
  else
    pinfo.usbinfo.vid = USB_VENDOR_ATMEL;

, jak widać jest tu nadawany VID Atmel'a (chyba warunek z jakichś powodów nie był spełniony, chociaż w pliku konfiguracyjnym avrdude podawałem VID mojego programatora).  Muszę jeszcze znaleźć jakiś opis jak skompilować te żródła pod Windows.

Dzisiaj niestety muszę na tym zakończyć, ale będę drążył temat od poniedziałku.

BTW:  nie rozumiem dlaczego z tymi darmowymi projektami Soft-procesorów jest tak trudno: z projektem RISC-V to była droga przez mękę, a teraz z tym "AVR Core" jest podobnie. Nie orientuje się ktoś, czy są jakieś komercyjne IP-Core z soft-procesorami AVR dostępnymi dla FPGA Xilinx'a lub Intel'a ?

Pozdrawiam

 

 

Edytowano przez FlyingDutch
Update
  • Lubię! 2
Link do komentarza
Share on other sites

(edytowany)

Cześć,

dzisiaj spróbowałem skompilować program do obsługi programatorów dla MCU AVR "avrdude" ze źródeł (dla Windows10 - ale wersja programu 32-bit). Źródła "avrdude" (wersja 6.3) pobrałem z tej strony WWW:

http://download.savannah.gnu.org/releases/avrdude/

A kompilację przeprowadziłem według tego tutoriala:

https://tomeko.net/other/avrdude/building_avrdude.php?lang=en

Wszystko przebiegło bez problemów (screenshot po ./configure):

AVRDudeKompil.thumb.png.6ed5b4f642979bd210067c4b491db2e0.png

Sama kompilacja (polecenie make) zajęła kilka minut, ale skompilowany program "avrdude.exe" został stworzony zgodnie z oczekiwaniami. Tutaj screenshot z testowego uruchomienia (środowisko MINGW32) skompilowanego "avrdude" exe:

AVRDudeAfterKompil.thumb.png.bba0736a7f90d7dda2582f79b58bf682.png

Teraz będę próbował osadzić tą wersję "avrdude.exe" w ArduinoIDE i sprawdzić, czy działa poprawnie (jeśli tak to będę edytował kod źródłówy). Program "avrdude" został skompilowany z symbolami debugger'a, zastanawiam się tylko jakiego debuggera można by użyć ? w MINGW mam zainstalowany "gdb", tylko nie wiem jak to połączyć z pracą "avrdude" razem z ArduinoIDE (pod kontrolą Windows)?

Gdy będę miał jakieś rezultaty to napiszę w tym wątku.

Pozdrawiam

Update1: Pierwsze próby przeprowadzone ze skompilowaną ze źródeł wersją "avrdude"(6.3)  z ArduinoIDE (1.9.0 beta) wskazują, że ta wersja działa poprawnie (OS Windows10 64-bit).

 

Edytowano przez FlyingDutch
Link do komentarza
Share on other sites

(edytowany)

Cześć,

bardzo powoli posuwam się do przodu, teraz "avrdude" przynajmniej poprawnie rozpoznaje chińskiego klona "AVR JTAG-ICE". Teraz korzystając z tej skompilowanej przeze mnie (ze źródeł) wersji "avrdude" mam błąd podczas próby wysyłania pakietu do urządzenia:

avrdude: Version 6.3, compiled on Mar 14 2020 at 11:11:00
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\mgabr\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf"

         Using Port                    : usb
         Using Programmer              : jtag3
         Setting bit clk period        : 0.1
pgm->usbvid=0x1a86   pgm->usbpid=0x283c150 "
avrdude: usbdev_open(): Found USB2.0-Serial, serno: ?
avrdude: max packet size expected 512, but found 32 due to EP 0x82's wMaxPacketSize
avrdude: usbdev_send(): wrote -22 out of 7 bytes, err = libusb0-dll:err [submit_async] submitting request failed, win error: The parameter is incorrect.


avrdude: jtag3_send(): failed to send command to serial port

avrdude done.  Thank you.

the selected serial port 
 does not exist or your board is not connected
  

Błąd: 

avrdude: usbdev_send(): wrote -22 out of 7 bytes, err = libusb0-dll:err
 /*
   * Split the frame into multiple packets.  It's important to make
   * sure we finish with a short packet, or else the device won't know
   * the frame is finished.  For example, if we need to send 64 bytes,
   * we must send a packet of length 64 followed by a packet of length
   * 0.
   */
  do {
    tx_size = (mlen < fd->usb.max_xfer)? mlen: fd->usb.max_xfer;
    if (fd->usb.use_interrupt_xfer)
      rv = usb_interrupt_write(udev, fd->usb.wep, (char *)bp, tx_size, 10000);
    else
      rv = usb_bulk_write(udev, fd->usb.wep, (char *)bp, tx_size, 10000);
    if (rv != tx_size)
    {
        avrdude_message(MSG_INFO, "%s: usbdev_send(): wrote %d out of %d bytes, err = %s\n",
                progname, rv, tx_size, usb_strerror());
        return -1;
    }
    bp += tx_size;
    mlen -= tx_size;
  } while (mlen > 0);

Jest w tym fragmencie kodu pliku źród.: usb_libusb.c (od linii 342)

Edytowano przez FlyingDutch
Link do komentarza
Share on other sites

Cześć,

dzisiaj zrobiłem próby z płytką uruchomieniową z ATMega128 i mogę stwierdzić, że nie są to błędy w implementacji procesora na układzie FPGA, ani błędnie działający klon programatora. Są to błędy w oprogramowaniu pod Windows 10 - niestety nie mogę na 100 % stwierdzić, czy to błąd w programie avrdude, czy bibliotece usblib, czy może w narzędziu "pyserial" (napisanym w Pythonie). Niestety chwilowo nie mam działającego Linuksa (padł mi dysk z Linuksem), żeby sprawdzić, czy tam działa wszystko poprawnie.

Pozdrawiam

Link do komentarza
Share on other sites

19 godzin temu, eggedgdg napisał:

Cześć, czy realizowałeś już może ten projekt dla EP4CE10?

Cześć,

nie - robiłem to na płytce z FPGA Xilinx's Artix7. Teraz jest już dostępny lepszy IPCore z Soft_procesorami AVR - zobacz ten link:

https://opencores.org/projects/attiny_atmega_xmega_core

Jeśli chcesz zrobić sobie Soft-CPU z AVR to lepiej spróbuj ze źródłami do tego ostatniego projektu z GITHUB'a.Ten ostatni projekt jest bardziej dopracowany i ma udostępniony boot-loader.

Pozdrawiam

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.