현재의 입력 + 현재의 상태(과거의 입출력 정보가 반영된 현재의 상태)가 현재의 출력을 결정하는 논리
1비트를 저장하는 최소 메모리 소자
플립 플롭은 클럭의 엣지에서 입력을 샘플링하여 저장한다.
always 블록을 활용하여 플립 플롭을 구현할 수 있다.
always @(posedge clk) begin
// 클럭 상승 엣지에서 실행
end
always @(negedge clk) begin
// 클럭 하강 엣지에서 실행
end
이렇게 sensitivity list에 posedge clk 또는 negedge clk를 적어주면 엣지트리거 Flip Flop 으로 동작한다.
module d_flip_flop (
input wire clk,
input wire d,
output reg q
);
always @(posedge clk) begin
q <= d; // 상승 엣지에서 d를 q에 저장
end
endmodule
D flip flop 의 구현이다.
회로를 초기화하는 기능
리셋에는 동기 리셋, 비동기 리셋이 존재한다.
동기 리셋 : 클럭 엣지에서 리셋을 수행비동기 리셋 : 리셋 신호 들어오는 즉시 리셋을 수행 // 동기 리셋의 구현
module sync_reset_ff (
input wire clk,
input wire rst, // 동기 리셋 (active high)
input wire d,
output reg q
);
always @(posedge clk) begin
if (rst)
q <= 1'b0; // 리셋
else
q <= d; // 정상 동작
end
endmodule
동기 리셋은 위와 같이 클럭에 동기화되어, 클럭의 상승 엣지에서만 리셋이 일어난다.
// 비동기 리셋의 구현
module async_reset_ff (
input wire clk,
input wire rst_n, // 비동기 리셋 (active low)
input wire d,
output reg q
);
// 감지 리스트에 리셋 추가!
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1'b0; // 리셋 (즉시!)
else
q <= d; // 정상 동작
end
endmodule
비동기 리셋은 클럭과 비동기적으로 동작한다. 즉, 리셋 신호가 들어오는 즉시 리셋이 실행된다.
플립 플롭의 동작 여부를 제어하는 신호
module enabled_register (
input wire clk,
input wire rst_n,
input wire en, // enable 신호
input wire [7:0] d,
output reg [7:0] q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 8'b0;
else if (en) // enable일 때만 갱신
q <= d;
// else: q 유지 (암묵적)
end
endmodule
위와같이 클럭이 들어오더라도 if문을 한번 더 거치도록해서
-> enable 신호가 들어왔을때만 플립플롭이 동작하도록 설계한다
module counter_8bit (
input wire clk,
input wire rst_n,
input wire en,
output reg [7:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 8'b0;
else if (en)
count <= count + 1'b1;
end
endmodule
module shift_register (
input wire clk,
input wire rst_n,
input wire serial_in,
output reg [7:0] parallel_out
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
parallel_out <= 8'b0;
else
parallel_out <= {parallel_out[6:0], serial_in};
end
endmodule
시프트 레지스터 동작:
클럭마다 왼쪽으로 시프트, 오른쪽에 새 비트 입력
초기: 0000_0000
입력 1: 0000_0001
입력 0: 0000_0010
입력 1: 0000_0101
입력 1: 0000_1011
...