كيف يمكنني تحويل رقم إلى المتمم في verilog?
سؤال
أنا أحاول تصميم 4 بت الأفعى subtracter في verilog.هذا هو فقط الشيء الثاني أنا قد كتبت في verilog و أنا لا أعرف كل بناء الجملة الصحيح حتى الآن.هذا هو وحدة عندي حتى الآن:
module Question3(carryin, X, Y, Z, S, carryout, overflow);
parameter n = 4;
input carryin, Z;
input [n-1:0]X, Y;
output reg [n-1:0]S;
output reg carryout, overflow;
if(Z==0)
begin
Y = not(y) + 4'b0001;
end
always @(X, Y, carryin)
begin
{carryout, S} = X + Y + carryin;
overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
end
endmodule
بلدي مترجم (xilinx 10.1), يقول "خطأ في بناء الجملة إذا قرب." لقد حاولت العديد من الطرق المختلفة لعمل التحويل ، بما في ذلك فقط باستخدام هذه الحالة أن يأخذ Y كحجة ، ثم يتحقق كل شيء ممكن 4-بت مجموعات ، وتحويلها الى المتمم.
Z هو ما يحدد ما إذا كانت الأفعى لا الطرح أو ذلك.إذا كان 0 يعني الطرح و أريد تحويل y أن المتمم ، ثم مجرد القيام العادية بالإضافة إلى ذلك.أنا متأكد من بقية الأفعى هو الصحيح, أنا فقط لا أعرف ما هو الخطأ مع الجزء الذي أحاول تحويل.
المحلول
reg [n-1:0] Y_compl;
always @( Z, Y, X, carryin ) begin
Y_ = ( ~Y + 4'b0001 );
if ( Z == 1'b0 ) begin
{carryout, S} = X + Y_compl + carryin;
overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
end
else begin
{carryout, S} = X + Y + carryin;
overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
end
end
عددا من النقاط الهامة.
- وضع إذا كان البيان داخل دائما كتلة.وليس دائما كتل, سوف تخلق حالة سباق في محاكاة.
- أنا إنشاء متغير جديد ، Y_ لأن استخدام Y, وهو إدخال تذكر على الجانب الأيسر من مهمة ربما نستنتج المزالج أو تفعل شيئا آخر سيئة عند تجميع.
- أقترح استخدام المعامل عكس المشغل '~' عكس Y بدلا من ذلك إذا كان 'لا' البدائية.تركيب أداة والمزيد من الحرية في تحسين التعليمات البرمجية الخاصة بك بهذه الطريقة.
- التحقق من النتائج الصحيحة, لقد كانت لحظة منذ ان بنيت الأفعى.
نصائح أخرى
وأنت تستخدم بأحرف صغيرة "ص" في "Y = لا (ذ) + 4'b0001."
وكما كنت تستخدم المزيد من الإضافات مما تحتاج إليه. X-Y هو نفس الشيء كما NOT (NOT (X) + Y).
ووضع بيان إذا ضمن كتلة و
الأولي
http://www.asic-world.com/verilog/vbehave1.html