الإدخال واحد لصفيف من وحدات مخصصة في فيريلوج
سؤال
ولذا فإن لدي مجموعة من وحدات 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