대소문자를 구별한다.
신호 정의 시 키워드 wire 이용 (일반적으로 1bit)
숫자표현법 : 비트 단위길이 ' + 진법 + 값
모듈 : 어떤기능을 수행하는 회로의 집합
범위 : 키워드 module로 시작, endmodule 로 끝남
모듈 내 다른 모듈 정의 불가
모듈 이름 : 알파벳, 언더 바로 시작 가능하지만 숫자나 기호로 시작은 불가능
입출력 신호 : input , output
‣ 표현방법 1 : 모듈 이름 뒤 가로 안에 이름과 키워드를 나열한다.
‣ 표현방법 2 : 가로 안에 이름만 나열하고, 모듈 안에 키워드, 이름을 선언
Q. 여러비트로 표현된 신호라면?
표현방법 : <type> [<left index> : <right index>] <name>
ex) 4비트 신호 foo : wire [3:0] foo; 8b 신호 bar : reg [7:0] bar;
left idx 가 msb --------- right idx 가 lsb
[:] 표시 없으면 1b라고 가정함 = [0:0]
초기화 방법
ex) wire [15:0] my_vector = 16'b1000_0100_1010_1010;
주석은 c++과 유사하다 - // : 모듈 밖(안) /* */ : block comment
8.4 data flow modeling
벨로그 비트/논리 연산자
bitwise/reduction boolean logical
논리연산자 ex ) NOT AND OR
- 1bit의 경우 비트/논리 연산자의 수행이 무관하다.
Q. &와 && 차이는?
A. &는 여러비트 연산 시 각 비트마다 논리연산이 이뤄진다.
int a =5 ; //0101
int b =3 ; //0011
int result = a& b // 0001 //두 비트가 모두 1 일 때만 1
int a = 5;
int b = 3;
if (a > 0 && b > 0) {
// a와 b가 모두 0보다 크므로 true
}
//c++
키워드 assign
: 신호에 값을 배정할 때
wire ab,c,d;
assign d = (a&&b) || c;
// a&b (각 비트별 and연산) 1비트기 때문에 동일하다!
// c' 가 아닌 ~c 또는 !c를 써야한다.
/* **c'**는 Verilog에서 허용되지 않는 표기법입니다.
**~c**는 c의 비트wise NOT을 수행하며, 각 비트를 반전시킵니다.
**!c**는 c의 논리적 NOT을 수행하며, c가 0이면 1, 그렇지 않으면 0을 반환합니다.
따라서 ~c 또는 **!c**를 사용해야 올바른 결과를 얻을 수 있습니다. */
// half adder 설계하기
module half_adder (input a,b output sum, crazy);
assign sum = a^b;
assign carry = a & b;
endmodule
// 회로 설계 예제 1
module my_circuit (w,x,y,z1,z2);
input w,x,y;
output z1, z2;
assign z1 = w^ ~(x|y);
assign z2 = (w & y) ^ x ^ x;
endmodule
// 다르게 바꿔보기
module my_circuit (w,x,y,z1,z2);
input w,x,y;
output z1, z2;
wire f1, f2, f3;
assign f1 = (x&y);
assign f2 = ~(x|y);
assign z1 = w ^ f2;
assign f3 = f1 ^x^x;
endmodule
//2 to 4 decoder
module decoder( e, x1, x0, d0, d1, d2, d3);
input e, x0, x1; // 입력 신호
output d0, d1, d2, d3; // 출력 신호
// 출력 d0, d1, d2, d3를 각 입력에 따라 정의
assign d0 = (e & ~x1 & ~x0); // e가 1이고, x1과 x0가 00일 때 d0가 1
assign d1 = (e & ~x1 & x0); // e가 1이고, x1은 0, x0는 1일 때 d1이 1
assign d2 = (e & x1 & ~x0); // e가 1이고, x1은 1, x0는 0일 때 d2가 1
assign d3 = (e & x1 & x0); // e가 1이고, x1과 x0가 11일 때 d3이 1
endmodule
// 2 to 1 mux 다른 구현방법
module mux 2to1 (s, d0,d1, z) ;
input s, d0, d1;
output z;
assign z = s? d1 : d0;
endmodule
//삼항연산자 없이 구현
module mux 2to1 (s, d0,d1, z) ;
input s, d0, d1;
output z;
assign z = (~s & d0) | (s _& d1);
endmodule
Testbench
: 주어진 회로를 검증하는 환경
- 설계한 회로에 입력 신호를 인가하고 출력신호가 맞는지 확인 함
- 디지털 회로로 쉽게 구현할 수 있는 다양한 문법을 쓸 수 있다.
'Major S-T-U-D-Y > Digital System' 카테고리의 다른 글
[논리회로] 7 (2) 동기식 J/K , D FF 카운터의 설계과정 (0) | 2024.12.01 |
---|---|
[논리회로] 7 (1) 비동기적(ripple) 카운터와 동기적 카운터(mod/up-down/presettable) (1) | 2024.11.29 |
[논리회로] 5 (2) S-R Flip-Flop 과 J-K Flip-Flop (0) | 2024.11.17 |
[논리회로] 5 (1) NAND/NOR Gate Lanch (set/reset) (0) | 2024.11.17 |
[논리회로] 8 (2) 벨로그_if-else와 case 문 (0) | 2024.11.17 |