
كل عام في 31 كانون الأول (ديسمبر) ، في زي سانتا كلوز ، وزوجتي ، في دور Snow Maiden ، أتجول في المدينة لأصدقائي مع التهاني. منذ أن اقتربت السنة الجديدة قريبًا ، قررت أن أتحقق مما إذا كان كل شيء جاهزًا بالنسبة لي وأخرجت الموظفين التابعين لي منذ فترة طويلة من الطابق السفلي. لدهشتي ، بعد الكذب في الطابق السفلي لمدة عام ، كان يعمل بشكل صحيح حتى الآن! لا يزال يتم شحن بطاريته بطريقة أو بأخرى! الموظفين ليس مشرقا للغاية ، لكنه يضيء. بالطبع ، سأضطر إلى إعادة الشحن ، وأنا أشاهد مصباح LED يتوقف عن العمل ، ولكن هذا قابل للتثبيت - سنصلحه.
لقد عدت إلى هذا الفريق عام 2012 ، ومنذ ذلك الحين خدمتني بإخلاص. الأمر بسيط للغاية ، لكنه فعال للغاية ، خاصة أن الأطفال يفرحون به. إنه يشبه سيف Jedi تقريبًا - فقط طاقم عمل ، وبالنسبة لسانتا كلوز الحقيقي - هذا شيء ضروري. قررت أن أكتب عنه هنا على حبري - فجأة سوف يستلهم شخص ما الفكرة ويجعلها لنفسه بحلول العام الجديد ، لا يزال هناك وقت.
لتكوين فريق عمل ، ستحتاج:
- قطعة من أنابيب المياه البلاستيكية 1.3 متر ؛
- قليلا لامعة ذاتية اللصق للزينة.
- قطعة من كابل شبكة UTP-5 أو أي كابل مناسب آخر ؛
- المصابيح الزرقاء ، على الأقل 24 قطعة ؛
- البطارية؛
- زر الطاقة ؛
- أي متحكم صغير أو لوحة FPGA تحتوي على شيء يمكنك البرمجة ؛
- لعبة شجرة عيد الميلاد الكبيرة التي يمكن تقسيمها إلى نصفين بحيث يمكن إخفاء كل من اللوحة والبطارية.
الأجزاء اللازمة مرئية في هذه الصورة:

جهاز الموظفين بسيط جدا. لا يوجد شيء خاص للكتابة عنه. نأخذ أنبوبًا من البلاستيك الأبيض ونحفر العديد من الثقوب على نفس المسافة من 200 ملم. حصلت على 6 ثقوب.
نذوب كابل UTP-5 في عدة أزواج ملتوية. هناك حاجة إلى ستة أزواج من الأسلاك. نطلقها في الثقوب ونخرج من طرف واحد من الأنبوب ، حيث ستكون الكرة السحرية للموظفين. عندما تدخل أزواج من الأسلاك في فتحات الأنبوب ، نقوم بتنظيفها ونلفها بإحكام حول الأنبوب على مسافة معينة من بعضها البعض. نحن جندى إلى "الحافلة" الناتجة في دائرة من جندى الموظفين بأربعة لمبات LED زرقاء:

في الجزء العلوي من الأنبوب ، تحتاج إلى حفر حفرة أكبر ولصق زر طاقة لوحة التحكم هناك:

