الإدخال واحد لصفيف من وحدات مخصصة في فيريلوج

StackOverflow https://stackoverflow.com/questions/1651637

  •  22-07-2019
  •  | 
  •  

سؤال

ولذا فإن لدي مجموعة من وحدات 4 RAM التي أريد أن أكون قادرة على قراءة / الكتابة إلى بناء على إشارتين محدد مختلفة. الآن أنا instantiating ذاكرة الوصول العشوائي باستخدام إشارات الوسيطة:

    genvar i;
    generate
    for (i = 0; i < regnum; i=i+1) begin: regs    
         rfram_generic rf (clk,rst,ce_a_int[i],addr_a_int[i],do_a_int[i],
                               ce_b_int[i],addr_b_int[i],do_b_int[i],
                               ce_w_int[i],we_w_int[i],addr_w_int[i],
                               di_w_int[i]);
    end
    endgenerate

وأريد لتحديد RAM لاستخدام باستخدام head أو إشارات tail (ناقلات 2-بت). أي أفكار كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

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

وكتوصية لآدم، وكنت أفضل حالا ربما جعل هذا صريح في التعليمات البرمجية عن طريق تنفيذ اخفاء نفسك بدلا من استخدام tristates. سيؤدي ذلك إلى تحسين قابلية، تعطيك نتائج أكثر قابلية للتنبؤ، وتكون بمثابة وثائق عن النفس إذا كان أي شخص لديه أي وقت مضى إلى إعادة النظر في التعليمات البرمجية.

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

reg [WIDTH-1:0] do_a,do_b;
always @(*) do_a = do_a_int[head];
always @(*) do_b = do_b_int[tail];
generate
   genvar i;
   for (i = 0; i < regnum; i=i+1) begin: regs    
      rfram_generic rf (clk,rst,
                        ce_a,addr_a,do_a_int[i],
                        ce_b,addr_b,do_b_int[i],
                        ce_w,head==i?we_w:1'b0,addr_w,di_w);
   end
endgenerate

وهذا سيؤدي على الارجح في منطق أقل تعقيدا (<م> أي بمعنى. ، منطقة أفضل والتأخير) من الحل.

نصائح أخرى

وأعتقد أنني حظيت بها، فلدي تستخدم توليد البيان:

genvar i;
generate 
    for (i = 0; i < regnum; i=i+1) begin: sigassign
        //read from the checkpoint in progress
        assign ce_a_int[i] = (head == i) ? ce_a : 'bz;
        assign addr_a_int[i] = (head == i) ? addr_a : 'bz;
        assign do_a = (head == i) ? do_a_int[i] : 'bz;
        //write to the checkpoint in progress
        assign ce_w_int[i] = (head == i) ? ce_w : 'bz;
        assign we_w_int[i] = (head == i) ? we_w : 'bz;
        assign addr_w_int[i] = (head == i) ? addr_w : 'bz;
        assign di_w_int[i] = (head == i) ? di_w : 'bz;
        //read from the last stable checkpoint
        assign ce_b_int[i] = (tail == i) ? ce_b : 'bz;
        assign addr_b_int[i] = (tail == i) ? addr_b : 'bz;
        assign do_b = (tail == i) ? do_b_int[i] : 'bz;
    end
endgenerate

وسعيد لسماع كنت وجدت حلا لمشكلتك. يجب أن أعترف أنني لم أفهم تماما ما كنت حتى، ولكن تعليق واحد، يمكنك أيضا استخدام if داخل توليد البيانات وبالتالي مثيل وحدات مختلفة أو استخدام إشارات مختلفة تعتمد على genvar، منها مثلا:

generate
    genvar i;
    for (i = 0; i < regnum; i=i+1) begin: regs
        if (i == head) begin
            rfram_generic_a rf(...);
        end else if (i == tail) begin
            rfram_generic_b rf(...);
        end else begin
            rfram_generic_c rf(...);
        end
    end
endgenerate
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top