Mengapa saya melihat "Notch" yang aneh pada saluran data untuk beberapa pengguna logis?


15

Saya sedang mencoba untuk membangun komputer homebrew Z80 untuk bersenang-senang retrocomputing dan untuk belajar sendiri dasar desain elektronik. Untuk pembuktian konsep, saya sudah berhasil membuat sistem dasar pada papan tempat memotong roti di minggu-minggu sebelumnya.

Prototipe saat ini sangat sederhana. Saya menggunakan kristal 4 MHz yang digerakkan oleh osilator Pierce 74HCT04 sebagai jam sistem, dua kait 74HCT573 dalam mode transparan ( LEtinggi) sebagai penyangga untuk bus alamat 16-bit, dua 74HCT573 lainnya dalam arah yang berlawanan dikendalikan oleh RDdan NOT RDsebagai data dua arah buffer bus. Saya memasang EEPROM AT28C256 100 ns (hanya 16-KiB yang diterjemahkan) dan dua chip SRAM 150 ns 8-KiB ke bus sistem. Saya menggunakan 74HCT42 untuk menghasilkan CSsinyal dan OEmenghubungkan EEPROM ke rendah, WEke tinggi, hanya menyisakan satu sinyal CS untuk mengontrol EEPROM.

Segala sesuatu di papan tempat memotong roti berisik, tetapi sistem tampaknya beroperasi penuh setelah saya menyelesaikan setiap tahap. Sekarang dapat mengambil instruksi dari EEPROM, membaca dan menulis data dari / ke SRAM, dan memiliki port serial yang dibuat dari kait 74HCT573 lainnya, D0terhubung ke D0, LEadalah (NOT (IOREQ NAND WR)), output keluar dari Q1, dengan kata lain, hanya satu port output tanpa logika decoding adrress. Saya telah menulis program benchmark intensif CPU / RAM dan komputer saya dapat menampilkan hasil yang diharapkan. Memdumps juga menunjukkan bahwa Z80 dapat membaca semua byte dari EEPROM dengan benar, sehingga semuanya berfungsi.

Tetapi ketika saya mencoba untuk menyelidiki D0pin dari bus data, saya melihat beberapa "takik" yang aneh untuk beberapa output logis 1.

Contoh Weird Notches pada D0

dan mereka tampaknya selalu muncul untuk beberapa logis 1 tak lama setelah CSsinyal EEPROM menjadi aktif, misalnya, inilah tangkapan takik aneh yang ditumpangkan pada sinyal CS EEPROM biru.

Notch Aneh ditumpangkan pada sinyal CS

Saya mencoba mengisolasi masalahnya, jadi saya mengaitkan semua pin CS dari SRAM ke HIGH, secara efektif mengeluarkannya dari sistem, dan saya telah menulis program uji sederhana yang tidak memiliki akses memori.

.org 0x00
    di

    xor a
loop:
    out (0x00), a
    inc a

    jp loop

Tetapi masalahnya tidak berubah, aneh "takik" masih selalu muncul untuk beberapa logis, setelah MEMRQdan / atau (karena pada dasarnya satu-chip sekarang) CS(biru) menjadi rendah.

Semua pin CS dari SRAM adalah TINGGI, sehingga sistem ini cukup banyak hanya memiliki chip EEPROM AT28C256 sebagai memori, dan kait sebagai port output. Sistem ini juga memiliki programer dalam-sistem yang dibuat dari Atmega328p untuk memprogram ulang EEPROM on-the-fly selama permintaan DMA, tapi saya tidak berpikir itu penyebabnya karena saya mencatat semua data dan alamat output dari programmer, dan Saya telah melihat takik bahkan sebelum saya menambahkan programmer.

Contoh lain dari "Takik"

Jadi "takik" harus dibuat selama siklus pengambilan opcode. Apakah mereka?

