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

Transmitter Design

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

challenge icon

التحدي

في هذا الدرس، ستُكمل مُرسِل UART بإضافة shift register لإرسال أي بايت، وليس الحرف الثابت 'A' فقط.

يحمّل shift register الإطار الكامل (بت stop + 8 من data bits + بت Start) ثم يزيحه bit واحدًا في كل مرة.

تنسيق الإطار

Stop (1)Data (8 bits)Start (0)
1data_in0

على سبيل المثال، إذا كان data_in = 8'b01000001 (الحرف 'A')، يصبح shift register: 1 01000001 0

مهمتك

أُعطيتَ آلة الحالات من الدرس السابق (تُرسل بايتًا ثابتًا). تحتاج إلى تعديلها لإرسال أي بايت من دخل data_in.

ما يجب فعله:

  1. أضف input [7:0] باسم data_in إلى قائمة المنافذ (داخل الأقواس)
  2. أضف reg من 10-bit باسم shift_reg خارج الأقواس (داخل جسم الوحدة، لأنه signal داخلي)
  3. عندما يكون cnt == 0 وstart == 1:
    1. حمّل shift_reg بالقيمة {1'b1, data_in, 1'b0}
  4. عندما تكون قيمة cnt بين 1 و8:
    1. أرسل tx <= shift_reg[0]
    2. أجرِ إزاحة إلى اليمين: shift_reg <= shift_reg >> 1
  5. عندما يكون cnt == 9:
    1. أرسل tx <= shift_reg[0]
    2. أجرِ إزاحة إلى اليمين: shift_reg <= shift_reg >> 1

جرّب بنفسك

module uart_tx (
  input clk,
  input start,           // NEW: إشارة البدء لبدء الإرسال
  output reg tx,         // NEW: خط الإخراج التسلسلي
  output reg [3:0] cnt   // أبقِه كمخرج للاختبار
);

  initial begin
    cnt = 0;
    tx = 1;              // NEW: اضبط tx على HIGH (حالة الخمول)
  end

  always @(posedge clk) begin
    // NEW: منطق العداد مع شرط البدء
    if (cnt == 0 && start) begin   // NEW: ابدأ الإرسال
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // NEW: عُدّ أثناء الإرسال
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // NEW: أعد التعيين بعد البت الأخير
      cnt <= 0;
    end
  end

endmodule

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

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