32 / 37 · Praktikum
Praktik terpadu: pulsa berkala dan akumulator diaktifkan
Tetapkan transfer dengan nilai lama dan uji jeda, pulsa berurutan serta reset bersamaan.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Tentukan koneksi sebelum penyusunan
Terima sample empat bit tanpa tanda pada tiap tepi naik dengan enable=1. Setiap N sample diterima, munculkan pulse teregistrasi. Akumulator mengonsumsi pulse dan sample terkait yang disimpan pada tepi naik berikutnya, bahkan jika enable=0 saat itu. total delapan bit berputar modulo 256. Reset sinkron membersihkan tahap dan membuang sample tertunda. Latensi satu tepi bagian kontrak: akumulator membaca pulse dan saved_sample lama, bukan nilai nonblocking baru pada tepi sama. Simpan modulo_tick.sv dan periodic_accumulator.sv ini; N positif.
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmoduleIkuti data dan kejadian bersama
N=3, masukan sebelum dan keluaran setelah tepi.
| Tepi | rst | enable | sample | pulse sesudah | total sesudah |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4 menambah 7, bukan sample eksternal 9. enable hanya mengontrol penerimaan baru, tidak membatalkan tertunda. E8 membuang 5 dan membersihkan total. enable && pulse pada konsumsi akan kehilangan E4.
Acuan pada batas sistem
Simpan jumlah diterima, nilai tertunda opsional dan total integer. Pada tepi tanpa reset, konsumsi dahulu tertunda lama modulo 256, lalu gunakan enable/sample kini untuk membuat tertunda pada penerimaan ke-N. Reset membersihkan semua. Jangan baca tick_u.count atau saved_sample. Stimulus pada tepi turun dan periksa sesudahnya: pulse, total, penahanan tanpa kejadian dan pembuangan yang telah dikonsumsi.
Cakup kegagalan integrasi
- N=1 memberi pulsa berurutan: setiap sample harus dikonsumsi sekali pada tepi berikutnya.
- N=3 dengan jeda sebelum/sesudah sample terminal: hitung penerimaan, bukan setiap clock.
- Ubah sample eksternal saat konsumsi dengan enable=0: harus memakai data tersimpan.
- Reset dengan tertunda membuang kejadian dan total.
- Jumlahkan melampaui 255 dan periksa modulo 256.
Ganti saved_sample dengan sample: E4 harus gagal. Batasi konsumsi dengan enable dan pastikan kegagalan lain. Pulihkan sebelum PASS. Kontrak diperiksa bersifat fungsional, satu clock dan lebar terbatas; bukan bukti CDC, penutupan timing fisik atau eksekusi DDS gratis.