لعب بوين تحليل مفصل من FPGA الاتصال التسلسلي مقرها

فوز الكتف حقيبة ظهر

مدى صعوبة؟

كزة محاولة!

_

الاعتراف الصحافة لفترة طويلة

[موضوع]: تحليل مفصل لمسلسل الاتصالات القائمة على FPGA-

[الكاتب]: LinCoding

[الوقت]: 2016/11/28

الاتصال التسلسلي، مع واسعة جدا، والمبدأ هو بسيط جدا، والأهم في المسلسل الاتصالات معدل الباود هو مفهوم، ونحن لا نعرف يمكن بايدو، ثم وهذا هو تنسيق البيانات، قليلا البداية، 8 بت البيانات، بت التماثل (اختياري)، و 1 توقف قليلا.

(صدر بعد وسيتم إرسال البيانات PC للبيانات FPGA، FPGA حصل على بيانات سليمة إلى الجانب PC) نظرة على النتائج:

(المصدر من CrazyBingo، واحترام حقوق التأليف والنشر)

نظرة مباشرة في البرنامج أدناه.

1، وسلسلة وحدة استقبال الميناء

الوحدة النمطية uart_receiver (inputclk، // inputrst_n مدار الساعة العالمية، // inputclk_16bps إعادة العالمية، inputrxd، outputreg rxd_data، outputregrxd_flag)؛

الجزء الأول هو تعريف المدخلات والمخرجات، وهناك نوعان من الأشياء إلى ملاحظة ما يلي:

1، لوحدة الاستقبال المسلسل، ليتم استخدامها من حيث المبدأ على 16 أضعاف أخذ العينات الباود معدل وclk_16bps المدخلات، وإشارة الدخل من - "أي تحليل مفصل على أساس تقسيم FPGA" إخراج divide_clken من هذه المادة.

2، ليتكون نظام للعديد من وحدات، وبين وحدة وحدة بالتأكيد سوف يكون على التواصل، ثم لوحدات الإدخال، لا يمكنك الهروب "إدخال إشارة الانتهاء العلم"، ويعتقد العلم أن بيانات المدخلات والمخرجات في التزامن، كما في rxd_flag تجسيد الحاضر، وكذلك قبل مفتاح المادة key_flag debounce، SPI المادة rxd_flag غير صحيح، لذلك ينبغي أن يكون هذا نمط ثابت!

// ----------------------------------- // مزامنة regrxd_sync إشارة المدخلات؛ دائما @ (posedge CLK أو negedge rst_n) تبدأ إذا (! rst_n) rxd_sync < = 1'b1؛ آخر rxd_sync < = RXD، نهاية

الجزء الثاني، لأن وحدة الاستقبال تستقبل إشارات من المجالات على مدار الساعة أخرى، وبالتالي، سوف تحتاج إلى هناك لضرب إشارة ضربات متزامنة لنطاق مدار الساعة الخاصة بها، وبطبيعة الحال، واثنين من يدق ممكنة!

// ----------------------------------- // تلقي FSM: ترميز localparamR_IDLE = 4'd0، localparamR_START = 4'd1، localparamR_SAMPLE = 4'd2، localparamR_STOP = 4'd3؛ // ------------------------------- ---- // تلقي FSM localparamSMP_TOP = 4'd15، localparamSMP_CENTER = 4'd7، ريج smp_cnt، ريج rxd_cnt، ريج rxd_state؛ دائما @ (posedge CLK أو negedge rst_n) تبدأ إذا (! rst_n) تبدأ smp_cnt < = 4'd0، rxd_cnt < = 4'd0، rxd_state < = R_IDLE، نهاية آخر حالة (rxd_state) R_IDLE: تبدأ smp_cnt < = 4'd0، rxd_cnt < = 4'd0، وإذا (! Rxd_sync) rxd_state < = R_START؛ آخر rxd_state < = R_IDLE، نهاية R_START: إذا (clk_16bps) تبدأ smp_cnt < = Smp_cnt + 1'b1، وإذا (smp_cnt == SMP_CENTER && rxd_sync) تبدأ rxd_cnt < = 4'd0، rxd_state < = R_IDLE، نهاية آخر إذا (smp_cnt == SMP_TOP) تبدأ rxd_cnt < = 4'd1، rxd_state < = R_SAMPLE، نهاية آخر تبدأ rxd_cnt < = Rxd_cnt، rxd_state < = Rxd_state، نهاية نهاية آخر تبدأ smp_cnt < = Smp_cnt، rxd_cnt < = Rxd_cnt، rxd_state < = Rxd_state، نهاية R_SAMPLE: إذا (clk_16bps) تبدأ smp_cnt < = Smp_cnt + 1'b1، وإذا (smp_cnt == SMP_TOP) تبدأ إذا (rxd_cnt <  4'd8) تبدأ rxd_cnt < = Rxd_cnt + 1'b1، rxd_state < = R_SAMPLE، نهاية آخر تبدأ rxd_cnt < = 4'd9، rxd_state < = R_STOP، نهاية نهاية آخر تبدأ rxd_cnt < = Rxd_cnt، rxd_state < = Rxd_state، نهاية نهاية آخر تبدأ smp_cnt < = Smp_cnt، rxd_cnt < = Rxd_cnt، rxd_state < = Rxd_state، نهاية R_STOP: إذا (clk_16bps) تبدأ smp_cnt < = Smp_cnt + 1'b1، وإذا (smp_cnt == SMP_TOP) تبدأ rxd_cnt < = 4'd0، rxd_state < = R_IDLE، نهاية آخر تبدأ rxd_cnt < = Rxd_cnt، rxd_state < = Rxd_state، نهاية نهاية آخر تبدأ smp_cnt < = Smp_cnt، rxd_cnt < = Rxd_cnt، rxd_state < = Rxd_state، نهاية الافتراضي: تبدأ smp_cnt < = 4'd0، rxd_cnt < = 4'd0، rxd_state < = R_IDLE، نهاية endcase نهاية

الجزء الثالث من آلة الدولة طويل، طويل جدا حقا، ولكن محتوى مكرر في الأساس، وتجدر الإشارة إلى النقاط التالية:

1، لاستقبال وحدة المنفذ التسلسلي، تلقينا بيانات من أجل جعل أقصى درجة من الاستقرار، لاستخدام 16 مرة أخذ العينات بالباود، أي على كل بت من البيانات مع 16 عينة، في هذه الحالة، بالطبع، في معظم هو الأكثر استقرارا على مبدأ أخذ العينات نقطة بيانات في الوسط، والحقيقة صحيح أيضا. فمن الضروري الاعتماد نقطة العينة الحالية إشارة smp_cnt هي الرقم الأول، وعندما تكون نقطة أخذ العينات 16 حتى بمقدار rxd_cnt على عينة البيانات القادمة.

حصلت 2، التهم الموجهة إليه الإشارة باستخدام rxd_cnt حاليا عدة عينات البيانات. علما بأن هذا يشمل فقط منع rxd_cnt دائما التغييرات، والآخر سوف يكون دائما قيم بت كل من البيانات وفقا لحالة rxd_cnt.

3، ويرجع ذلك إلى خصائص انتقال المسلسل، قليلا بداية وغني عن منخفض على أنها بداية انتقال، وبالتالي الوسائل التي بت البداية هو في الواقع نقل تبدأ تمكين إشارة، حالة خمول جدا لأجهزة الدولة استخدامها لمراقبة دائما إذا كانت التغييرات بداية قليلا.

ريج rxd_data_r؛ دائما @ (posedge CLK أو rst_n negedge) تبدأ إذا rxd_data_r (rst_n!) < = 8'd0، الا اذا (rxd_state == R_SAMPLE && && clk_16bps smp_cnt == SMP_CENTER) حالة (rxd_cnt) 4'd1: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd2: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd3: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd4: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd5: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd6: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd7: تبدأ rxd_data_r < = Rxd_sync، نهاية 4'd8: تبدأ rxd_data_r < = Rxd_sync، نهاية الافتراضي: تبدأ rxd_data_r < = 8'd0، نهاية endcase آخر إذا (rxd_state == R_STOP) rxd_data_r < = Rxd_data_r؛ آخر rxd_data_r < = Rxd_data_r، نهاية

الجزء الرابع هو القيمة إلى قيم مختلفة للقليلا على البيانات وفقا للقيمة rxd_cnt.

دائما @ (posedge CLK أو rst_n negedge) تبدأ إذا (! rst_n) تبدأ rxd_data < = 8'd0، rxd_flag < = 1'b0، نهاية آخر إذا (rxd_state == R_STOP && && clk_16bps smp_cnt == SMP_TOP) تبدأ rxd_data < = Rxd_data_r، rxd_flag < = 1'b1، نهاية آخر تبدأ rxd_data < = Rxd_data، rxd_flag < = 1'b0، نهاية نهاية

الجزء الخامس هو لمزامنة rxd_data إخراج إشارة وrxd_flag. من أجل مزامنة الإخراج، فقد اعتمدت نفس المرحلة D الوجه بالتخبط لضرب النار لrxd_data، لمزامنة الإخراج مع rxd_flag.

2، وحدة المنفذ التسلسلي

الوحدة النمطية uart_transfer (inputclk، // inputrst_n مدار الساعة العالمية، // inputclk_16bps إعادة العالمية، inputtxd_en، ومدخلات txd_data، outputreg TXD، outputregtxd_flag)؛

الجزء الأول هو تعريف المدخلات والمخرجات، لأنها ترسل وحدة، وبطبيعة الحال، يحتاج إلى إرسال إشارة تمكين، وثانيا، والانتهاء نقل العلم إشارة المطلوبة. وبطبيعة الحال، كما هو الحال مع الإرسال تمكين إشارة، فإن جهاز الدولة أمر لا مفر منه. وبالمثل clk_16bps وحدة الاستقبال التسلسلية.

// ----------------------------------- // تلقي FSM: ترميز localparamT_IDLE = 4'd0، localparamT_SEND = 4'd1؛ // ----------------------------------- // تلقي FSM localparamSMP_TOP = 4 " D15، localparamSMP_CENTER = 4'd7، ريج smp_cnt، ريج txd_cnt، ريج txd_state؛ دائما @ (posedge CLK أو rst_n negedge) تبدأ إذا تبدأ smp_cnt (rst_n!) < = 4'd0، txd_cnt < = 4'd0، txd_state < = T_IDLE، نهاية آخر حالة (txd_state) T_IDLE: تبدأ smp_cnt < = 4'd0، txd_cnt < = 4'd0، وإذا (txd_en) txd_state < = T_SEND؛ آخر txd_state < = T_IDLE، نهاية T_SEND: إذا (clk_16bps) تبدأ smp_cnt < = Smp_cnt + 1'b1، وإذا (smp_cnt == SMP_TOP) تبدأ إذا (txd_cnt <  4'd9) تبدأ txd_cnt < = Txd_cnt + 1'b1، txd_state < = T_SEND، نهاية آخر تبدأ txd_cnt < = 4'd0، txd_state < = T_IDLE، نهاية نهاية آخر تبدأ txd_cnt < = Txd_cnt، txd_state < = Txd_state، نهاية نهاية آخر تبدأ smp_cnt < = Smp_cnt، txd_cnt < = Txd_cnt، txd_state < = Txd_state، نهاية الافتراضي: تبدأ smp_cnt < = 4'd0، txd_cnt < = 4'd0، txd_state < = T_IDLE، نهاية endcase نهاية

الجزء الثاني هو جهاز الدولة الإرسال الطويل، وبسيط نسبيا بالمقارنة مع وحدة الاستقبال المسلسل، ولكن منها مختلفة، ليتم إرساله، ونحن بحاجة فقط لإرسال أول نموذج بيانات نقطة من نقطة عينة يصل إلى 16، استبدال نقل البيانات على ذلك.

دائما @ (*) تبدأ إذا (txd_state == T_SEND) حالة (txd_cnt) 4'd0: تبدأ TXD = 1'b0، نهاية 4'd1: تبدأ TXD = txd_data ؛ نهاية 4'd2: تبدأ TXD = txd_data ، نهاية 4'd3: تبدأ TXD = txd_data ، نهاية 4'd4: تبدأ TXD = txd_data ، نهاية 4'd5: تبدأ TXD = txd_data ، نهاية 4'd6: تبدأ TXD = txd_data ، نهاية 4'd7: تبدأ TXD = txd_data ، نهاية 4'd8: تبدأ TXD = txd_data ، نهاية 4'd9: تبدأ TXD = 1'b1، نهاية الافتراضي: تبدأ TXD = 1'b1، endcase نهاية آخر TXD = 1'b1، نهاية

الجزء الثالث هو لنقل البيانات وفقا لtxd_cnt العد، لوحظ أن وحدة منطق التوافقية الحالية، هو جعل محاذاة البيانات!

الشكل (1)

الشكل 2

FIG 2 هو نسخة مكبرة من الشكل 1، وينظر في حواف على مدار الساعة والانحياز.

إذا بدلا من منطق متتابعة، الإجراء التالي:

دائما @ (posedge CLK أو rst_n negedge) تبدأ إذا (! rst_n) TXD < = 1'b1، آخر إذا (txd_state == T_SEND) حالة (txd_cnt) 4'd0: تبدأ TXD = 1'b0، نهاية 4'd1: تبدأ TXD = txd_data ؛ نهاية 4'd2: تبدأ TXD = txd_data ، نهاية 4'd3: تبدأ TXD = txd_data ، نهاية 4'd4: تبدأ TXD = txd_data ، نهاية 4'd5: تبدأ TXD = txd_data ، نهاية 4'd6: تبدأ TXD = txd_data ، نهاية 4'd7: تبدأ TXD = txd_data ، نهاية 4'd8: تبدأ TXD = txd_data ، نهاية 4'd9: تبدأ TXD = 1'b1، نهاية الافتراضي: تبدأ TXD = 1'b1، endcase نهاية آخر TXD = 1'b1، نهاية

هو مبين أدناه ما يلي:

دائما @ (posedge CLK أو rst_n negedge) تبدأ إذا (! rst_n) txd_flag < = 1'b0، آخر إذا (txd_state == T_SEND && && clk_16bps smp_cnt == SMP_TOP && txd_cnt == 4'd9) txd_flag < = 1'b1؛ آخر txd_flag < = 1'b0، نهاية

الجزء الأخير هو استكمال نقل إشارة خرج العلم.

اكتمال هذا الاتصال التسلسلي القائم على FPGA، وحدة الأعلى، يمكننا توجيه البيانات التي وردت إلى وحدة الإرسال والبيانات المرسلة من المسلسل الجانب PC التصحيح مساعد، أرسلت ثم FPGA سليمة البيانات مرة أخرى التحقق الكامل على مستوى اللوحة.

خلاصة القول:

1، لتلقي وحدة الصف، بعد تلقي الانتهاء يحتاج إلى تلقوا إشارة العلم، والناتج في التزامن مع البيانات الواردة.

2، وحدة نمطية للفئة لالإرسال، يجب أن ينقل تمكين إشارة واستكمال نقل الإشارات العلم، واستخدام حالة خمول لمراقبة جهاز الدولة يمكن تغيير انتقال تمكين إشارة.

غرب اليابان أكبر أنيمي العرض! اليابان جسر شارع مهرجان COS مجموعة

السينما الألغام | أود أن أقول فيلم السنة القمرية الجديدة الأكشاك لا تبدو جيدة

2019، ونمو صناعة الخدمات اللوجستية والابتكار وأزمة محتملة

منفذ القادم! ممن لهم بصمة الجهاز شاشة لشعبية ألف دولار

لعق الوقت الشاشة | لك نظرة وسيم من كريستين ستيوارت

عمودي الغابات، والطلاب سكاي سيتي مع لبنات البناء، والورق المقوى والورق من النفايات إلى المدن بناء المستقبل

واستنادا تنفيذ التصميم وFPGA من ARINC659 حافلة محلل

وهناك طريقة أخرى؟ آلة نوكيا الجديدة "هرطقة" يمكن أن يحقق نتائج أفضل

الناس Jiangbeizui يتزاحمون للتمتع بالشمس والرمال وموجات صغيرة

من كتف إلى كتف للبحث عن، وقال انه لم الذاتي زراعة المشجعين ستيفن تشو

التقدم والمشاكل الناتجة ضد شبكة (GAN) السنوي | فالس 2017

حافلة مسح ARINC659