2015년 6월 13일 토요일

[Velilog] Combinational Logic, Sequential Logic, Latch, Flip-flop


Combinational Logic
clock의 영향을 받지 않고 sensitivity list에 값 변화에 영향을 받는다.
always@(b, c)
begin
a = b & c
end
sensitivity list에 값 변화에 관여하는 모든 변수 포함 시켜야 한다. b, c 값의 변화가 일어나면 a의 값이 변경된다.
Sequential Logic
clockrising/falling edge에서 작동한다.
always@(posedge Clock)
begin
a = b & c;
end
sensitivity listclockreset, enable을 포함한다. b, c 값 변화와 상관없이 Clock이 상승할 때 a가 변경된다.
 
Latch
enable=1인 동안(또는 0인 동안) 값을 받아들이고 그 반대의 경우 현재 상태를 유지한다. 제어에 어려움이 있기 때문에 보통 사용하지 않으며 의도하지 않은 latch가 생기는 것을 방지해야한다.
Flip-flop
clock이 변화하는 순간(0 1 또는 1 0)에만 입력 신호를 받아들인다.
 






Unintentional Latch Inference
if/case에서 모든 branch에 대해 정의되어 있지 않을 때, clockedge 부분에서 일어나지 않을 때 발생한다.
If
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
Enable0일 때 정의되지 않았다.
else문을 적어 모든 경우에 대해 정의 해 준다.
If 문 앞에 현재 상태를 정의 해 준다.
 
Case
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_In2'b012'b10 밖에 없는 경우 모든 경우에 대해 정의 된 것이다.
Case 문 앞에 기본 값을 넣어 준다.
 
D type Flip-Flop
Flip-flop 사용법
rising edge
falling edge
always@(posedge Clock)
begin
end
always@(negedge Clock)
begin
end
Synchronous
Asynchronous
always @(posedge Clock)
if(!SynReset)
Data_Out <= 0;
else
Data_Out <= Data_In;
end
always @(posedge Clock or negedge AsynReset)
if(!AsynReset)
Data_Out <= 0;
else
Data_Out <= Data_In;
end
ClockHigh로 변하는 순간에만 Data_Out 값이 변한다.
Clock의 값과 관계없이 AsynResetLow로 변하는 순간 Data_Out 값이 변한다.
event list 극성과 edge condition이 일치해야 한다.
always@(posedge clk or negedge AsynReset) if(!AsynReset)
always@(posedge clk or posedge AsynReset) if(AsynReset)
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
EnableHigh일 때만 동작한다.
ResetLow일 때 Reset 시키고 그 외에는 입력 값이 출력 값으로 나온다.

댓글 없음:

댓글 쓰기