لدي وشاح روفر المريخ كوحة تحكم. هنا FPGA من Altera MAX II ، وبما أن اللوحة كانت تهدف في الأصل إلى توصيل محركات الألعاب منخفضة الطاقة ، يتم دمج مخرجات الرقاقات على اللوحة في 10 قطع لإعطاء المزيد من التيار. لا يوجد سوى 6 من هذه المسامير المدمجة على اللوحة - هذه هي "إشارات" اللوحة f0 ، f1 ، f2 ، f3 ، f4 ، f5. لذلك يمكنني تشغيل مصابيح LED مباشرة من هذه الاستنتاجات دون خوف من حرق ناتج FPGA. يوجد أيضًا على اللوحة نفسها 8 مصابيح LED صفراء - يمكن إشعالها أيضًا. إذا كانت الكرة الموجودة على أعلى الموظفين شفافة ، فإن هذا سيضيف أيضًا مؤثرًا بصريًا.
إذا كنت تستخدم Arduino ، على سبيل المثال ، في أحد الموظفين ، فقد تضطر إلى لحام وشاح صغير مع مفاتيح الترانزستور للتحكم في العديد من المصابيح ، لأنه من الأفضل عدم أخذ أكثر من 10-15mA من دبوس واحد من متحكم ، لكننا بحاجة إلى المزيد من أجل LEDs.
يحتاج المجلس إلى وميض مع برنامج التحكم. والفكرة هي أنه عند الضغط على الزر الموجود على الموظفين ، يتم تشغيل اللوحة ويبدأ على الفور في إضاءة الأضواء على الموظفين. ثم من لديه ما الخيال. أضيء أولاً بدوره جميع مصابيح LED من الصف الأول إلى السادس ، ثم أطفئ المنعطفات من الصف السادس إلى الأول.
ربما يفسر رمز فيريلوج HDL بشكل أفضل ما أقصده:
module effect( input wire clk, input wire mclk, output wire [7:0]leds, output wire f0, output wire f1, output wire f2, output wire f3, output wire f4, output wire f5 ); reg [3:0]cnt; reg [5:0]bits; initial begin bits= 6'h00; cnt = 4'h0; end always @(posedge clk) if(cnt==11) cnt<=0; else cnt <= cnt + 1'b1; always @* begin case(cnt) 4'h0: bits = 6'b000001; 4'h1: bits = 6'b000011; 4'h2: bits = 6'b000111; 4'h3: bits = 6'b001111; 4'h4: bits = 6'b011111; 4'h5: bits = 6'b111111; 4'h6: bits = 6'b011111; 4'h7: bits = 6'b001111; 4'h8: bits = 6'b000111; 4'h9: bits = 6'b000011; 4'ha: bits = 6'b000001; default: bits = 6'b000000; endcase end assign f0 = bits[0] & mclk; assign f1 = bits[1] & mclk; assign f2 = bits[2] & mclk; assign f3 = bits[3] & mclk; assign f4 = bits[4] & mclk; assign f5 = bits[5] & mclk; assign leds = {bits[5],bits[5],bits[4],bits[3],bits[2],bits[1],bits[0],bits[0]}; endmodule
هذه ليست وحدة نمطية من المستوى الأعلى ، بل هي وحدة تأثير. من الوحدة العليا ، يتم توفير ترددين على مدار الساعة من clk ~ 40Hz هنا - يحدد هذا التردد سرعة التأثير والتردد الثاني mclk ~ 320Hz ، أعلى ثماني مرات. تعمل إشارة mclk أيضًا على تعديل النواتج مرة أخرى ، بحيث لا يتم تشغيلها دائمًا ، بحيث لا تضيء مصابيح LED بشكل مشرق ولا تتسخ الرقاقة.
لا أعرف ما إذا كنت بحاجة إلى حفظ هذه المقالة. ولكن فقط في حالة ، سأكتب أنه يمكن محاكاة رمز Verilog أعلاه تمامًا باستخدام مثل testbench:
`timescale 1ms / 1us module tb; reg clock = 1'b0; always #10 clock = ~clock; reg [3:0]counter=0; always @(posedge clock) counter <= counter+1; wire [7:0]wleds; wire wf0,wf1,wf2,wf3,wf4,wf5; effect inst( .clk( counter[2] ), .mclk( clock ), .leds( wleds ), .f0( wf0 ), .f1( wf1 ), .f2( wf2 ), .f3( wf3 ), .f4( wf4 ), .f5( wf5 ) ); initial begin $dumpfile("out.vcd"); $dumpvars(0,tb); #10000; $finish(); end endmodule
كيف بالضبط محاكاة المشاريع يمكن قراءتها ، على سبيل المثال ،
هنا .
حسنًا ، وفقًا لنتائج المحاكاة ، يمكنك الحصول على مخططات توقيت الإشارات:

إذا كنت تخطط للقيام بهذا المشروع على Arduin - هذا ممكن أيضًا. أنا في الحقيقة لست خبيرًا كبيرًا في Arduina ، لكن يبدو لي أن الكود قد يبدو مثل هذا:
int start_pin = 2; int end_pin = 8; void setup() { for (int i = start_pin; i< end_pin; i++ ) pinMode(i, OUTPUT); } void loop() { for (int i = start_pin; i< end_pin; i++ ) { digitalWrite(i, HIGH); delay(250); } for (int i = start_pin; i< end_pin; i++ ) { digitalWrite(i, LOW); delay(250); } }
يجب أن تكون النتيجة شيء مثل هذا:
على الرغم من أن المشروع ككل بسيط للغاية ، إلا أن المتفرجين والمارة غير الرسمية يوم 31 ديسمبر متحمسون دائمًا. خاصة عندما تخرج من السيارة مرتدية حلة سانتا كلوز في أحد الشوارع الثلجية ، تصعد إلى أحد المارة غير العاديين وتضيء الطريق مع أحد الموظفين وتقدم بطة الماندرين.