ฉันมีรหัส VHDL ที่ฉันพยายามคูณค่าพิกเซล ฉันมีเอนทิตีดังต่อไปนี้:
entity xGradient is
port(
clk : in std_logic;
x11, x12, x13, x21, x22, x23, x31, x32, x33 : in integer range 0 to 255;
gradientInX : out integer range 0 to 255
);
end xGradient;
ฉันดำเนินการต่อไปนี้กับสิ่งเหล่านี้:
gradientInX <= x11 + 2*x21 + x31 - x13 - 2*x23 - x33;
ปัญหาที่คุณอาจสังเกตเห็นคือค่าที่ได้รับจากการดำเนินการเกินช่วงของค่าที่เป็นไปได้ที่จำนวนเต็มเอาต์พุตของฉันสามารถเป็นได้ การจำลองของฉันล้มเหลวเมื่อสิ่งนี้เกิดขึ้น ฉันไม่รู้ว่าคำที่ถูกต้องสำหรับสิ่งที่ฉันพยายามทำอยู่ ดังนั้นจึงดูเหมือนจะไม่สามารถหาวิธีแก้ไขปัญหานี้ได้ และมันทำให้ฉันแทบบ้า โดยพื้นฐานแล้วฉันแค่ต้องการตัดทอนหรือลดขนาดของเอาต์พุตเพื่อให้แน่ใจว่าพอดีกับพอร์ตเอาท์พุตของการไล่ระดับสี InX ฉันลองใช้บล็อกกระบวนการเช่นนี้:
-- declared signals
signal gradientMem: integer;
--beginning of my architecture
begin
SobelOperator : process(gradientMem)
begin
gradientMem <= x11 + 2*x21 + x31 - x13 - 2*x23 - x33;
if (gradientMem > 255) then
gradientMem <= 255;
elsif (gradientMem < 0) then
gradientMem <= 0;
end if;
end process SobelOperator;
จากนั้นกำหนดไล่ระดับMemให้กับgradientInXแต่มันไม่ทำงานด้วยเหตุผลบางประการ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมจริงๆ หมายเหตุ: ฉันไม่ได้รวมโค้ด VHDL ทั้งหมดเนื่องจากฉันคิดว่ามันจะยาวโดยไม่จำเป็น ข้อความแสดงข้อผิดพลาดที่ฉันได้รับคือสัญญาณผลลัพธ์จากการดำเนินการอยู่นอกช่วง (เนื่องจากค่าผลลัพธ์เป็นลบและเอาต์พุตมีช่วงเพียง 0 ถึง 255)
แมทธิว
gradientMen
และ 2) ข้อความแสดงข้อผิดพลาด VHDL ตรวจสอบขอบเขตของช่วงที่ได้รับมอบหมาย คุณต้องการสร้างเลขคณิตความอิ่มตัว ดังนั้นกำหนดgradientMem
ด้วยช่วงที่ใหญ่กว่า - person Paebbels   schedule 09.04.2017