https://www.reddit.com/r/askscience/comments/1x3kwp/if_emc%C2%B2_does_energy_have_gravity/
Is the internal energy still mass when viewed from the edge of the universe because the energy has not yet reached the edge of the universe?
https://www.reddit.com/r/askscience/comments/1x3kwp/if_emc%C2%B2_does_energy_have_gravity/
Is the internal energy still mass when viewed from the edge of the universe because the energy has not yet reached the edge of the universe?
Modular exponentiation
a의 b승을 n으로 나눈 나머지를 구하는 연산(a, b, n은 양의 정수)
우선 나머지를 구하는 연산을 구현해본다.
a를 n으로 나눈 나머지를 구하려면 n보다 작아질때까지 a에서 n을 빼면 된다.
while (a > n) {
a = a - n;
}
while문을 빠져나온 a가 나머지가 된다.
그런데 a가 n보다 훨씬 크면 계산하는데 시간이 오래 걸린다.
a에서 a보다 작은 n의 배수를 빼면 시간을 줄일 수 있다.
이진수에서 왼쪽으로 bit shift를 1번 할때마다 2배의 숫자가 되는것을 이용하여 빠르게 계산 할 수 있다. (왼쪽으로 bit shift 할 때 최하위에 추가되는 bit는 0으로 한다.)
while (a > n) {
n_temp = n;
while (true) {
if (a < (n_temp << 1)) {
break;
}
n_temp = n_temp << 1;
}
a = a – n_temp;
}
이제 a의 b승을 n으로 나눈 나머지를 구하는 연산을 구현해 본다.
나머지연산의 곱셈의 성질에 의해 아래 연산이 성립한다.
이진수에서 오른쪽으로 1번 bit shift 할 때마다 1/2배가 되는것을 이용하여 빠르게 계산 할 수 있다.
이때 최하위 bit는 0 이어야 한다. (오른쪽으로 bit shift 할 때 최하위 bit가 사라진다. 오른쪽으로 bit shift 할 때 최상위에 추가되는 bit는 0으로 한다.)
이번에는 b의 bit shift를 이용한다. (b가 1이면 bit shift를 사용할 필요가 없다.)
b의 최하위 bit 가 1이면 1을 먼저 빼주고 오른쪽으로 bit shift 해야 한다.
오른쪽 bit shift 할 때 최하위 bit가 사라지기 때문에 지수의 (b-1)>>1을 b>>1로 바꿔도 동일하다.
b의
최하위 bit가
1일때
:
b의 최하위 bit 가 0이면 바로 오른쪽으로 bit shift 한다.
b의
최하위 bit가
0일때
:
b의
최하위 bit가
0일때와
1일때
둘다 형태의 항(term)이
있다.
이것은 제일 처음
구하고자 했던 와 비슷한 형태이다.
(a를
로,
b를 2로
치환)
따라서 를 재귀함수로
구현 할 수 있다.
modPow (a, b, n) {
if (b == 1) {
return mod(a, n);
}
temp = modPow(a, b >> 1, n);
temp2 = mod(temp * temp, n);
if (b의 최하위 bit가 0) {
return temp2;
}
if (b의 최하위 bit가 1) {
return mod(mod(a, n) * temp2), n);
}
}
mod (a, n) {
while (a > n) {
n_temp = n;
while (true) {
if (a < (n_temp >> 1)) {
break;
}
n_temp = n_temp >> 1;
}
a = a – n_temp;
}
return a;
}
실행파일
리눅스 aarch64 : https://drive.google.com/file/d/12dvyH6kfPCt7gHFdWtoEEkMuiiq6dwud/view?usp=share_link
리눅스 amd64 : https://drive.google.com/file/d/1zoumq9i2KbUPPPJ-vgDqT8-wpQ5-cmDr/view?usp=share_link
윈도우 amd64 : https://drive.google.com/file/d/10FZYGpA2fwOuff-j8X-cpd8aTzqreluB/view?usp=share_link
![]() |
한 개의 디코더(AND 배열 부분)와 Memory array의 이차원 배열(OR 배열)로 이루어져 있다.
|
![]() |
PAL의 구조는 AND 배열 부분을 사용자가 프로그램을 할 수가 있고 OR 배열은 고정되어 있다. 이 구조는 생산의 비용이 비교적 적게 들고 속도의 성능이 빠른 편이어서 많은 반도체 회사들이 이와 같은 기본 구조와 유사한 프로그램 가능한 소자들을 만들어 내고 있다.
|
![]() |
Complex Programmable Logic Device (CPLD)의 블록은 disjunctive normal form식과 더 특별한 논리 연산을 실행하는 logic이 포함된 macrocell이다.
하나의 (Programmable Interconnection array)PIA가 존재하므로 정확한 타이밍 예측이 가능하다.
|
![]() |
일반적인 기본 구조는 configurable logic blocks 어레이와 라우팅 채널로 구성된다. 일반적으로 모든 라우팅 채널은 동일한 폭을 가지고 있다. 응용회로는 적합한 자원을 가지는 FPGA를 반드시 매핑 해야 한다. 일반적인 FPGA의 논리 블록은 4개의 입력 룩업 테이블 (lookup table)과 플립플롭으로 구성된다.
|
always@(b, c)
begin
a = b & c
end
|
sensitivity list에 값 변화에 관여하는 모든 변수 포함 시켜야 한다. b, c 값의 변화가 일어나면 a의 값이 변경된다.
|
always@(posedge Clock)
begin
a = b & c;
end
|
sensitivity list에 clock과 reset, enable을 포함한다. b, c 값 변화와 상관없이 Clock이 상승할 때 a가 변경된다.
|
Latch 발생
|
해결 방법
| |
Always @(Enable, In_A)
begin
if(Enable)
begin
Data_Out = In_A;
end
end
|
if(Enable)
begin
Data_Out = In_A;
end
else
begin
Data_Out = In_B;
end
end
|
Data_Out = In_B;
if(Enable)
begin
Data_Out = In_A;
end
end
|
Enable이 0일 때 정의되지 않았다.
|
else문을 적어 모든 경우에 대해 정의 해 준다.
|
If 문 앞에 현재 상태를 정의 해 준다.
|
case(Data_In)
2’b00 : Data_Out = In_A;
2’b01 : Data_Out = In_B;
default : Data_Out = In_A;
endcase
|
case(Data_In)
2’b01 : Data_Out = 2’b10;
2’b10 : Data_Out = 2’b01;
endcase
|
Data_out = In_A;
case(Data_In)
2’b00 : Data_Out = In_A;
2’b01 : Data_Out = In_B;
endcase
|
default를 사용하여 모든 경우에 대해 정의해 준다.
|
Data_In이 2'b01과 2'b10 밖에 없는 경우 모든 경우에 대해 정의 된 것이다.
|
Case 문 앞에 기본 값을 넣어 준다.
|
rising edge
|
falling edge
|
always@(posedge Clock)
begin
…
end
|
always@(negedge Clock)
begin
…
end
|
Enable
|
Reset
|
always @(posedge Clock)
if(Enable)
Data_Out <= Data_In;
end
|
always @(posedge Clock)
if(!Reset)
Data_Out <= 0;
else
Data_Out <= Data_In;
end
|
Enable이 High일 때만 동작한다.
|
Reset이 Low일 때 Reset 시키고 그 외에는 입력 값이 출력 값으로 나온다.
|