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

تصميم المرسل

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

challenge icon

التحدي

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

يقوم سجل الإزاحة بتحميل الإطار الكامل (بت التوقف stop + 8 بتات للبيانات data + بت البدء start) وإزاحته لإرساله بتًا تلو الآخر.

تنسيق الإطار (Frame Format)

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

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

مهمتك

يتم تزويدك بآلة الحالة (state machine) من الدرس السابق (والتي تقوم بإرسال بايت ثابت). عليك تعديلها لإرسال أي بايت يتم إدخاله عبر data_in.

ما يجب عليك فعله:

  1. أضف input [7:0] باسم data_in إلى قائمة المنافذ (port list) (داخل الأقواس)
  2. أضف reg بحجم 10-bit باسم shift_reg خارج الأقواس (داخل جسم الـ module، لأنه 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 right): shift_reg <= shift_reg >> 1
  5. عندما يكون cnt == 9:
    1. قم بإرسال tx <= shift_reg[0]
    2. قم بالإزاحة لليمين (shift right): 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

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