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

تصميم المرسل

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

challenge icon

التحدي

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

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

تنسيق الإطار

التوقف (1)البيانات (8 بتات)البدء (0)
1data_in0

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

مهمتك

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

ما يجب القيام به:

  1. أضف input [7:0] يسمى data_in إلى قائمة المنافذ (port list) (داخل الأقواس)
  2. أضف reg بحجم 10 بت يسمى shift_reg خارج الأقواس (داخل جسم الوحدة البرمجية "module body"، لأنه إشارة داخلية)
  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,           // جديد: إشارة البدء لبدء الإرسال
  output reg tx,         // جديد: خط الإخراج التسلسلي
  output reg [3:0] cnt   // الاحتفاظ به كمخرج لأغراض الاختبار
);

  initial begin
    cnt = 0;
    tx = 1;              // جديد: ضبط tx على المستوى العالي (حالة الخمول)
  end

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

endmodule

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