Saya punya beberapa hipotesis:

  1. Tidak ada yang salah, itu hanya disebabkan oleh integritas sinyal papan tempat memotong roti yang buruk, dan itu akan hilang secara otomatis dalam PCB yang dirancang dengan baik dan dipisahkan dengan baik . Papan tempat memotong roti memiliki segala macam masalah integritas sinyal: ketidaksesuaian impedansi, refleksi, kapasitansi parasit, crosstalk, EMI / RFI. Kabel bus panjang yang melintang di papan kemungkinan memperburuk masalah dengan tingkat besarnya.

    Jika itu benar, dapatkah Anda menjelaskan sifat "takik"? Apakah fenomena ini memiliki nama di EE? Saya telah melihat banyak overshoot dan dering sebelumnya, tetapi tidak pernah melihat "takik". Dan mengapa saya melihatnya hanya untuk beberapa level logis?

  2. Pengaturan waktu. Apakah mungkin bahwa "waktu penyelesaian" pendek dari output EEPROM atau sirkuit logika lainnya menyebabkan efek aneh pada bus?

  3. Keluar. Mungkin bus panjang menarik banyak arus dan memiliki kapasitansi tinggi sehingga output EEPROM mengalami kesulitan mengemudi bus tinggi? Dan mungkin probe osiloskop juga memuat bus?

  4. Perselisihan bus, atau kesalahan logika lainnya yang menyebabkan sesuatu menarik bus data. Tidak mungkin saya pikir? Komponen lain di bus terisolasi, dan saya gagal melihat bagaimana EEPROM AT28C256 tunggal atau kait dapat melakukan ini. Tapi saya kira itu masih mungkin karena kesalahan kabel atau kekurangan internal yang tersembunyi di papan tempat memotong roti.

Pembaruan: Saya sudah menggunakan decoupling dan filtering kapasitor di papan dari awal. Saya telah menggunakan beberapa kapasitor decoupling 0,1 uF di seluruh papan, dan CPU bahkan memiliki kapasitor 0,1 uF dan 0,01 uF untuk decoupling. Sistem saat ini memiliki 8 papan, setiap papan tempat memotong roti memiliki dua kapasitor aluminium 4,7 uF di kedua rel untuk penyaringan lokal. Juga, daya yang diperoleh dari devboard memiliki kapasitor tantalum 200 uF. Tapi seperti yang saya katakan, masalahnya ada di sini.

Saya tidak yakin apakah itu memadai, terutama mengingat kesulitan menempatkan 104 kapasitor di dekat chip pada papan tempat memotong roti. Mungkin menambahkan lebih banyak dapat memperbaikinya?

Apa yang saya minati adalah akar-penyebab masalah, jika dapat dikonfirmasikan sebagai masalah inheren dari decoupling yang tidak memadai atau integritas sinyal yang buruk pada papan tempat memotong roti, saya dapat berhenti berusaha membuang-buang waktu untuk memecahkan masalah atau mengkhawatirkannya karena desain akhir akan menjadi PCB. Tapi saya tidak yakin.

Terima kasih.

Update2: Dalam pikiran saya, saya percaya komentar Bruce Abbott telah memberikan jawaban yang benar dan masalahnya selesai! Meskipun saya tidak bisa mengujinya sampai besok. Pelakunya adalah refresh DRAM Z80, lihat jawaban saya sendiri untuk detailnya. Saat ini, tidak ada jawaban baru yang diperlukan, dan saya akan menerima jawaban saya sendiri ketika saya mengkonfirmasi solusinya. Jika tidak berhasil, saya akan memperbarui pertanyaan. Terima kasih atas bantuan semua orang.


Saya baru saja melihat hasil edit Anda. Saya percaya itu akan ideal jika Anda melihat spesifikasi dan catatan desain / aplikasi untuk bagian Anda yang Anda gunakan. Mungkin ada komponen yang Anda lewatkan selain kapasitor decoupling untuk perangkat Anda. Apakah Anda yakin telah mengikuti setiap spesifikasi? Itu latihan akar penyebab yang baik. Sampai sekarang, pertanyaan Anda tidak dapat dijawab tanpa diagram sirkuit.
KingDuken

