0

私は問題に直面しています...p3、p6、p9、p1、p4p7が8ビットstd_logic_vectorです。

(p3 + 2 * p6 + p9)-(p1 + 2 * p4 + p7)のような操作をマルチピアなしでシフト操作(2 =>左シフト1)で実行したいので、結果は+または-になります。 ve。

署名されたものが必要です。255を超える場合は、結果を255にします。それ以外の場合は、8ビット値を指定します。最初のh1は間違った結果を出している。

以下にコードがあります

-

- Company: 
-- Engineer: 
-- 
-- Create Date:    21:01:45 01/11/2013 
-- Design Name: 
-- Module Name:    HRZ - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity HRZ is
PORT ( CLK     : IN  STD_LOGIC;
             RST     : IN  STD_LOGIC;
             P1,P3,P4,P6,P7,P9 : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
             MAG_HRZ : OUT  STD_LOGIC_VECTOR(7 DOWNTO 0) );
end HRZ;

architecture Behavioral of HRZ is
SIGNAL H1: signed(17 DOWNTO 0) ;

SIGNAL THRESHOLD: signed(17 DOWNTO 0):="000000000011111111";
begin
P :  PROCESS(CLK)

BEGIN

H1<=SIGNED(('0'&P3+'0'&P6(7 DOWNTO 0)&'0'+'0'&P9)-('0'&P1+'0'&P4(7 DOWNTO 0)&'0'+'0'&P7));
IF(H1>=THRESHOLD) THEN
MAG_HRZ<="11111111";
ELSE
 IF H1(17)='0' THEN
  MAG_HRZ<=H1(7)&H1(6)&H1(5)&H1(4)&H1(3)&H1(2)&H1(1)&H1(0);
  ELSE
 MAG_HRZ<=NOT(H1(7)&H1(6)&H1(5)&H1(4)&H1(3)&H1(2)&H1(1)&H1(0))+'1';

  END IF;
END IF;
END PROCESS P;
end Behavioral;
vh
4

2 に答える 2

1

ライブラリ IEEE.STD_LOGIC_ARITH および IEEE.STD_LOGIC_UNSIGNED の使用は非推奨と見なされます。代わりに IEEE.NUMERIC_STD を使用する必要があります。それに加えて、明示的な範囲を
指定する必要はないと思いますが、うまくいくはずです。についても同様です。 私はそれをテストしませんでしたが、試してみてください。ここでの問題は、符号付きに変換するときの符号拡張だと思うので、先頭にゼロを追加すると修正されるはずです。P4(7 downto 0)P4P6
SIGNED('0'&(('0'&P3+'0'&P6&'0'+'0'&P9)-('0'&P1+'0'&P4&'0'+'0'&P7)));

于 2013-03-02T12:47:22.167 に答える
0

私は整数を使用します。人生ははるかに簡単です...入力を制限します:

variable p1,p2,... : integer range 0 to 255;

あなたの2つの中間値も符号なしです(またはnatural整数の世界にあります):

variable i1, i2 : natural;

i1 := p3 + p6*2 + p9;
i2 := p1 + p4*2 + p7;

最終値は符号付きの値である必要があるため、次のintegerタイプです。

variable final : integer;

final := i1 - i2;

これは 80 年代ではありません。シンセサイザーは非常にスマートです。シンセサイザーに理解させてください。そして「それを発射する」場合

  • ビットシフトを入れるだけではありません*2
  • final必要なビット数を計算する必要があるため、範囲を適切なビット数に減らすことはありません。それでも、マッパーはおそらく後でそれを理解し、不要なビットを最適化します
于 2013-03-05T10:26:13.877 に答える