2 자리 숫자를 나눠서 별도로 표시 할 수 있도록해야합니다. 문제는 모드 2의 거듭 제곱에서만 작동하는 모드입니다. 어떻게 수행 할 수 있습니까? 계산이 사소한 경우를 제외하고Verilog에서 두 자리 숫자를 분할하는 방법
답변
간단한 무력 솔루션은 10. 수는 "수십"자리보다 작은 10 가장 큰 다수의 배수에 전화 번호를 비교하는 경우 - 다른 블록을 사용하는 것, 그 차이는있다 "1"자릿수. 말했다
if (number >= 90) begin
tens <= 9;
ones <= number - 90;
end else if ...
,이 확장하지 않고, 거대한 경우 - 다른 블록은 일반적으로 좋은 방법이 아니다.
http://www.edaboard.com/thread112872.html에서
많은 합성 도구는 2의 거듭 제곱으로, 등의 부문을 정수 나누기/계수/나머지 을 지원하지 않습니다. 값이 2의 거듭 제곱이 아니라면 당신은 아마 운이 없을 것입니다.
어쩌면 당신은, 을 자신의 수학 모듈을 구축하거나 소프트웨어의 IP 라이브러리에서 수학 코어를 사용하는 등 다른 방법 을 사용할 수 있습니다.
아니면이 분획하여 1/K를 승산하는 대신
두 피연산자가 작은 경우 K.
의해 나누어 분할 근사 할 경우 롬 룩업 테이블에서 결과를 가져올 수있다.
다소 혼란스러운 질문입니다. "디스플레이"라고 말하면, 나는 곧 모델링과 시뮬레이션 인 $display
을 생각합니다. 모델링을위한 모듈로에는 2 가지 제한이 없습니다.
비록 합성을 의미한다고하더라도 일반적으로 모듈러스는 2의 제곱근에서만 작동한다는 것은 사실이 아닙니다.하지만 하드웨어에서 비용이 많이 들기 때문에 이렇게하는 것은 좋지 않습니다.
$ display를 사용하려고하지 않습니다. 이진수의 10 진수 값을 표시하려면 7 세그먼트 LED를 켜야합니다.하나의 LED에 십진수를 표시 할 수있는 모듈이 있습니다. 이 모듈을 사용하여 두 자리 숫자를 표시하려고하므로 이진수를 두 자리 숫자로 나눌 필요가 있습니다. –
간단한 증분 값이면 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은 그리 간단하지 않습니다.
2 자리 * 10 진수 *라는 뜻입니까? –
"분할"및 "두 자리 수"로 무엇을 의미합니까? 숫자 '42'를 '4'와 '2'로 바꾸는 것과 같은 것이 있습니까? –
예, 그렇습니다. –