6
Salah satu cara untuk membantu memisahkan masalah EMI / daya dari masalah jam / logis adalah dengan mencoba menggunakan jam frekuensi yang lebih lambat, misalnya 0,5MHz atau 1MHz. Jika kesalahan aneh beralih dari 250ns ke 1us, ini didasarkan pada operasi prosesor. Jika tetap sekitar 250ns, maka itu mungkin masalah EMI / daya. Apakah Anda memiliki resistor pull-up / down di bus (mungkinkah ini respons tri-state)?
W5VO

1
Lihatlah dan lihat apakah lembar data prosesor merekomendasikan / menyarankan resistor pull-up atau pull down pada bus data. Itu akan membantu mengurangi kemungkinan glitching dari operasi tri-state. Jika Anda menambahkan instruksi "inc a" lain ke program Anda, Anda mungkin bisa mengetahui instruksi mana yang menyebabkan kesalahan.
W5VO

1
"... dua 74HCT573 lain dalam arah berlawanan dikendalikan oleh RD dan BUKAN RD sebagai buffer bus data dua arah." - mungkin ini? Harap berikan diagram sirkuit yang menunjukkan sinyal kontrol.
Bruce Abbott

5
Saya curiga ini disebabkan oleh penyegaran di akhir setiap siklus M1 (opcode fetch). Perlu melihat persis bagaimana Anda menghasilkan CS dan buffer bus data memungkinkan.
Bruce Abbott

Jawaban:


13

Terima kasih atas bantuan semua orang. Saya yakin Bruce Abbott telah memberikan jawaban yang benar.Saya memposting dari tempat tidur saya dan saya belum bisa mengujinya sampai besok, tetapiAnalisis di bawah ini dikonfirmasi, ketika ia menyebutkan kata "refresh", saya pikir masalahnya sudah terpecahkan. Saya tahu bagaimana Z80 menyegarkan memori, tetapi sepenuhnya melupakannya pada hari-hari sebelumnya.

... dua 74HCT573 lain dalam arah berlawanan yang dikendalikan oleh RD dan BUKAN RD sebagai buffer bus data dua arah. "- mungkin ini? Harap berikan diagram rangkaian yang menunjukkan sinyal kontrol.

Saya curiga ini disebabkan oleh penyegaran di akhir setiap siklus M1 (opcode fetch). Perlu melihat persis bagaimana Anda menghasilkan CS dan buffer bus data memungkinkan.

- Bruce Abbott

Buffer data dua arah dikontrol oleh RDdan NOT RDJika RDaktif rendah, buffer mendorong data ke CPU, jika tidak, RDberarti tinggi, artinya tulis / output, buffer mendorong bus.

buffer data dua arah

Namun demikian, Z80 melakukan pembacaan memori untuk refresh DRAM segera setelah opcode mengambil. Kali ini, RDadalah HIGHmeskipun itu operasi baca, menyebabkan buffer untuk flip arah dan mendorong bus, hasilnya adalah pertengkaran bus. Jadi "takik" yang aneh akan selalu muncul selama siklus refresh DRAM, tetapi tidak memori biasa membaca / menulis atau I / O. Ini menjelaskan mengapa "takik" akan selalu muncul, tetapi hanya untuk beberapa, dan tidak semua logis 1s.

Z80 opcode mengambil diagram waktu

Lebih jauh, SRAM tidak perlu di-refresh sehingga refresh DRAM benar-benar tidak berguna di sistem saya, dan pertentangan bus ini tidak akan merusak instruksi atau data apa pun, membuat sistem tampak berfungsi penuh.

