2011-03-10 5 views
1

2 자리 숫자를 나눠서 별도로 표시 할 수 있도록해야합니다. 문제는 모드 2의 거듭 제곱에서만 작동하는 모드입니다. 어떻게 수행 할 수 있습니까? 계산이 사소한 경우를 제외하고Verilog에서 두 자리 숫자를 분할하는 방법

+0

2 자리 * 10 진수 *라는 뜻입니까? –

+0

"분할"및 "두 자리 수"로 무엇을 의미합니까? 숫자 '42'를 '4'와 '2'로 바꾸는 것과 같은 것이 있습니까? –

+0

예, 그렇습니다. –

답변

1

간단한 무력 솔루션은 10. 수는 "수십"자리보다 작은 10 가장 큰 다수의 배수에 전화 번호를 비교하는 경우 - 다른 블록을 사용하는 것, 그 차이는있다 "1"자릿수. 말했다

if (number >= 90) begin 
    tens <= 9; 
    ones <= number - 90; 
end else if ... 

,이 확장하지 않고, 거대한 경우 - 다른 블록은 일반적으로 좋은 방법이 아니다.

2

http://www.edaboard.com/thread112872.html에서

많은 합성 도구는 2의 거듭 제곱으로, 등의 부문을 정수 나누기/계수/나머지 을 지원하지 않습니다. 값이 2의 거듭 제곱이 아니라면 당신은 아마 운이 없을 것입니다.

어쩌면 당신은, 을 자신의 수학 모듈을 구축하거나 소프트웨어의 IP 라이브러리에서 수학 코어를 사용하는 등 다른 방법 을 사용할 수 있습니다.

아니면이 분획하여 1/K를 승산하는 대신

두 피연산자가 작은 경우 K.

의해 나누어 분할 근사 할 경우 롬 룩업 테이블에서 결과를 가져올 수있다.

-1

다소 혼란스러운 질문입니다. "디스플레이"라고 말하면, 나는 곧 모델링과 시뮬레이션 인 $display을 생각합니다. 모델링을위한 모듈로에는 2 가지 제한이 없습니다.

비록 합성을 의미한다고하더라도 일반적으로 모듈러스는 2의 제곱근에서만 작동한다는 것은 사실이 아닙니다.하지만 하드웨어에서 비용이 많이 들기 때문에 이렇게하는 것은 좋지 않습니다.

+0

$ display를 사용하려고하지 않습니다. 이진수의 10 진수 값을 표시하려면 7 세그먼트 LED를 켜야합니다.하나의 LED에 십진수를 표시 할 수있는 모듈이 있습니다. 이 모듈을 사용하여 두 자리 숫자를 표시하려고하므로 이진수를 두 자리 숫자로 나눌 필요가 있습니다. –

2

간단한 증분 값이면 Binary Coded Decimal 카운터를 고려해야합니다. 숫자 당 4 비트가 필요하지만 7 세그먼트 디스플레이와의 인터페이스가 훨씬 수월해집니다.

//BCD counter - I did not test this 
reg [3:0] digit_one, digit_two;  
always @(posedge clk) 
    begin : led_digits 
    if(reset) 
    begin 
    digit_one <= 0; 
    digit_two <= 0; 
    end 
    else if(increment) 
    begin 
    //BCD values wrap at 9 
    if(digit_one == 4'd9) 
     digit_one <= 0; 
    else 
     digit_one <= digit_one + 1; 

    //Carry when previous digit wraps 
    if(digit_one == 4'd9) 
     begin 
     if(digit_two == 4'd9) 
     digit_two <= 0; 
     else 
     digit_two <= digit_two + 1; 
     end 
    end 
    end 

표시해야하는 임의의 십진수 값이 있으면 더 복잡해집니다. GuanoLoco의 솔루션은 2 자리 출력을 위해 작동해야합니다. 보다 효율적인 알고리즘이 존재하지만 implementation은 그리 간단하지 않습니다.