Altifigence Academy

63 / 63 · Konsep

Proyek praktikum: pemancar UART dan timing frame

Gabungkan pencacah pembagi, register geser, dan kontrol aliran untuk frame 8N1, lalu verifikasi batas bit.

Tetapkan frame dahulu

Prasyarat: pencacah, register geserRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya, valid/ready, dan reset sinkronReset Kontrol yang mengembalikan keadaan ke nilai awal tertentu. Sifat sinkron/asinkron dan prioritas terhadap kontrol lain harus ditetapkan. Selengkapnya.

Format UARTUART Perangkat komunikasi serial memakai bit start, data, dan stop tanpa jalur clock terpisah. Pengirim serta penerima harus menyepakati baud rate dan format frame. 8N1 terdiri atas satu start bit, delapan data, tanpa paritas, dan satu stop bit. Idle serta stop bernilai 1, start 0, dan data dikirim mulai LSBLSB Bit berbobot terendah. Periksa arah penulisan dan aturan indeks bersama. Selengkapnya. Semua bit berdurasi sama. Praktikum hanya membahas pemancar dengan penyedia data dalam domain clock sama.

Bactual=fclkD,ϵ=Bactual−BtargetBtarget×100%B_{\mathrm{actual}}=\frac{f_{\mathrm{clk}}}{D},\qquad \epsilon=\frac{B_{\mathrm{actual}}-B_{\mathrm{target}}}{B_{\mathrm{target}}}\times100\%

Untuk 48MHz dan target 115200 baud, pembagi bulat D=417 dapat dipilih. Kecepatan nyata sekitar 115108 baud, atau galat −0.080%. Toleransi termasuk penerima harus diperiksa pada spesifikasi perangkat.

Menguraikan 0x53 sesuai urutan transmisi

0x53 ditulis 01010011, tetapi data pada jalur adalah 1,1,0,0,1,0,1,0. Satu kotak gambar adalah durasi bit sebanyak D siklus sistem, bukan satu siklus. Idle sebelum dan sesudah masing-masing ditampilkan satu kotak untuk perbandingan.

UART 8N1 · 0x53 · LSB lebih dahulu
Lihat data gelombang
Data gelombang: setiap karakter mewakili satu interval; titik mempertahankan keadaan sebelumnya; p adalah satu siklus clock.
SinyalGelombangNilai bus
tx101.0.10101.
phase234523452345siaga → mulai → d0 → d1 → d2 → d3 → d4 → d5 → d6 → d7 → berhenti → siaga

Dari start sampai akhir stop ada tepat 10D siklus. Bit sama yang berurutan tetap memiliki durasi masing-masing; tanpa transisi bukan berarti bit hilang.

Tangkap satu byte tepat sekali

CLKS_PER_BIT adalah konstanta ≥1. Selama busy, masukan tidak diterima; hanya data yang ditangkap pada awal dipakai. Pencacah pada clock asli mengatur pergeseran tanpa membuat bit-clock baru.

SystemVerilog
module uart_tx #(
    parameter int unsigned CLKS_PER_BIT = 417,
    localparam int CW = (CLKS_PER_BIT <= 1) ? 1 : $clog2(CLKS_PER_BIT)
) (
    input  logic       clk, rst,
    input  logic       in_valid,
    output logic       in_ready,
    input  logic [7:0] in_data,
    output logic       tx, busy, done
);
    logic [9:0] frame;
    logic [3:0] bits_left;
    logic [CW-1:0] ticks_left;
    assign in_ready = !busy;

    always_ff @(posedge clk) begin
        if (rst) begin
            tx         <= 1'b1;
            busy       <= 1'b0;
            done       <= 1'b0;
            bits_left  <= 4'd0;
            ticks_left <= '0;
        end else begin
            done <= 1'b0;
            if (!busy) begin
                if (in_valid) begin
                    frame      <= {1'b1, in_data, 1'b0};
                    tx         <= 1'b0;
                    busy       <= 1'b1;
                    bits_left  <= 4'd10;
                    ticks_left <= CW'(CLKS_PER_BIT-1);
                end
            end else if (ticks_left != 0) begin
                ticks_left <= ticks_left - 1'b1;
            end else if (bits_left == 4'd1) begin
                tx   <= 1'b1;
                busy <= 1'b0;
                done <= 1'b1;
            end else begin
                frame      <= {1'b1, frame[9:1]};
                tx         <= frame[1];
                bits_left  <= bits_left - 1'b1;
                ticks_left <= CW'(CLKS_PER_BIT-1);
            end
        end
    end
endmodule

Jika penerimaan pada E0, tx menjadi start=0. Setiap bit berikutnya dimulai tepat D siklus kemudian. Stop dimulai E0+9D; busy turun dan done satu siklus muncul E0+10D. Stop terakhir juga harus penuh D periode.

in_ready tetap 0 sampai sebelum tepi selesai. Frame berikutnya paling cepat diterima pada tepi setelahnya, sehingga interval minimum 10D+110D+1 siklus. Tambahan satu siklus idle ini bagian operasi normal.

Prediksi bit secara manual

Data 8'h53 mulai LSB adalah 1,1,0,0,1,0,1,0. Frame lengkapnya:

Posisistartd0d1d2d3d4d5d6d7stop
tx0110010101

Jangan hanya menghitung perubahan tx: dua bit sama tidak menimbulkan transisi. Sampel di tengah setiap interval sejak awal frame, bandingkan bit dan periksa durasi start/stop. Gunakan juga D=1,2,3 untuk pengujian unit cepat.

Pengembangan dengan FIFO

FIFOFIFO Antrean yang mengeluarkan data masuk pertama lebih dahulu. Aturan penuh, kosong, dan baca/tulis bersamaan merupakan bagian kontrak. Selengkapnya dengan keluaran baca berregister memperbarui dout dan dout_valid setelah tepi penerimaan pop. Rangkaian berikutnya dengan clock sama menangkap pada tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya selanjutnya. Mengirim dout ke UART tepat pada tepi pop dapat mengirim data lama. Tambahkan buffer satu byte dan keadaan pending untuk menyimpan respons serta mengirim tepat sekali ketika UART siap.

Uji 00,FF,01,80,55,53, perubahan masukan selama busy, frame berurutan, dan reset di tengah frame. Kebijakan reset menghentikan transmisi lalu mengembalikan tx ke idle=1; penerima masih dapat melihat frame yang valid, sehingga format frame UART saja tidak menjamin deteksi transmisi yang dibatalkan. Jika data yang terdampak harus dibuang, tetapkan kontrak sistem yang mengoordinasikan reset penerima dengan pemancar atau memberikan sinyal pembatalan terpisah kepada penerima.

Bacaan lanjutan: Microchip — EUSART and 8N1 framing

Coba sendiri

Dengan CLKS_PER_BIT=4 dan penerimaan E0, tentukan tepi awal d0, awal stop, dan done. Apakah in_valid baru=1 pada E40 diterima pada tepi itu?

Baca penjelasan

d0 mulai E4, stop E36, dan done setelah E40. Sebelum E40 busy=1 sehingga in_ready=0: byte baru belum diterima. Pengirim menahan valid dan data hingga E41, penerimaan paling awal. Setiap frame 40 siklus dan interval minimum penerimaan 41 siklus.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.