Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

منصة الاختبار

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 90 من 90.

challenge icon

التحدي

يوفّر testbench مدخلات لتصميمك وينشئ ملفًا للموجة. ولا يحتوي على أي منافذ خاصة به.

مهمتك

أنشئ testbench الذي:

  1. يُصرّح عن reg لكل من clk وstart وdata_in (بعرض 8 بتات)
  2. يُصرّح عن wire لـ tx وعن wire [3:0] لـ cnt
  3. ينشئ نسخة من الوحدة uart_tx، مع توصيل جميع المنافذ: .clk و.start و.data_in و.tx و.cnt
  4. يولّد إشارة ساعة (تتبدّل كل 5 وحدات زمنية)
  5. داخل كتلة initial:
    • ينشئ ملف موجة باسم uart.vcd باستخدام $dumpfile و$dumpvars
    • يعيّن clk = 0 وstart = 1 وdata_in = 8'b01000001 عند الزمن 0
    • يحرّر start بعد 10 وحدات زمنية (start = 0)
    • ثم ينتظر 200 وحدة زمنية أخرى ويستدعي $finish (بحيث تنتهي المحاكاة عند الزمن 210)

بعد تشغيل testbench، افتح الموجة للتحقق من إشارة tx.

جرّب بنفسك

module uart_tx (
  input clk,
  input start,
  input [7:0] data_in,
  output reg tx,
  output reg [3:0] cnt
);

  reg [9:0] shift_reg;

  initial begin
    cnt = 0;
    tx = 1;
    shift_reg = 0;
  end

  always @(posedge clk) begin
    if (cnt == 0 && start) begin
      shift_reg <= {1'b1, data_in, 1'b0};
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin
      tx <= shift_reg[0];
      shift_reg <= shift_reg >> 1;
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin
      tx <= shift_reg[0];
      shift_reg <= shift_reg >> 1;
      cnt <= 0;
    end
  end

endmodule

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت