مشكلة في منفذ ثنائي الاتجاه

S

syedahmar

Guest
مرحبا بالجميع!
أواجه مشكلة صغيرة والتي آمل شخص ما من شأنه أن يحل..
وأنا على تصميم وحدة الذاكرة التي 4 FIFOs.هناك في فيريلوج رمز ، وليس لدي منفذ inout بيانات [31:0] وdata_bus تسجيل 32 بت.
الآن خلال المحاكاة ، وعندما أريد أن بلدي إشارة rd_en عالية ، فإن محتويات data_bus ينبغي أن تكون مكتوبة الى ميناء inout البيانات.لقد راجعت في المحاكاة ، وهناك بيانات في data_bus كنها doesn't أكتبه إلى البيانات.
قانون بلدي هو شيء من هذا القبيل....
تعيين البيانات = (rd_en)؟ data_bus : 32'bz ؛

خلال المحاكاة ، حتى عندما تكون إشارة rd_en هو نشط ، والبيانات في البيانات هي واحدة التي كنت قد دخلت في حين كان منخفضا rd_en....
plzzzz مساعدة

 
يمكنك بعد انتهاء جولة أوروغواي رمز كاملة هنا؟يبدو أن المشكلة عند بعض آخر
ثام في البيان
تعيين البيانات = (rd_en)؟ data_bus : 32'bz ؛

 
syedahmar كتب :

تعيين البيانات = (rd_en)؟ data_bus : 32'bz ؛

خلال المحاكاة ، حتى عندما تكون إشارة rd_en هو نشط ، والبيانات في البيانات هي واحدة التي كنت قد دخلت في حين كان منخفضا rd_en....

plzzzz مساعدة
 
رأس وحدة (clk ،
sinit ،
الدين ،
wr_en ،
dout ،
ممتلئ ،
فارغ ،
البيانات ،
addr_en ،
rd_sel ،
readout_en ،
count_chk ،
addr_in) ؛

