2012-06-14 7 views
1

안녕하세요, 가능하면 VHDL에서 두 개의 STD_LOGIC_VECTORS과 함께 사용했는지 궁금합니다. 예를 들어, VGA 모니터에 문자를 출력하는 VHDL 프로그램을 작성하고 있습니다. 벡터 PixelRow: IN STD_LOGIC_VECTOR(9 DOWNTO 0)PixelColumn: IN STD_LOGIC_VECTOR(9 DOWNTO 0)입니다. 내가 뭘 하려는지 STD_LOGIC 출력 두 픽셀 벡터 걸리고 다른 벡터 예를 ANDs 있습니다.두 개의 STD_LOGIC_VECTORS의 비트 ANDYING

Output <= (PixelRow AND NOT "0000000000") OR (PixelColumn AND NOT "0000000000") OR  
       (PixelRow AND NOT "0111011111") OR (PixelColumn AND NOT "1001111111"); 

나는 다음과 같은 코드를 단순화 할 수 있습니다 바라고이 코드는 :

Output <= ((NOT PixelRow(0) AND NOT PixelRow(1) AND NOT PixelRow(2) AND NOT 
       PixelRow(3) AND NOT PixelRow(4) AND NOT PixelRow(5) AND NOT PixelRow(6)  
       AND NOT PixelRow(7) AND NOT PixelRow(8) AND NOT PixelRow(9))) 
      OR ((NOT PixelRow(0) AND PixelRow(1) AND PixelRow(2) AND PixelRow(3) AND 
       NOT PixelRow(4) AND PixelRow(5) AND PixelRow(6) AND PixelRow(7) AND 
       PixelRow(8) AND PixelRow(9))) 
      OR ((NOT PixelColumn(0) AND NOT PixelColumn(1) AND NOT PixelColumn(2) AND 
       NOT PixelColumn(3) AND NOT PixelColumn(4) AND NOT PixelColumn(5) AND NOT 
       PixelColumn(6) AND NOT PixelColumn(7) AND NOT PixelColumn(8) AND NOT 
       PixelColumn(9))) 
      OR ((PixelColumn(0) AND NOT PixelColumn(1) AND NOT PixelColumn(2) AND 
       PixelColumn(3) AND PixelColumn(4) AND PixelColumn(5) AND PixelColumn(6) 
       AND PixelColumn(7) AND PixelColumn(8) AND PixelColumn(9))); 

코드의 큰 블록은 화면 주위에 상자를 그립니다. 나는 이것을하기위한 훨씬 쉬운 방법이 있기를 바라고있다. 아무도이 코드를 단순화하는 방법을 알고 있습니까? 그것은 나에게 분명하지 않다

감사

+0

귀하의 제안에 감사드립니다. 당신은 모두 내 문제를 해결하는 데 매우 도움이되었습니다! –

답변

4

당신은에 필요한 및/또는, 당신은 하나의 비트를 줄이기 위해 필요.

물론 동일한 크기의 벡터를 반환하는 비트 단위 벡터 연산자는 andor입니다. PixelRow /= "0000000000" 또는 PixelRow = "0000000000" : 당신이 PixelRow"0000000000" 평등/불평등을 테스트해야하는 경우

, 당신은 하나를 쓸 수 있습니다. 당신은 당신이 function를 정의 할 수 있습니다 자주이 작업을 수행해야하는 경우

process (vect) is 
    variable tmp : std_logic; 
begin 
    tmp := '1'; 
    for I in 7 downto 0 loop 
     tmp := tmp and vect(I); 
    end loop; 
    bit <= tmp; 
end process; 

: 단일 비트 bit : std_logic에 벡터 vect : std_logic_vector(7 downto 0)을하고-감소해야하는 경우

는 가장 쉬운 방법은 프로세스를 사용하는 아마 이를 수행하려면 process이 필요합니다.

+2

VHDL 2008은 축소 연산자에 대한 지원을 추가 했으므로 다음과 같이 쓸 수 있습니다. 'bit <= and vector; 'bit <= vector (0) 및 vector (1) and ... and vector n); – rick

3

그냥 비트 단위 싶습니다 및 VHDL 두 std_logic_vectors 그것이과 같이 수행 될 경우

signal a : std_logic_vector(15 downto 0); 
signal b : std_logic_vector(15 downto 0); 
signal x : std_logic_vector(15 downto 0); 

x <= a AND b; 
구글은 그들이 매우 직관적입니다 (비트 단위 사업자의 나머지와 함께 당신을 도울 수

, AND, NAND, OR, NOR, NOT 등)

이를 감소하려는 경우 :

Output <= ((NOT PixelRow(0) AND NOT PixelRow(1) AND NOT PixelRow(2) AND NOT 
... 
      AND PixelColumn(7) AND PixelColumn(8) AND PixelColumn(9))); 

는 그런 다음 아주 간단합니다.

output <= PixelRow(0) AND PixelRow(1) AND 
    ... AND PixelRow(8) AND PixelRow(9) 

가 '1'로 줄입니다 PixelRow = "1111111111";

AND 연산자의 진리표에서 살펴보면, 당신은 유일한 시나리오를 찾을 수 있습니다 한 번에

output <= '1' when (PixelRow = "1111111111") else '0' 

모두 열 및 행 :

SO, asynchronusly, 코드가로 대체 될 수 위에서 언급 한

output <= '1' when (PixelRow = "1111111111") OR 
        (PixelColumn = "1111111111") else 
      '0'; 

교장은 원래에 언급 된 다른 작업으로 확장 할 수 있습니다 게시물 :

other_value <= "0111011111"; 
output <= '1' when ((PixelRow AND (NOT(other_value))) = "111111111") else '0' 

등식 nd/또는 작업을 동 기적으로 수행하는 것은 독자의 연습 문제로 남겨 둡니다.

0

당신이 실제로하고 싶은 것처럼 보이는 것이 PixelRowPixelCol과 몇 가지 수치를 비교합니까?

그에게 unsigned 벡터를 확인하고 같은 것을 할 (내가 번호 (100, 200)로 구성 - 그들이 코드 자체 문서화를 만들기 위해 당신은 정수 상수를 정의하는 것이 더있을 수 있습니다) :

output <= '1' when pixelRow = 0 or pixelCol = 0 or pixelRow = 100 or pixelCol = 200 
      else '0'; 

하자를 신디사이저는 논리를 계산합니다.

관련 문제