Solusi: implementasikan (RD AND REFRESH)dan (NOT (RD AND REFRESH). Dalam revisi selanjutnya, saya juga harus menguji BUSACKuntuk memastikan buffer data tidak mengemudi bus selama operasi DMA juga.

Pembaruan: Saya dapat mengkonfirmasi masalah dan solusinya. Menggunakan WRdan NOT WRbukannya memperbaiki masalah, seperti yang ditunjukkan dalam skema baru( jangan lakukan ini! Ini salah juga, lihat Pembaruan 2 ).

Skema baru (salah)

Bentuk gelombang terlihat normal sekarang!

Bentuk gelombang baru, menunjukkan masalah diperbaiki.

Update2: Skema di atas juga rusak, jika Anda adalah pembaca jawaban ini, jangan gunakan itu! Jika asumsi bus adalah WRketika RDsinyal tidak aktif cukup buruk, anggap bus adalah RDketika WRtidak aktif bahkan lebih buruk. Saya menggunakan program sebelumnya untuk pengujian awal, sehingga sistem tampaknya berfungsi, tetapi melewatkan masalah kritis.

Selama siklus penulisan memori, CPU Z80 akan mulai mengemudi bus sebelum WR menjadi aktif rendah, pada saat ini, buffer data masih mendorong data ke arah CPU, oops, membuat pertengkaran bus.

Diagram waktu baca / tulis memori Z80

Bruce Abbott benar: lebih baik selalu menggunakan RDdan WRmemberi sinyal secara independen untuk mengontrol setiap buffer, alih-alih membalik satu pun.

Sebagai contoh,

Skema baru (diperbaiki, tetapi DMA tidak ditangani, Anda harus mengatasinya.

Sekarang berfungsi dengan baik.

Dan akhirnya, sekali lagi, skema di atas adalah penyederhanaan, orang juga harus menguji BUSACKuntuk memastikan buffer data tidak mengemudi bus selama operasi DMA juga.


6
Anda mungkin mempertimbangkan menggunakan / WR daripada terbalik / RD untuk mengaktifkan buffer atas. Dengan begitu bus data akan menjadi tidak aktif kecuali proses baca atau tulis yang sebenarnya sedang berlangsung.
Bruce Abbott

8

Pastikan Anda memiliki kapasitor decoupling yang memadai pada semua IC Anda. Keramik 100nF dari daya ke ground di setiap IC menjaga leadnya sesingkat mungkin dan elektrolit ESR rendah mengatakan 100uF di papan tempat memotong roti di seberang rel daya.


Tampaknya menjadi solusi untuk banyak ketidakstabilan untuk IC digital :)
KingDuken

4
@ KingDuken Benar-benar dan sedikit topik panas bagi saya, seorang teman saya dipecat sekali karena kehilangan satu. Menyebabkan banyak ketidakstabilan di mesin penanganan uang tunai, wah.
RoyC

2
Decoupling itu penting, tapi itu bukan jawaban untuk semuanya. Itu harus jelas dari bentuk gelombang bahwa itu tidak mungkin relevan di sini.
pericynthion

4

Saya melihat dua kemungkinan di sini:

1) D0 adalah tristated

Apa pun yang mendorong D0 beralih ke tristate (mode impedansi tinggi) dan kemudian pull-down di suatu tempat di D0 net membawa tegangan turun secara perlahan (konstanta waktu ditentukan oleh resistansi pull-down dan kapasitansi parasit IC dan jejak). Sifat gelombang yang eksponensial adalah indikasi kuat bahwa garis tidak digerakkan oleh sesuatu yang kuat, melainkan oleh pull-down yang relatif lemah.

Coba tambahkan resistor pull-down lain ke saluran dan periksa apakah bentuk gelombang eksponensial menjadi nol lebih cepat.

Ingatlah bahwa ini tidak selalu menjadi masalah dan bus Anda mungkin bekerja dengan baik dengan ini.

2) Pertentangan

Hipotesis Anda # 4. Mungkin juga D0 disingkat menjadi garis logika lain. Saya menemukan ini tidak mungkin, karena dalam hal ini Anda tidak akan melihat bentuk gelombang eksponensial dengan konstanta waktu yang relatif lama seperti yang Anda lihat sekarang. Anda dapat memeriksa jaring lain di sirkuit Anda untuk mencari bentuk gelombang lain yang identik, yang mengindikasikan Anda memiliki gelombang pendek.

Semoga berhasil!

PS - ini bukan masalah integritas sinyal, lebar pulsa terlalu panjang untuk itu

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.