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.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
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.
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.
Lihat data gelombang
| Sinyal | Gelombang | Nilai bus |
|---|---|---|
| tx | 101.0.10101. | |
| phase | 234523452345 | siaga → 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.
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
endmoduleJika 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 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:
| Posisi | start | d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | stop |
|---|---|---|---|---|---|---|---|---|---|---|
| tx | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
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.