Altifigence Academy

32 / 37 · Praktikum

Praktik terpadu: pulsa berkala dan akumulator diaktifkan

Tetapkan transfer dengan nilai lama dan uji jeda, pulsa berurutan serta reset bersamaan.

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.

SystemVerilog
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
endmodule

Ikuti data dan kejadian bersama

N=3, masukan sebelum dan keluaran setelah tepi.

Tepirstenablesamplepulse sesudahtotal sesudah
E011900
E101200
E201400
E301710
E400907
E501107
E601307
E701517
E8111500

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.

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