مدخلات clk ، sinit ، readout_en ، addr_en ؛
مدخلات [31:0] الدين ؛
مدخلات [3:0] wr_en ؛
/ / لمجرد checkin
الإخراج [1:0] rd_sel ؛
//////////////////
مدخلات [1:0] addr_in ؛
inout [31:0] البيانات ؛
الإخراج [31:0] dout ؛
ريج [31:0] dout ؛
الإخراج [3:0] فارغة ، وبصورة كاملة ؛
سلك [39:0] data_count ؛
سلك [3:0] rd_en ؛
سلك [31:0] dout1 ، dout2 ، dout3 ، dout4 ؛
الإخراج [9:0] count_chk ؛
makeme block1 (. clk (clk). sinit (sinit). الدين (الدين) ،
. wr_en (wr_en [0]) ،. rd_en (rd_en [0]) ،. dout (dout1) ،
. كامل (الكامل [0]) ،. فارغة (فارغة [0]) ،
. data_count (data_count [9:0])) ؛
makeme Block2 (. clk (clk). sinit (sinit). الدين (الدين) ،
. wr_en (wr_en [1]) ،. rd_en (rd_en [1]) ،. dout (dout2) ،
. كامل (كامل [1]) ،. فارغة (فارغة [1]) ،
. data_count (data_count [19:10])) ؛
makeme Block3 (. clk (clk). sinit (sinit). الدين (الدين) ،
. wr_en (wr_en [2]) ،. rd_en (rd_en [2]) ،. dout (dout3) ،
. كامل (كامل [2]) ،. فارغة (فارغة [2]) ،
. data_count (data_count [29:20])) ؛
makeme block4 (. clk (clk). sinit (sinit). الدين (الدين) ،
. wr_en (wr_en [3]) ،. rd_en (rd_en [3]) ،. dout (dout4) ،
. كامل (كامل [3]) ،. فارغة (فارغة [3]) ،
. data_count (data_count [39:30])) ؛
تعيين count_chk = data_count [29:20] ؛
ريج [31:0] data_bus ؛
/ / تعيين بيانات [1:0] = (addr_en)؟ addr_in : ((readout_en)؟ 2'b00 : data_bus [1:0]) ؛
تعيين بيانات [1:0] = (addr_en)؟ addr_in : data_bus [1:0] ؛
/ / تعيين بيانات [1:0] = (addr_en)؟ 2'bz : data_bus [1:0] ؛
تعيين بيانات [31:2] = readout_en؟ 30'b0 : data_bus [31:2] ؛
/ / تعيين بيانات [31:2] = addr_en؟ 30'b0 : 32'bz ؛
/ / تعيين بيانات = ((addr_en == 1'b0) و (readout_en == 1'b0))؟ data_bus : 32'bz ؛
/ / تعيين البيانات = readout_en؟ 32'bz : 32'bz ؛
/ / تعيين البيانات = data_bus ؛
ريج [1:0] rd_sel ؛
دائما @ (clk posedge)
يبدأ
إذا كان (addr_en)
rd_sel <= بيانات [1:0] ؛
نهاية
تعيين rd_en = (readout_en)؟ (rd_sel [1]؟ (rd_sel [0]؟ 4'b1000 : 4'b0100) : (rd_sel [0]؟ 4'b0010 : 4'b0001)) : 4'b0000 ؛
/ / تعيين rd_en = (readout_en)؟ (rd_sel [1]؟ (rd_sel [0]؟ ((data_count [9:0]> 10'b0000110010)؟ 4'b1000 : 4'b0000) : 4'b0100) : ( rd_sel [0]؟ 4'b0010 : 4'b0001)) : 4'b0000 ؛
سلك [31:0] mux_out ؛
تعيين mux_out = rd_sel [1]؟ (rd_sel [0]؟ dout4 : dout3) : (rd_sel [0]؟ dout2 : dout1) ؛
دائما @ (clk negedge)
يبدأ
data_bus <= mux_out ؛
dout <= بيانات ؛
نهاية

endmodule
////////////////////////////////////////////////// //////////////////
ما سبق هو قانون بلدي الكامل.....

 
signal is not controlled by rd_en
at all.

في نظرة وهلة على الشفرة الخاصة بك استطيع ان اقول لكم ان اشارة data_bus
لا تسيطر عليها rd_en
على الإطلاق.
والملاحظة الثانية هي حول استخدام كل من حواف على مدار الساعة.أعتقد أنه ينبغي عليك تجنب ذلك ، لأن ذلك سيكون سببا في تناقص Fmax من التصميم الخاص بك.

 
في الواقع لقد استخدم data_bus كما سجل 32 بت وrd_enable ليس من المفترض أن السيطرة عليه سواء.هدفي هو أن محتويات المخزن في data_bus ينبغي أن تكون مكتوبة لdout سجل rd_enable عندما يحصل انخفاض....
هذا هو المكان الذي أنا تواجه مشكلة...
helpp....

 
statement in always
construction.

يجب عليك استخدام إذا كان
البيان دائما
في البناء.سيكون نقطة انطلاق مع "تمكين" المدخلات.
دائما @ (clk negedge)
يبدأdout <= data_bus;

إذا (! rd_en)
dout <= data_bus ؛
نهاية

إذا كنت بحاجة إلى جامع ، لديك لاستخدام
دائما @ (! rd_en) dout = data_bus ؛
فمن المستوى حساسة وشفافة على مستوى منخفض من rd_en.

 
لقد حاولت هنا لتصحيح رمز اور!كنت تستخدم كلا ارتفاع وهبوط
حواف clk لقد غيرت لposedge فقط!هذا الرمز سيكون على الأقل في الاتجاه الصحيح!
آمل أن يساعد هذا لك!رمز :

رأس وحدة (clk ،

sinit ،

الدين ،

wr_en ،

dout ،

ممتلئ ،

فارغ ،

البيانات ،

addr_en ،

rd_sel ،

readout_en ،

count_chk ،

addr_in) ؛مدخلات clk ، sinit ، readout_en ، addr_en ؛

مدخلات [31:0] الدين ؛

مدخلات [3:0] wr_en ؛

/ / لمجرد checkin

الإخراج [1:0] rd_sel ؛

//////////////////

مدخلات [1:0] addr_in ؛

inout [31:0] البيانات ؛

الإخراج [31:0] dout ؛

ريج [31:0] dout ؛

الإخراج [3:0] فارغة ، وبصورة كاملة ؛

سلك [39:0] data_count ؛

سلك [3:0] rd_en ؛

سلك [31:0] dout1 ، dout2 ، dout3 ، dout4 ؛

الإخراج [9:0] count_chk ؛ريج [31:0] DATA_reg ؛تعيين البيانات = DATA_reg ؛makeme block1 (. clk (clk). sinit (sinit). الدين (الدين) ،

. wr_en (wr_en [0]) ،. rd_en (rd_en [0]) ،. dout (dout1) ،

. كامل (الكامل [0]) ،. فارغة (فارغة [0]) ،

. data_count (data_count [9:0])) ؛

makeme Block2 (. clk (clk). sinit (sinit). الدين (الدين) ،

. wr_en (wr_en [1]) ،. rd_en (rd_en [1]) ،. dout (dout2) ،

. كامل (كامل [1]) ،. فارغة (فارغة [1]) ،

. data_count (data_count [19:10])) ؛

makeme Block3 (. clk (clk). sinit (sinit). الدين (الدين) ،

. wr_en (wr_en [2]) ،. rd_en (rd_en [2]) ،. dout (dout3) ،

. كامل (كامل [2]) ،. فارغة (فارغة [2]) ،

. data_count (data_count [29:20])) ؛

makeme block4 (. clk (clk). sinit (sinit). الدين (الدين) ،

. wr_en (wr_en [3]) ،. rd_en (rd_en [3]) ،. dout (dout4) ،

. كامل (كامل [3]) ،. فارغة (فارغة [3]) ،

. data_count (data_count [39:30])) ؛

تعيين count_chk = data_count [29:20] ؛

ريج [31:0] data_bus ؛/ * ----- \ /----- استبعاد ----- \ /-----

تعيين بيانات [1:0] = (addr_en)؟ addr_in : data_bus [1:0] ؛

تعيين بيانات [31:2] = readout_en؟ 30'b0 : data_bus [31:2] ؛

-----/ \ ----- استبعاد -----/ \ ----- * /دائما @ (/ ع * * / addr_en أو addr_in أو data_bus أو readout_en) يبدأ

DATA_reg = 32'bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz ؛

إذا كان (readout_en)

إذا كان (addr_en)

DATA_reg = (30'b0 ، addr_in) ؛

أيضا

DATA_reg = data_bus ؛

نهايةريج [1:0] rd_sel ؛

دائما @ (clk posedge)

يبدأ

إذا كان (addr_en)

rd_sel <= بيانات [1:0] ؛

نهايةتعيين rd_en = (readout_en)؟ (rd_sel [1]؟ (rd_sel [0]؟ 4'b1000 : 4'b0100) : (rd_sel [0]؟ 4'b0010 : 4'b0001)) : 4'b0000 ؛سلك [31:0] mux_out ؛

تعيين mux_out = rd_sel [1]؟ (rd_sel [0]؟ dout4 : dout3) : (rd_sel [0]؟ dout2 : dout1) ؛دائما @ (clk posedge)

يبدأ

data_bus <= mux_out ؛

dout <= بيانات ؛

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

آمل أن يساعد هذا

 

Welcome to EDABoard.com

Sponsor

Back
Top