2017-04-23 37 views
0

시스템에서 자일링스 FPGA를 구현하기 위해 32 비트 승수를 설명하는 데 VHDL을 사용하고 있는데, 웹에서 경험적으로 볼 수 있듯이 N 비트 크기의 입력을 가지고 있다면 출력은 (2 * N) 비트 크기 여야합니다. 나는 그것을 피드백 시스템을 위해 사용하고있다. 입력의 크기와 동일한 출력을 갖는 승수를 갖는 것이 가능한가?출력이 같은 쪽의 입력을 가진 VHDL 곱셈기

vhdl 코드에 동일한 크기의 신호로 연결된 덧셈기와 곱셈기 블록이있는 FPGA 응용 프로그램을 찾았 으면 한 번 맹세했습니다. 코드를 작성한 사람은 제품의 결과를 64 비트 신호에 넣기 만하면 결과가 가장 중요한 32 비트의 결과를 가져와야한다고 말했고 (가장 중요한 32 비트에 꼭 필요한 것은 아니 었습니다 64 비트 신호의). 나는 다음 코드를 사용하여 (분명히 작동) 시스템을 구축시

:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity Multiplier32Bits is 
    port(
     CLK: in std_logic; 
     A,B: in std_logic_vector(31 downto 0); 
     R: out std_logic_vector(31 downto 0) 
    ); 
end Multiplier32Bits; 

architecture Behavioral of Multiplier32Bits is 
signal next_state: std_logic_vector(63 downto 0); 
signal state: std_logic_vector(31 downto 0); 

begin 

    Sequential: process(CLK,state,next_state) 
    begin 
     if CLK'event and CLK = '1' then 
      state <= next_state(61 downto 30); 
     else 
      state <= state; 
     end if; 
    end process Sequential; 

    --Combinational part 
     next_state <= std_logic_vector(signed(A)*signed(B)); 

    --Output assigment 
    R <= state; 

end Behavioral; 

나는이 시점에서 내가 액티브 HDL FPGA 시뮬레이터 시뮬레이션 블록을 가지고 있기 때문에 일하고 있지만, 그러나 알고 자일링스 ISE Design Suite의 iSim을 사용하여 전체 32 비트 시스템을 시뮬레이트하고있다. 필자는 출력 결과가 A와 B 입력의 실제 제품과 큰 차이가 있다는 것을 알았습니다. 32 비트를 건너 뛰는 정확도가 느슨하거나 코드가 잘못되었다는 것을 알지 못합니다.

+0

오케이, 질문은 어디에 있습니까? – Staszek

+0

그리고 시뮬레이션에 사용한 번호를 제공하십시오. – Staszek

+0

결과를 정렬하려면 포스트 시프 팅을 사용하는 것이 좋습니다. 그리고 서명 된 고정 소수점 입력을 사용했습니다. – JHBonarius

답변

0

코드는 몇 가지 문제가 있습니다 감도 목록에 속하지 않는

  1. next_statestate
  2. CLK'event and CLK = '1'rising_edge(CLK)
  3. state <= state; 교체해야합니다 쓰기는 효과가 없습니다와 같은 몇 가지 도구가 발생
  4. ISE가 패턴을 잘못 읽었습니다. 그것을 제거하십시오.
  5. 작업자 주위에 공백을 넣어도 해를 입히지 않지만 가독성이 향상됩니다.
  6. 왜 a * b의 결과가 0에서 31 대신에 비트 30에서 61로 기대됩니까?
  7. statenext_state은 상태 시스템의 상태를 나타내지 않습니다. 그냥 레지스터 일뿐입니다.

향상된 코드 :

architecture Behavioral of Multiplier32Bits is 
    signal next_state: std_logic_vector(63 downto 0); 
    signal state: std_logic_vector(31 downto 0); 
begin 
    Sequential: process(CLK) 
    begin 
    if rising_edge(CLK) then 
     state <= next_state(31 downto 0); 
    end if; 
    end process Sequential; 

    --Combinational part 
    next_state <= std_logic_vector(signed(A) * signed(B)); 

    --Output assigment 
    R <= state; 
end architecture Behavioral; 
+0

'state'도 민감도 목록에 속하지 않습니다. 그리고'rising_edge (CALL)'->'rising_edge (CLK)'... 이것은 꼭 필요한 것은 아니지만. 그것은 지금의 방식을 종합 할 것입니다. – JHBonarius

+0

rising_edge (CLK)는 실제로 상승 에지인지 확인하고, 예를 들어 하이 임피던스에서 '1'로 변경하지 않는 것이 좋습니다. – Staszek

0

나는 완전히 Paebbels이 쓰는 모든 것을 동의합니다. 그러나 결과에 나오는 비트 수에 관해서이 점을 설명해 드리겠습니다. 그래서 나는베이스 (10)

9 * 9 = 81 (two 1 digit numbers gives maximum of 2 digits) 
99 * 99 = 9801 (two 2 digit numbers gives maximum of 4 digits) 
999 * 999 = 998001 (two 3 digit numbers gives maximum of 6 digits) 
9999 * 9999 = 99980001 (4 digits -> 8 digits) 

등등 ... 그것은 완전히 진에 대해 동일의 예에 의하여이를 설명 할 것이다. 그래서 출력은 (2 * N) 비트의 입력 크기입니다.

하지만 당신의 숫자가 작은 경우, 다음 요인으로, 숫자의 같은 수에 맞는 결과 : 등등

3 * 3 = 9 
10 * 9 = 90 
100 * 99 = 990 

그리고있다. 따라서 숫자가 충분히 작 으면 결과는 32 비트가됩니다. 물론, 이미 작성된 Paebbels의 결과는 신호의 중요한 부분에있을 것입니다.

J.H. 보나 리우스가 이미 지적했듯이, 입력이 정수가 아닌 고정 소수점으로 구성된다면 포스트 이동을해야 할 것입니다.이것이 귀하의 경우라면, 코멘트에 써 주시면 어떻게해야하는지 설명하겠습니다.

+0

감사합니다 Staszek !!, 맞아요, 제 경우입니다. 저는 고정 소수점 숫자와 부호를 모두 사용하고 있습니다. 그래서 MSBit가 부호 비트, 정수 부분의 2 비트 (출력 범위는 -1과 1 사이)로 사용됩니다. 그리고 분수 부분의 나머지 32 비트. 포스트 시프 팅에 대해 확신이 서지 않았기 때문에 응답을위한 MSBytes를 선택했습니다. 소수 부분에서 LSBytes를 풀면 배율기가 사용되는 시스템의 역학에 영향을 미치지 않습니다. 그러나 J.H. 보나리우스는 정확성을 돕는 것처럼 보이므로 시스템의 역 동성을 향상시킵니다. 감사! :) – Tebi

+0

실제로 출력 범위는 -4 ~ 3입니다. (9);) – Staszek