06 Dataflow Modeling
๐Ÿ”ฎ

06 Dataflow Modeling

Description
Date
Sep 18, 2023
URL
์ƒํƒœ
Done
Tags
Digital Design

์ง€์†์ ์ธ ํ• ๋‹น (Continuous Assignments)

  • ์ง€์†์ ์ธ ํ• ๋‹น์€ ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ ๋ชจ๋ธ๋ง์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ๋ฌธ์œผ๋กœ, ๋„ท์— ๊ฐ’์„ ์ฃผ์ž…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ
    • ์ด ํ• ๋‹น์€ ํšŒ๋กœ์˜ ์„ค๋ช…์—์„œ ๊ฒŒ์ดํŠธ๋ฅผ ๋Œ€์ฒดํ•จ
      • continuous_assign ::= assign I drive_strength 1 | delay3 1 list _of_net_assignments; list_of_net_assignments ::= net_assignment { , net_assignment } net_assignment ::= net_lvalue = expression
  • ์ง€์†์ ์ธ ํ• ๋‹น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ€์ง
    • ์ง€์†์ ์ธ ํ• ๋‹น์€ ํ•ญ์ƒ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ
    • ์™ผ์ชฝ ํ•ญ์€ ํ•ญ์ƒ ์Šค์นผ๋ผ ๋˜๋Š” ๋ฒกํ„ฐ ๋„ท์ด์–ด์•ผ ํ•จ (์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ)
    • ์˜ค๋ฅธ์ชฝ ํ•ญ์€ ๋ ˆ์ง€์Šคํ„ฐ๋‚˜ ๋„ท, ๋˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ์Œ
    • ํ• ๋‹น์— ๋Œ€ํ•ด ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์ง€์—ฐ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • // ์ง€์†์ ์ธ ํ• ๋‹น. out์€ ๋„ท(net)์ž„. i1๊ณผ i2 ์—ญ์‹œ ๋„ท์ž„ assign out = i1 & i2; // ๋ฒกํ„ฐ ๋„ท์„ ์œ„ํ•œ ์ง€์†์ ์ธ ํ• ๋‹น. addr์€ 16๋น„ํŠธ ๋ฒกํ„ฐ ๋„ท์ž„ // addr1๊ณผ addr2๋Š” 16๋น„ํŠธ ๋ฒกํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์ž„ assign addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0]; // ์—ฐ๊ฒฐ(Concatenation). ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ์Šค์นผ๋ผ ๋„ท๊ณผ ๋ฒกํ„ฐ ๋„ท์˜ ์—ฐ๊ฒฐ์ž„ assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in;
        - ์ฒซ ๋ฒˆ์งธ ์ค„: `i1`๊ณผ `i2`์˜ ๋…ผ๋ฆฌ๊ณฑ์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ด๋ฅผ `out`์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ - ๋‘ ๋ฒˆ์งธ ์ค„์€ 16๋น„ํŠธ ๋ฒกํ„ฐ ๋„ท `addr`์— ๋Œ€ํ•œ ์ฃผ์„์œผ๋กœ, `addr1_bits`์™€ `addr2_bits`์˜ XOR (๋ฐฐํƒ€์  ๋…ผ๋ฆฌํ•ฉ) ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ `addr`์— ํ• ๋‹นํ•จ - ์„ธ ๋ฒˆ์งธ ์ค„์€ ์—ฐ๊ฒฐ$_{concatenation}$์„ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์— ๋Œ€ํ•œ ์ฃผ์„์ž„. `a`, `b`, `c_in`์„ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ `c_out`๊ณผ `sum`์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ• ๋‹นํ•จ
  • ์•”๋ฌต์  ์ง€์†์  ํ• ๋‹น
    • ๋„ท์ด ์„ ์–ธ๋  ๋•Œ ์ง€์†์ ์ธ ํ• ๋‹น์ด ๋„ท์— ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Œ
      • // ์ผ๋ฐ˜ ์ง€์†์  ํ• ๋‹น wire out; assign out = in1 & in2; // ์•”์‹œ์  ์ง€์†์  ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป์Œ wire out = in1 & in2;
      • ์ฒซ ๋ฒˆ์งธ ์„น์…˜: "์ผ๋ฐ˜ ์ง€์†์  ํ• ๋‹น"์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ, out์ด๋ผ๋Š” ์ด๋ฆ„์˜ wire(๋„ท)์„ ์„ ์–ธํ•˜๊ณ  ์ด wire์— in1๊ณผ in2์˜ AND ๋…ผ๋ฆฌ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ• ๋‹นํ•จ
      • ๋‘ ๋ฒˆ์งธ ์„น์…˜์€: "์•”์‹œ์  ์ง€์†์  ํ• ๋‹น"์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Œ. ์ด๋Š” in1๊ณผ in2์˜ AND ๋…ผ๋ฆฌ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ out์ด๋ผ๋Š” wire์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ์„น์…˜์˜ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋‚˜, ์ข€ ๋” ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ•œ ์ค„๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Œ
  • ์•”๋ฌต์  ๋„ท ์„ ์–ธ
    • ์ง€์†์ ์ธ ํ• ๋‹น ์™ผ์ชฝ์— ์‹ ํ˜ธ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋˜๋ฉด, ๊ทธ ์‹ ํ˜ธ ์ด๋ฆ„์— ๋Œ€ํ•ด ์•”๋ฌต์  ๋„ท ์„ ์–ธ์ด ์œ ์ถ”๋จ
      • // ์ง€์†์  ํ• ๋‹น. out์€ ๋„ท(net)์ž„ wire i1, i2; assign out = i1 & i2; // out์ด ์™€์ด์–ด(wire)๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜์Œ์— ์ฃผ์˜ // ๊ทธ๋Ÿฌ๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ์˜ํ•ด out์— ๋Œ€ํ•œ ์•”์‹œ์ ์ธ ์™€์ด์–ด ์„ ์–ธ์ด ์ˆ˜ํ–‰๋จ
      • ์ฒซ ๋ฒˆ์งธ ์ฃผ์„: out์ด ๋„ท(net)์ด๋ผ๊ณ  ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Œ
        • i1๊ณผ i2์— ๋Œ€ํ•ด wire ํƒ€์ž…์œผ๋กœ ์„ ์–ธ์ด ์ด๋ฃจ์–ด์กŒ์Œ
        • assign out = i1 & i2; ์ด ๋ถ€๋ถ„์€ out์ด๋ผ๋Š” ๋„ท(net)์— i1๊ณผ i2์˜ AND ๋…ผ๋ฆฌ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ• ๋‹นํ•˜๊ณ  ์žˆ์Œ
      • ๋‘ ๋ฒˆ์งธ ์ฃผ์„: out์ด ๋ช…์‹œ์ ์œผ๋กœ wire๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜์ง€๋งŒ, ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ out์— ๋Œ€ํ•ด ์•”์‹œ์ ์œผ๋กœ wire ์„ ์–ธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์žˆ์Œ
  • ๋ช…์‹œ์  ์„ ์–ธ์ด ๊ถŒ์žฅ๋จ
ย 

๊ฒŒ์ดํŠธ ๋”œ๋ ˆ์ด

  • ์ •๊ทœ ํ• ๋‹น ๋”œ๋ ˆ์ด๋Š” ์—ฐ์† ํ• ๋‹น ๊ตฌ๋ฌธ์—์„œ ๋”œ๋ ˆ์ด ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž„
    • ๋”œ๋ ˆ์ด ๊ฐ’์€ assign ํ‚ค์›Œ๋“œ ํ›„์— ์ง€์ •๋จ
      • assign #10 out = in1 & in2; // ์ง€์†์  ํ• ๋‹น์—์„œ์˜ ๋”œ๋ ˆ์ด
        - `assign` ๋ฌธ์€ Verilog์—์„œ ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ. - `assign` ํ‚ค์›Œ๋“œ ๋‹ค์Œ์˜ `#10`์€ ํ• ๋‹น์— 10์˜ ์‹œ๊ฐ„ ๋‹จ์œ„์˜ ๋”œ๋ ˆ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ๋Š” ์˜๋ฏธ - `out = in1 & in2;` ๋ถ€๋ถ„์€ `out`์ด๋ผ๋Š” ์ถœ๋ ฅ ๋˜๋Š” ๋„ท(net)์— `in1`๊ณผ `in2`์˜ AND ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๋ผ๋Š” ์˜๋ฏธ - ์ „์ฒด ์ฝ”๋“œ๋Š” `in1`๊ณผ `in2`์˜ AND ์—ฐ์‚ฐ ํ›„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ `out`์— ์ง€์†์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š”๋ฐ, ์ด ํ• ๋‹น์ด ์ผ์–ด๋‚˜๊ธฐ๊นŒ์ง€ 10์˜ ์‹œ๊ฐ„ ๋‹จ์œ„์˜ ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ„
  • ๊ด€์„ฑ ๋”œ๋ ˆ์ด
    • ํ• ๋‹น ๊ตฌ๋ฌธ์˜ ๋”œ๋ ˆ์ด๋ณด๋‹ค ์งง์€ ์ž…๋ ฅ ํŽ„์Šค๋Š” ์ถœ๋ ฅ์„ ์ „ํŒŒํ•˜์ง€ ์•Š์Œ (์˜ˆ: ๊ธ€๋ฆฌ์น˜/๋…ธ์ด์ฆˆ)
    • ๊ด€์„ฑ ๋”œ๋ ˆ์ด๋Š” ๋˜ํ•œ ๊ฒŒ์ดํŠธ ๋”œ๋ ˆ์ด์— ์ ์šฉ๋˜๋ฉฐ, 5์žฅ์—์„œ ๋…ผ์˜๋จ
      • notion image
  • ์•”๋ฌต์  ์ง€์† ํ• ๋‹น ๋”œ๋ ˆ์ด๋Š” ๋„ท์— ๋”œ๋ ˆ์ด์™€ ํ• ๋‹น์„ ๋ชจ๋‘ ์ง€์ •ํ•˜๋Š” ๊ฒƒ
    • // ์•”์‹œ์  ์ง€์†์  ํ• ๋‹น ๋”œ๋ ˆ์ด wire #10 out = in1 & in2; // ๋‹ค์Œ๊ณผ ๋™์ผํ•จ wire out; assign #10 out = in1 & in2;
      - `wire #10 out = in1 & in2;`: `out`์ด๋ผ๋Š” ๋„ท(net)์— `in1`๊ณผ `in2`์˜ AND ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ, ์ด ํ• ๋‹น์€ ์•”์‹œ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ณ  10์˜ ์‹œ๊ฐ„ ๋‹จ์œ„ ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„ - `assign #10 out = in1 & in2;`: `out`์— `in1`๊ณผ `in2`์˜ AND ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š”๋ฐ, ์ด ๋•Œ ํ• ๋‹น์ด ๋ฐœ์ƒํ•˜๊ธฐ๊นŒ์ง€ 10์˜ ์‹œ๊ฐ„ ๋‹จ์œ„ ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋ƒ„
  • ๋„ท ์„ ์–ธ ๋”œ๋ ˆ์ด๋Š” ๋„ท์— ์ง€์†์ ์ธ ํ• ๋‹น์„ ๋‘์ง€ ์•Š๊ณ  ๋„ท์— ๋Œ€ํ•ด ๋”œ๋ ˆ์ด๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ
    • //๋„ท(net) ๋”œ๋ ˆ์ด wire #10 out; assign out = in1 & in2; //์œ„ ๊ตฌ๋ฌธ์€ ์•„๋ž˜์™€ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๊ฐ€์ง wire out; assign #10 out = in1 & in2;
      - `wire out;` : `out`์ด๋ผ๋Š” wire๋ฅผ ์„ ์–ธํ•˜์ง€๋งŒ, ๋”œ๋ ˆ์ด๋Š” ์ด ์‹œ์ ์—์„œ ์ง€์ •ํ•˜์ง€ ์•Š์Œ - `assign #10 out = in1 & in2;` : ์—ฌ๊ธฐ์„œ๋Š” `assign` ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ๋”œ๋ ˆ์ด๋ฅผ ์ง€์ •ํ•จ. `#10`์€ `out`์— `in1`๊ณผ `in2`์˜ AND ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•  ๋•Œ 10 time unit์˜ ๋”œ๋ ˆ์ด๋ฅผ ์ ์šฉํ•จ์„ ์˜๋ฏธํ•จ
  • ์ •๊ทœ ํ• ๋‹น ๋”œ๋ ˆ์ด๊ฐ€ ๊ถŒ์žฅ๋จ
ย 

ํ‘œํ˜„์‹, ํ”ผ์—ฐ์‚ฐ์ž, ์—ฐ์‚ฐ์ž

  • ํ‘œํ˜„์‹์€ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์ž์™€ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
    • // ํ‘œํ˜„์‹์˜ ์˜ˆ a^b addr1[20:17] + addr2[20:17] in1 | in2
      1. `a^b` - ์ด ํ‘œํ˜„์‹์€ `a`์™€ `b`์˜ ๋น„ํŠธ ๋‹จ์œ„ XOR(๋ฐฐํƒ€์  OR) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•จ. XOR ์—ฐ์‚ฐ์€ ๋‘ ๋น„ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ 1์„, ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ 0์„ ๋ฐ˜ํ™˜ํ•จ. ๋”ฐ๋ผ์„œ `a`์™€ `b`์˜ ๊ฐ ๋น„ํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ XOR ์—ฐ์‚ฐ์ด ์ ์šฉ๋จ 2. `addr1[20:17] + addr2[20:17]` - ์ด ํ‘œํ˜„์‹์€ `addr1`๊ณผ `addr2`์˜ ํŠน์ • ๋น„ํŠธ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ง์…ˆ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•จ. `[20:17]`์€ 20๋ฒˆ ๋น„ํŠธ๋ถ€ํ„ฐ 17๋ฒˆ ๋น„ํŠธ๊นŒ์ง€๋ฅผ ์„ ํƒํ•จ์„ ์˜๋ฏธํ•จ. ๋”ฐ๋ผ์„œ, `addr1`์˜ 20๋ฒˆ ๋น„ํŠธ๋ถ€ํ„ฐ 17๋ฒˆ ๋น„ํŠธ๊นŒ์ง€์˜ ๋ถ€๋ถ„๊ณผ `addr2`์˜ 20๋ฒˆ ๋น„ํŠธ๋ถ€ํ„ฐ 17๋ฒˆ ๋น„ํŠธ๊นŒ์ง€์˜ ๋ถ€๋ถ„์ด ๋”ํ•ด์ง
  • ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ์ˆ˜, ์ •์ˆ˜, ๋„ท, ๋ ˆ์ง€์Šคํ„ฐ, ์‹œ๊ฐ„, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ
      • integer count, final_count; // count์™€ final_count๋ฅผ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•จ final_count = count + 1 // count๋Š” ์ •์ˆ˜ํ˜• ํ”ผ์—ฐ์‚ฐ์ž real a, b, c; c = a - b; // a์™€ b๋Š” ์‹ค์ˆ˜ํ˜• ํ”ผ์—ฐ์‚ฐ์ž reg [15:0] reg1, reg2; reg [3:0] reg_out; reg_out = reg1[3:0] ^ reg2[3:0]; // reg1[3:0]๊ณผ reg2[3:0]์€ ๋ถ€๋ถ„ ์„ ํƒ ๋ ˆ์ง€์Šคํ„ฐ ํ”ผ์—ฐ์‚ฐ์ž reg ret_value; ret_value = calculate_parity (A, B); // calculate_parity๋Š” ํ•จ์ˆ˜ ํƒ€์ž…์˜ ํ”ผ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.
  • ์—ฐ์‚ฐ์ž๋Š” ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ”ผ์—ฐ์‚ฐ์ž์— ์ž‘์šฉํ•จ
ย 

์—ฐ์‚ฐ์ž ์œ ํ˜•

  • Verilog๋Š” ๋งŽ์€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•จ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฐ์ˆ , ๋…ผ๋ฆฌ, ๊ด€๊ณ„, ๋™๋“ฑ, ๋น„ํŠธ๋ณ„, ์ถ•์†Œ, ์‹œํ”„ํŠธ, ์—ฐ๊ฒฐ, ๋˜๋Š” ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž (C์™€ ์œ ์‚ฌํ•œ ์ผ๋ถ€)
      • notion image
ย 

์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

  • ์ดํ•ญ ์—ฐ์‚ฐ์ž (ํ”ผ์—ฐ์‚ฐ์ž ๋‘ ๊ฐœ)
    • ๊ณฑํ•˜๊ธฐ (*), ๋‚˜๋ˆ„๊ธฐ (/), ๋”ํ•˜๊ธฐ (+), ๋นผ๊ธฐ (-), ์ œ๊ณฑ (**), ๋ฐ ๋‚˜๋จธ์ง€ (%)
      • A = 4'b0011; B = 4'b0100; // A์™€ B๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๋ฒกํ„ฐ D = 6; E = 4; F = 2 // D์™€ E๋Š” ์ •์ˆ˜ A * B // A์™€ B๋ฅผ ๊ณฑํ•จ. ๊ฒฐ๊ณผ๋Š” 4'b1100 D / E // D๋ฅผ E๋กœ ๋‚˜๋ˆ”. ๊ฒฐ๊ณผ๋Š” 1์ž…๋‹ˆ๋‹ค. ์†Œ์ˆ˜ ๋ถ€๋ถ„์€ ๋ฒ„๋ฆผ A + B // A์™€ B๋ฅผ ๋”ํ•จ. ๊ฒฐ๊ณผ๋Š” 4'b0111 B - A // B์—์„œ A๋ฅผ ๋บŒ. ๊ฒฐ๊ณผ๋Š” 4'b0001 F = E**F; // E์˜ F ์ œ๊ณฑ์ž„. ๊ฒฐ๊ณผ๋Š” 16
    • ํ”ผ์—ฐ์‚ฐ์ž ๋น„ํŠธ ์ค‘ ์–ด๋–ค ๊ฐ’์ด x์ด๋ฉด, ์ „์ฒด ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋Š” x์ž„
      • in1 = 4'b101x; in2 = 4'b1010; sum = in1 + in2; // sum์€ 4'bx ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋  ๊ฒƒ์ž„
    • ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž๋Š” ๋‘ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ƒ์„ฑํ•จ
      • 13 % 3 // 1๋กœ ํ‰๊ฐ€๋จ 16 % 4 // 0์œผ๋กœ ํ‰๊ฐ€๋จ -7 % 2 // -1๋กœ ํ‰๊ฐ€๋จ. ์ฒซ ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๋ถ€ํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ด 7 % -2 // +1๋กœ ํ‰๊ฐ€๋จ. ์ฒซ ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๋ถ€ํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ด
        ย 
  • ๋‹จํ•ญ ์—ฐ์‚ฐ์ž (ํ”ผ์—ฐ์‚ฐ์ž ํ•˜๋‚˜)
    • + ๋ฐ - ์—ฐ์‚ฐ์ž๋„ ๋‹จํ•ญ์—ฐ์‚ฐ์ž๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ณ  ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง
      • -4 // ์Œ์ˆ˜ 4 +5 // ์–‘์ˆ˜ 5
    • ์ •์ˆ˜ ๋˜๋Š” ์‹ค์ˆ˜ ์œ ํ˜•์—๋งŒ ์Œ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
    • ๋””์ž์ด๋„ˆ๋“ค์€ <sss>โ€™<base><nnn> ์œ ํ˜•์˜ ์Œ์ˆ˜๋ฅผ ํ”ผํ•ด์•ผ ํ•จ. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ๋ถ€ํ˜ธ ์—†๋Š” 2์˜ ๋ณด์ˆ˜ ์ˆ˜๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์ž„
      • // ์ •์ˆ˜ ๋˜๋Š” ์‹ค์ˆ˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅ -10 / 5 // -2๋กœ ํ‰๊ฐ€๋จ // <sss>'โ€นbase>โ€นnnn> ํƒ€์ž…์˜ ์ˆซ์ž ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ -'10 / 5 // (2์˜ ๋ณด์ˆ˜ 10) / 5์™€ ๋™์ผํ•จ. ์ฆ‰, (2^32 - 10)/5 // 4294967286/5 = 858993457 // ์—ฌ๊ธฐ์„œ 32๋Š” ๊ธฐ๋ณธ ๋จธ์‹  ์›Œ๋“œ ํญ์ž„ // ์ด๋Š” ๋ถ€์ •ํ™•ํ•˜๊ณ  ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๋กœ ํ‰๊ฐ€๋จ
    • ์Œ์ˆ˜์— ๋Œ€ํ•ด signed ๋ ˆ์ง€์Šคํ„ฐ๋‚˜ ๋„ท (์˜ˆ, reg/wire signed)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
ย 

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž

  • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ๋…ผ๋ฆฌ AND (&&), OR (||), NOT (!)์ž„
    • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ํ•ญ์ƒ 1๋น„ํŠธ ๊ฐ’, 0(๊ฑฐ์ง“), 1(์ฐธ), ๋˜๋Š” x(๋ชจํ˜ธํ•œ ์ƒํƒœ)๋กœ ํ‰๊ฐ€๋จ
    • ํ”ผ์—ฐ์‚ฐ์ž ๋น„ํŠธ ์ค‘ ์–ด๋Š ๊ฒƒ์ด x ๋˜๋Š” z์ด๋ฉด x (๋ชจํ˜ธํ•œ ์กฐ๊ฑด)๊ณผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ์ง“์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
    • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ๋ณ€์ˆ˜ ๋˜๋Š” ํ‘œํ˜„์‹์„ ํ”ผ์—ฐ์‚ฐ์ž๋กœ ์ทจํ•จ
      • // ๋…ผ๋ฆฌ ์—ฐ์‚ฐ A = 3; B = 0; A & B // 0์œผ๋กœ ํ‰๊ฐ€๋จ. (logical-1 && logical-0)์™€ ๋™์ผํ•จ A | B // 1๋กœ ํ‰๊ฐ€๋จ. (logical-1 || logical-0)์™€ ๋™์ผํ•จ !A // 0์œผ๋กœ ํ‰๊ฐ€๋จ. (logical-1์˜ NOT)๊ณผ ๋™์ผํ•จ !B // 1๋กœ ํ‰๊ฐ€๋จ. (logical-0์˜ NOT)๊ณผ ๋™์ผํ•จ // ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’ A = 2'b0x; B = 2'b10; A & B // x๋กœ ํ‰๊ฐ€๋จ. (x && logical-1)๊ณผ ๋™์ผํ•จ // ํ‘œํ˜„์‹ (a == 2) && (b == 3) // a == 2 ์™€ b == 3 ์ด ๋ชจ๋‘ ์ฐธ์ธ ๊ฒฝ์šฐ 1๋กœ ํ‰๊ฐ€๋จ // ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ์ง“์ด๋ฉด 0์œผ๋กœ ํ‰๊ฐ€๋จ
    • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์„ ๊ทธ๋ฃนํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœ๋จ
ย 

๊ด€๊ณ„ ์—ฐ์‚ฐ์ž

๊ด€๊ณ„ ์—ฐ์‚ฐ์ž๋Š” ํฐ (>), ์ž‘์€ (<), ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ (>=), ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ (<=`)์ž„
  • ํ”ผ์—ฐ์‚ฐ์ž์— ์•Œ๋ ค์ง€์ง€ ์•Š์€ (์ฆ‰, x) ๋น„ํŠธ ๋˜๋Š” z ๋น„ํŠธ๊ฐ€ ์žˆ์œผ๋ฉด, ํ‘œํ˜„์‹์€ x ๊ฐ’์„ ๊ฐ€์ง
  • ์ด ์—ฐ์‚ฐ์ž๋“ค์€ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ์˜ ํ•ด๋‹น ์—ฐ์‚ฐ์ž์™€ ์™„์ „ํžˆ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•จ
    • // A = 4, B = 3 // Y = 4'b1010, X = 4'b1101, Z = 4'b1xxx A < B // ๋…ผ๋ฆฌ์ ์œผ๋กœ 0์œผ๋กœ ํ‰๊ฐ€๋จ A > B // ๋…ผ๋ฆฌ์ ์œผ๋กœ 1์œผ๋กœ ํ‰๊ฐ€๋จ Y > X // ๋…ผ๋ฆฌ์ ์œผ๋กœ 1๋กœ ํ‰๊ฐ€๋จ Y < Z // x๋กœ ํ‰๊ฐ€๋จ
    • Y < Z์—์„œ Z๋Š” 'x'๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ๋Š” 'x'๋กœ ํ‰๊ฐ€๋˜๋ฉฐ ์ด๋Š” ๊ฐ’์ด ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•จ

๋™๋“ฑ ์—ฐ์‚ฐ์ž

  • ๋™๋“ฑ ์—ฐ์‚ฐ์ž๋Š” ๋…ผ๋ฆฌ์  ๋™๋“ฑ (==), ๋ถ€๋“ฑ (!=), ์ผ€์ด์Šค ๋™๋“ฑ (===), ์ผ€์ด์Šค ๋ถ€๋“ฑ (!==)์ž„
    • ์ผ€์ด์Šค ๋™๋“ฑ ์—ฐ์‚ฐ์ž (===, !==)๋Š” ๋น„ํŠธ ๋‹จ์œ„๋กœ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋น„๊ตํ•˜๊ณ  x์™€ z๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋น„๊ตํ•จ (์ฆ‰, x ๊ฒฐ๊ณผ๋Š” ๋‚˜์˜ค์ง€ ์•Š์Œ)
      • notion image
        // A = 4, B = 3 // X = 4'b1010, Y = 4'b1101 // Z = 4'b1xxz, M = 4'b1xxz, N = 4'b1xxx A == B // ๋…ผ๋ฆฌ์  0์„ ๊ฒฐ๊ณผ๋กœ ํ•จ X != Y // ๋…ผ๋ฆฌ์  1์„ ๊ฒฐ๊ณผ๋กœ ํ•จ X == Z // x๋ฅผ ๊ฒฐ๊ณผ๋กœ ํ•จ Z == M // ๋…ผ๋ฆฌ์  1์„ ๊ฒฐ๊ณผ๋กœ ํ•จ (๋ชจ๋“  ๋น„ํŠธ๊ฐ€ ์ผ์น˜, x์™€ z ํฌํ•จ) Z == N // ๋…ผ๋ฆฌ์  0์„ ๊ฒฐ๊ณผ๋กœ ํ•จ (๊ฐ€์žฅ ๋‚ฎ์€ ์œ ํšจ ๋น„ํŠธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ) M !== N // ๋…ผ๋ฆฌ์  1์„ ๊ฒฐ๊ณผ๋กœ ํ•จ
ย 

๋น„ํŠธ ์—ฐ์‚ฐ์ž

  • ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋Š” ๋ถ€์ • (~), AND (&), OR (|), XOR (^), XNOR (^~, ~^)์ž„
    • ํ•œ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋‹ค๋ฅธ ํ”ผ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์งง์œผ๋ฉด ๊ธธ์ด๊ฐ€ ๊ธด ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ธธ์ด์— ๋งž์ถ”์–ด 0์œผ๋กœ ๋น„ํŠธ ํ™•์žฅ๋จ (์˜ˆ: 4'b1111 & 2'b11 โ†’ 4'b0011)
      • notion image
        // X = 4'b1010, Y = 4'b1101 // Z = 4'b10x1 ~X // ๋น„ํŠธ ๋‹จ์œ„ NOT ์—ฐ์‚ฐ. ๊ฒฐ๊ณผ๋Š” 4'b0101 X & Y // ๋น„ํŠธ ๋‹จ์œ„ AND ์—ฐ์‚ฐ. ๊ฒฐ๊ณผ๋Š” 4'b1000 X | Y // ๋น„ํŠธ ๋‹จ์œ„ OR ์—ฐ์‚ฐ. ๊ฒฐ๊ณผ๋Š” 4'b1111 X ^ Y // ๋น„ํŠธ ๋‹จ์œ„ XOR ์—ฐ์‚ฐ. ๊ฒฐ๊ณผ๋Š” 4'b0111 X ^~ Y // ๋น„ํŠธ ๋‹จ์œ„ XNOR ์—ฐ์‚ฐ. ๊ฒฐ๊ณผ๋Š” 4'b1000 X & Z // ๊ฒฐ๊ณผ๋Š” 4'b10x0
      • X & Z: X์™€ Z์˜ ๋น„ํŠธ ๋‹จ์œ„ AND ์—ฐ์‚ฐ. ํ•˜์ง€๋งŒ, Z์˜ ๋น„ํŠธ ์ค‘์—๋Š” 'x'(์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’)๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์œ„์น˜์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ์—ญ์‹œ 'x'๊ฐ€ ๋จ. ๋”ฐ๋ผ์„œ 1010 AND 10x1์€ 10x0์„ ๊ฒฐ๊ณผ๋กœ ํ•จ
    • ๋น„ํŠธ ์—ฐ์‚ฐ์ž ~, &, |์„ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž !, &&, ||์™€ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ
      • // X = 4'b1010, Y = 4'b0000 X | Y // ๋น„ํŠธ ๋‹จ์œ„ ์—ฐ์‚ฐ. ๊ฒฐ๊ณผ๋Š” 4'b1010 X || Y // ๋…ผ๋ฆฌ ์—ฐ์‚ฐ. 1 || 0๊ณผ ๋™๋“ฑํ•จ. ๊ฒฐ๊ณผ๋Š” 1.
ย 

๊ฐ์†Œ & ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์ž

  • ๊ฐ์†Œ ์—ฐ์‚ฐ์ž๋Š” AND (&), NAND (~&), OR (|), NOR (~|), XOR (^), XNOR (~^, ^~)์ž„
    • ๊ฐ์†Œ ์—ฐ์‚ฐ์ž๋Š” ๋‹จ์ผ ํ”ผ์—ฐ์‚ฐ์ž๋งŒ ์ทจํ•˜๊ณ , ๋‹จ์ผ ๋ฒกํ„ฐ ํ”ผ์—ฐ์‚ฐ์ž์— ๋น„ํŠธ ๋‹จ์œ„ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ 1๋น„ํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•จ
      • // X = 4'b1010 &X // 1 & 0 & 1 & 0์— ํ•ด๋‹นํ•จ. ๊ฒฐ๊ณผ๋Š” 1'b0 |X // 1 | 0 | 1 | 0์— ํ•ด๋‹นํ•จ. ๊ฒฐ๊ณผ๋Š” 1'b1 ^X // 1 ^ 0 ^ 1 ^ 0์— ํ•ด๋‹นํ•จ. ๊ฒฐ๊ณผ๋Š” 1'b0 // ๊ฐ์†Œ xor ๋˜๋Š” xnor๋Š” ๋ฒกํ„ฐ์˜ ์ง์ˆ˜ ๋˜๋Š” ํ™€์ˆ˜ ํŒจ๋ฆฌํ‹ฐ ์ƒ์„ฑ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
        - `&X`: ๋ชจ๋“  ๋น„ํŠธ์— ๋Œ€ํ•ด ๋น„ํŠธ ๋‹จ์œ„ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•จ. `1010`์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ ๋น„ํŠธ์— AND ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋ฉด, `1 & 0 & 1 & 0`์ด๋ฏ€๋กœ, ๊ฒฐ๊ณผ๋Š” `0`์ด ๋จ - `|X`: ๋ชจ๋“  ๋น„ํŠธ์— ๋Œ€ํ•ด ๋น„ํŠธ ๋‹จ์œ„ OR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•จ. `1010`์˜ ๊ฐ ๋น„ํŠธ์— OR ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋ฉด, `1 | 0 | 1 | 0`์ด๋ฏ€๋กœ, ๊ฒฐ๊ณผ๋Š” `1`์ด ๋จ - `^X`: ๋ชจ๋“  ๋น„ํŠธ์— ๋Œ€ํ•ด ๋น„ํŠธ ๋‹จ์œ„ XOR (๋ฐฐํƒ€์  OR) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•จ. `1010`์˜ ๊ฐ ๋น„ํŠธ์— XOR ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋ฉด, `1 ^ 0 ^ 1 ^ 0`์ด๋ฏ€๋กœ, ๊ฒฐ๊ณผ๋Š” `0`์ด ๋จ
  • ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์ž๋Š” ์˜ค๋ฅธ์ชฝ ์‰ฌํ”„ํŠธ (>>), ์™ผ์ชฝ ์‰ฌํ”„ํŠธ (<<), ์‚ฐ์ˆ  ์˜ค๋ฅธ์ชฝ ์‰ฌํ”„ํŠธ (>>>), ์‚ฐ์ˆ  ์™ผ์ชฝ ์‰ฌํ”„ํŠธ (<<<)์ž„
    • ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์€ ์›ํ˜•์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์Œ
      • // X = 4'b1100 Y = X >> 1; // Y๋Š” 4'b0110์ž„. ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1๋น„ํŠธ ์ด๋™ํ•จ. MSB ์œ„์น˜์—๋Š” 0์ด ์ฑ„์›Œ์ง Y = X << 1; // Y๋Š” 4'b1000์ž„. ์™ผ์ชฝ์œผ๋กœ 1๋น„ํŠธ ์ด๋™ํ•จ. LSB ์œ„์น˜์—๋Š” 0์ด ์ฑ„์›Œ์ง Y = X << 2; // Y๋Š” 4'b0000์ž„. ์™ผ์ชฝ์œผ๋กœ 2๋น„ํŠธ ์ด๋™ํ•จ integer a, b, c; // signed ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž„ a = 0; // 111โ€ฆ..1110110 (-10) >>> 3 b = -10; // 11111...10110 ์ด์ง„์ˆ˜์ž„ c = a + b >>> 3; // ์‚ฐ์ˆ  shift๋กœ ์ธํ•ด ๊ฒฐ๊ณผ๋Š” -2(10์ง„์ˆ˜)์ž„
        - ์ฒซ ์„ธ ์ค„์€ `X`์˜ ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ ๋ฐ ์™ผ์ชฝ์œผ๋กœ ๋น„ํŠธ ์ด๋™ํ•˜๋Š” ์—ฐ์‚ฐ์— ๊ด€ํ•œ ๊ฒƒ์ž„. ์ด๋•Œ `MSB$_{Most \space Significant \space Bit}$`์™€ `LSB$_{Least \space Significant \space Bit}$` ์œ„์น˜์— ๊ฐ๊ฐ ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Œ. ์ฆ‰, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ๋ฅผ ์ด๋™ํ•˜๋ฉด MSB์— 0์ด ๋“ค์–ด๊ฐ€๊ณ , ์™ผ์ชฝ์œผ๋กœ ๋น„ํŠธ๋ฅผ ์ด๋™ํ•˜๋ฉด LSB์— 0์ด ๋“ค์–ด๊ฐ - ๊ทธ ํ›„์˜ ์ค„๋“ค์€ signed integer ๋ณ€์ˆ˜ `a`, `b`, `c`์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ๋ณด์—ฌ์คŒ. `a`๋Š” 0์˜ ๊ฐ’์„ ๊ฐ–๊ณ , `b`๋Š” -10์˜ ๊ฐ’์„ ๊ฐ€์ง. ์—ฌ๊ธฐ์„œ `10`์€ 2์˜ ๋ณด์ˆ˜ ํ˜•ํƒœ๋กœ 11111...10110์œผ๋กœ ํ‘œํ˜„๋จ (์ ์„ ์€ ๋ฌดํ•œํžˆ ๋งŽ์€ 1๋“ค์„ ์˜๋ฏธํ•จ) - ๋งˆ์ง€๋ง‰ ์ค„์€ `c = a + b >>> 3` ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ฒƒ์œผ๋กœ, `a + b`์˜ ํ•ฉ(-10)์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 3๋น„ํŠธ ์‚ฐ์ˆ  ์ด๋™ ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฐ์ˆ  ์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ๋Š” MSB(๋ถ€ํ˜ธ ๋น„ํŠธ)๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ’์„ 2์˜ n ์ œ๊ณฑ์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 3๋น„ํŠธ๋ฅผ ์ด๋™ํ•˜๋ฏ€๋กœ, -10์„ 2์˜ 3์ œ๊ณฑ์ธ 8๋กœ ๋‚˜๋ˆˆ ๊ฐ’(-1.25)์„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ˆ˜๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ `2`๊ฐ€ ๋จ
ย 

์—ฐ๊ฒฐ & ๋ณต์ œ ์—ฐ์‚ฐ์ž

  • ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž ({, })๋Š” ์—ฌ๋Ÿฌ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์ด์–ด๋ถ™์ด๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•จ
    • ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์–ด์•ผ ํ•จ
      • // A = 1'b1, B = 2'b00, C = 2'b10, D = 3'b110 Y = {B, C} // ๊ฒฐ๊ณผ Y๋Š” 4'b0010 Y = {A, B, C, D, 3'b001} // ๊ฒฐ๊ณผ Y๋Š” 11'b10010110001 Y = {A, B[0], C[1]} // ๊ฒฐ๊ณผ Y๋Š” 3'b101
        1. `Y = {B, C}` : `B`์™€ `C`๋ฅผ ์—ฐ๊ฒฐ$_{concatenate}$ํ•จ. `B`๋Š” `00`์ด๊ณ , `C`๋Š” `10`์ด๋ฏ€๋กœ, ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด `0010`์ด ๋จ. ๋”ฐ๋ผ์„œ, `Y`๋Š” `4'b0010`์ด ๋จ 2. `Y = {A, B, C, D, 3'b001}` : `A`, `B`, `C`, `D`, ๊ทธ๋ฆฌ๊ณ  `3'b001`์„ ์—ฐ๊ฒฐํ•จ. ๊ฐ๊ฐ `1`, `00`, `10`, `110`, `001`์ด๋ฏ€๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด `10010110001`์ด ๋จ. ๋”ฐ๋ผ์„œ, `Y`๋Š” `11'b10010110001`์ด ๋จ 3. `Y = {A, B[0], C[1]}` : `A`, `B`์˜ 0๋ฒˆ์งธ ๋น„ํŠธ, ๊ทธ๋ฆฌ๊ณ  `C`์˜ 1๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•จ. `A`๋Š” `1`, `B[0]`๋Š” `0`, `C[1]`์€ `1`์ด๋ฏ€๋กœ ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด `101`์ด ๋จ. ๋”ฐ๋ผ์„œ, `Y`๋Š” `3'b101`์ด ๋จ - ์—ฌ๊ธฐ์„œ `{ , }` ๊ตฌ์กฐ๋Š” Verilog์—์„œ ๋น„ํŠธ๋ฅผ ์—ฐ๊ฒฐ$_{concatenation}$ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž„. ์ด ์—ฐ์‚ฐ์ž๋Š” ๋‚ด๋ถ€์˜ ํ‘œํ˜„๋“ค์„ ๋ชจ๋‘ ์ขŒ์ธก์—์„œ ์šฐ์ธก ์ˆœ์„œ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋น„ํŠธ ๋ฒกํ„ฐ๋กœ ๋งŒ๋“ฌ
  • ๋™์ผํ•œ ๋ฒˆํ˜ธ์˜ ๋ฐ˜๋ณต์ ์ธ ์—ฐ๊ฒฐ์€ ๋ณต์ œ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
    • reg A; reg [1:0] B, C; reg [2:0] D; A = 1'b1; B = 2'b00; C = 2'b10; D = 3'b110; Y = { 4{A} } // ๊ฒฐ๊ณผ Y๋Š” 4'b1111 Y = { 4{A}, 2{B} } // ๊ฒฐ๊ณผ Y๋Š” 8'b11110000 Y = { 4{A}, 2{B}, C} // ๊ฒฐ๊ณผ Y๋Š” 10'b1111000010
      1. `Y = { 4{A} }` : `A`์˜ ๊ฐ’์„ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์—ฐ๊ฒฐํ•จ/ `A`๋Š” `1'b1`์ด๋ฏ€๋กœ, ์ด๋ฅผ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด `1111`์ด ๋จ. ๋”ฐ๋ผ์„œ, `Y`๋Š” `4'b1111`์ด ๋จ 2. `Y = { 4{A}, 2{B} }` : `A`์˜ ๊ฐ’์„ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ณ , `B`์˜ ๊ฐ’์„ 2๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์—ฐ๊ฒฐํ•จ. `A`๋Š” `1'b1`์ด๊ณ  `B`๋Š” `2'b00`์ด๋ฏ€๋กœ, `1111`๊ณผ `0000`์„ ์—ฐ๊ฒฐํ•˜๋ฉด `11110000`์ด ๋จ. ๋”ฐ๋ผ์„œ, `Y`๋Š” `8'b11110000`์ด ๋จ 3. `Y = { 4{A}, 2{B}, C}` : `A`์˜ ๊ฐ’์„ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ณ , `B`์˜ ๊ฐ’์„ 2๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ณ , `C`๋ฅผ ์—ฐ๊ฒฐํ•จ. `A`๋Š” `1'b1`, `B`๋Š” `2'b00`, `C`๋Š” `2'b10`์ด๋ฏ€๋กœ, `1111`, `0000`, `10`์„ ์—ฐ๊ฒฐํ•˜๋ฉด `1111000010`์ด ๋จ. ๋”ฐ๋ผ์„œ, `Y`๋Š” `10'b1111000010`์ด ๋จ - ์—ฌ๊ธฐ์„œ `{n{A}}` ๊ตฌ์กฐ๋Š” Verilog์—์„œ A ๊ฐ’์„ n๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ์ž„. `{}`๋Š” ์—ฐ๊ฒฐ$_{concatenation}$ ์—ฐ์‚ฐ์ž๋กœ, `{m{A}, n{B}, C}`์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด A๋ฅผ m๋ฒˆ, B๋ฅผ n๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ณ , ๋์— C๋ฅผ ์—ฐ๊ฒฐํ•จ

์กฐ๊ฑด ์—ฐ์‚ฐ์ž

  • ์กฐ๊ฑด ์—ฐ์‚ฐ์ž (?:)๋Š” ์„ธ ๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์ทจํ•จ
    • ๋™์ž‘์€ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์™€ ์œ ์‚ฌํ•จ
    • notion image
      // 3์ƒํƒœ ๋ฒ„ํผ์˜ ๊ธฐ๋Šฅ ๋ชจ๋ธ๋ง assign addr_bus = drive_enable ? addr_out : 36'bz; // 2๋Œ€1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์˜ ๊ธฐ๋Šฅ ๋ชจ๋ธ๋ง assign out = control ? in1 : in0;
      1. `assign addr_bus = drive_enable ? addr_out : 36'bz;` - `drive_enable`๊ฐ€ ์ฐธ(1)์ธ ๊ฒฝ์šฐ, `addr_bus`์— `addr_out` ๊ฐ’์„ ํ• ๋‹นํ•จ - `drive_enable`๊ฐ€ ๊ฑฐ์ง“(0)์ธ ๊ฒฝ์šฐ, `addr_bus`๋Š” `36'bz` (36๋น„ํŠธ์˜ ๊ณ ๋ฆฝ ์ƒํƒœ)๋ฅผ ๊ฐ€์ง. `z`๋Š” ๊ณ ๋ฆฝ ์ƒํƒœ๋กœ, ๋ฒ„์Šค์—์„œ ์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ - ์ด๋Š” 3์ƒํƒœ ๋ฒ„ํผ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๋ชจ๋ธ๋งํ•œ ๊ฒƒ์œผ๋กœ, `drive_enable` ์‹ ํ˜ธ์— ๋”ฐ๋ผ ๋ฒ„์Šค์— ์‹ ํ˜ธ๋ฅผ ์ฃผ๊ฑฐ๋‚˜(high, low), ๋ฒ„์Šค๋ฅผ ๊ณ ๋ฆฝ ์ƒํƒœ(z)๋กœ ๋งŒ๋“ฌ 2. `assign out = control ? in1 : in0;` - `control`์ด ์ฐธ(1)์ธ ๊ฒฝ์šฐ, `out`์— `in1` ๊ฐ’์„ ํ• ๋‹นํ•จ - `control`์ด ๊ฑฐ์ง“(0)์ธ ๊ฒฝ์šฐ, `out`์— `in0` ๊ฐ’์„ ํ• ๋‹นํ•จ - ์ด๋Š” 2:1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๋ชจ๋ธ๋งํ•œ ๊ฒƒ์œผ๋กœ, `control` ์‹ ํ˜ธ์— ๋”ฐ๋ผ `out`์ด `in1` ๋˜๋Š” `in0`์˜ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ•จ - ์ด ๋‘ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์€ ๊ฐ๊ฐ 3์ƒํƒœ ๋ฒ„ํผ์™€ 2:1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์„ Verilog๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•œ ๊ฒƒ์ž„. Verilog์—์„œ๋Š” ์‚ผํ•ญ ์—ฐ์‚ฐ์ž(`?:`)๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด์ ์ธ ๋กœ์ง์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
  • ์กฐ๊ฑด ์—ฐ์‚ฐ์€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Œ
    • assign out = (A == 3) ? ( control ? x: y): ( control ? m : n);
      - out์— ํ• ๋‹นํ•˜๋Š” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •๋จ - ๋งŒ์•ฝ A๊ฐ€ 3๊ณผ ๊ฐ™๋‹ค๋ฉด - ๋งŒ์•ฝ control์ด ์ฐธ์ด๋ฉด out์€ x์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  - ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด out์€ y์˜ ๊ฐ’์„ ๊ฐ€์ง - ๋งŒ์•ฝ A๊ฐ€ 3์ด ์•„๋‹ˆ๋ผ๋ฉด - ๋งŒ์•ฝ control์ด ์ฐธ์ด๋ฉด out์€ m์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  - ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด out์€ n์˜ ๊ฐ’์„ ๊ฐ€์ง
ย 

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„

  • Verilog๋Š” ํ‘œํ˜„์‹์˜ ๋ถ€๋ถ„์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๊ด„ํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ž์ฒด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจํ˜ธํ•จ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
      • notion image
ย 

4-to-1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ

  • ๋…ผ๋ฆฌ ๋ฐฉ์ •์‹
    • // ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•œ 4-to-1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ ๋ชจ๋“ˆ. ๋…ผ๋ฆฌ ๋ฐฉ์ •์‹ // ๊ฒŒ์ดํŠธ ๋ ˆ๋ฒจ ๋ชจ๋ธ๊ณผ ๋น„๊ต module mux4_to_1 (out, i0, il, i2, i3, s1, s0); // I/0 ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ํฌํŠธ ์„ ์–ธ output out; input i0, il, i2, i3; input s1, s0; // out์„ ์œ„ํ•œ ๋…ผ๋ฆฌ ๋ฐฉ์ •์‹ assign out = (~s1 & ~s0 & i0) | (~s1 & s0 & i1) | (s1 & ~s0 & i2) | (s1 & s0 & i3); endmodule
      notion image
  • ์กฐ๊ฑด ์—ฐ์‚ฐ์ž
    • // ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•œ 4-to-1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ ๋ชจ๋“ˆ. ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ // ๊ฒŒ์ดํŠธ ๋ ˆ๋ฒจ ๋ชจ๋ธ๊ณผ ๋น„๊ต module multiplexer4_to_1 (out, i0, i1, i2, i3, s1, s0); // I/O ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ํฌํŠธ ์„ ์–ธ output out; input io, il, i2, i3; input s1, s0; // ์ค‘์ฒฉ๋œ ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ assign out = s1 ? (s0 ? i3 : i2) : (s0 ? i1 : i0); endmodule
      - ์ด ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ์™€ ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 4-to-1 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์˜ Verilog ๋ชจ๋“ˆ์„ ์ •์˜ํ•จ - ์ด ๋ชจ๋“ˆ์€ ๊ฒŒ์ดํŠธ ๋ ˆ๋ฒจ ๋ชจ๋ธ๊ณผ ๋น„๊ต๋  ์ˆ˜ ์žˆ์Œ (์ฆ‰, ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ชจ๋“ˆ์„ ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋ ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Œ) - ํฌํŠธ ์„ ์–ธ ๋ถ€๋ถ„์—์„œ๋Š” ๋ชจ๋“ˆ์˜ ์ž…์ถœ๋ ฅ์„ ์ •์˜ํ•จ - `assign` ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ `out` ์‹ ํ˜ธ๋ฅผ ๊ณ„์‚ฐํ•จ. ์—ฌ๊ธฐ์„œ๋Š” ์ค‘์ฒฉ๋œ ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž(์‚ผํ•ญ ์—ฐ์‚ฐ์ž)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ - `s1`๊ณผ `s0`์˜ ๊ฐ’์— ๋”ฐ๋ผ `i0`, `i1i2i3` ์ค‘ ํ•˜๋‚˜์˜ ์ž…๋ ฅ์ด `out`์œผ๋กœ ์„ ํƒ๋˜๋ฉฐ, ์ด ๋กœ์ง์€ ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„๋˜์—ˆ์Œ
      notion image
ย 
ย 

4๋น„ํŠธ ํ’€ ์• ๋”

  • ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ ์—ฐ์‚ฐ์ž
    • // ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ 4๋น„ํŠธ ํ’€ ์• ๋”๋ฅผ ์ •์˜ํ•จ module fulladd4 (sum, c_out, a, b, c_in); // I/O ํฌํŠธ ์„ ์–ธ output [3:0] sum; output c_out; input[3:0] a, b; input c_in; // ์ „์ฒด ๋ง์…ˆ๊ธฐ์˜ ๊ธฐ๋Šฅ์„ ์ง€์ •ํ•จ assign {c_out, sum} =a + b + c_in; endmodule
      notion image
ย 

๋ฆฌํ”Œ ์นด์šดํ„ฐ

  • 4๋น„ํŠธ ๋ฆฌํ”Œ ์นด์šดํ„ฐ
    • notion image
      // ๋ฆฌํ”Œ ์นด์šดํ„ฐ module counter (Q, clock, clear); // ์ž…/์ถœ๋ ฅ ํฌํŠธ output [3:0] Q; input clock, clear; // T ํ”Œ๋ฆฝํ”Œ๋กญ ์ธ์Šคํ„ด์Šคํ™” T_FF tff0 (Q[0], clock, clear); T_FF tff1 (Q[1], Q[0], clear); T_FF tff2 (Q[2], Q[1], clear); T_FF tff3 (Q[3], Q[2], clear); endmodule
      - ๋ฆฌํ”Œ ์นด์šดํ„ฐ ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ ๋ธ”๋ก์€ ๋ฆฌํ”Œ ์นด์šดํ„ฐ๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ •์˜ํ•จ. ์ด ๋ชจ๋“ˆ์€ 3๊ฐœ์˜ ์ž…๋ ฅ ํฌํŠธ (`Q`, `clock`, `clear`)์™€ ํ•˜๋‚˜์˜ 4๋น„ํŠธ ์ถœ๋ ฅ ํฌํŠธ `Q`๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ - T ํ”Œ๋ฆฝํ”Œ๋กญ ์ธ์Šคํ„ด์Šคํ™” ๋‹ค์Œ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ๋Š” T ํ”Œ๋ฆฝํ”Œ๋กญ๋“ค์ด ์ธ์Šคํ„ด์Šคํ™”๋˜๊ณ  ์žˆ์Œ. ๊ฐ๊ฐ์˜ ํ”Œ๋ฆฝํ”Œ๋กญ์€ ์ถœ๋ ฅ `Q`์˜ ํŠน์ • ๋น„ํŠธ, ๊ทธ๋ฆฌ๊ณ  ์ด์ „ ํ”Œ๋ฆฝํ”Œ๋กญ์˜ ์ถœ๋ ฅ ๋˜๋Š” `clock` ๋ฐ `clear` ์‹ ํ˜ธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•จ. ์˜ˆ๋ฅผ ๋“ค์–ด, `tff0` ์ธ์Šคํ„ด์Šค๋Š” `clock`๊ณผ `clear`๋ฅผ ์ง์ ‘ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ. ๊ทธ ๋‹ค์Œ `tff1`, `tff2`, `tff3` ๋“ฑ์€ ์ด์ „ ๋‹จ๊ณ„์˜ ์ถœ๋ ฅ์„ ์ฐจ๋ก€๋Œ€๋กœ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•จ
  • T-ํ”Œ๋ฆฝํ”Œ๋กญ
    • notion image
      // ์—ฃ์ง€ ํŠธ๋ฆฌ๊ฑฐ I-ํ”Œ๋ฆฝํ”Œ๋กญ. ๋งค ํด๋ก ์‚ฌ์ดํด๋งˆ๋‹ค ํ† ๊ธ€๋จ. module I_FF (q, clk, clear); // ์ž…/์ถœ๋ ฅ ํฌํŠธ๋“ค output q; input clk, clear; // ์—ฃ์ง€ ํŠธ๋ฆฌ๊ฑฐ D-ํ”Œ๋ฆฝํ”Œ๋กญ ์ธ์Šคํ„ด์Šคํ™” // q์˜ ๋ณด์ˆ˜๊ฐ€ ๋˜๋Œ์•„์˜ด. // qbar๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Œ. ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ํฌํŠธ. edge_dff ff1(q, , ~q, clk, clear); endmodule
      1. ์ด ๋ชจ๋“ˆ์€ `I_FF`๋ผ๋Š” ํŠน์ˆ˜ํ•œ ํ”Œ๋ฆฝํ”Œ๋กญ์„ ์ •์˜ํ•จ. ์ด ํ”Œ๋ฆฝํ”Œ๋กญ์€ ์ž…๋ ฅ์ด ์—†์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ† ๊ธ€(toggle, ์ฆ‰ 1์ด๋ฉด 0์œผ๋กœ, 0์ด๋ฉด 1๋กœ ๋ฐ”๋€Œ๋Š”) ํ•  ์ˆ˜ ์žˆ์Œ 2. ์ถœ๋ ฅ `q`์™€ ์ž…๋ ฅ `clk`(ํด๋ก), `clear`(๋ฆฌ์…‹)๋ฅผ ํฌํŠธ๋กœ ๊ฐ€์ง 1. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” `edge_dff`๋ผ๋Š” D ํ”Œ๋ฆฝํ”Œ๋กญ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ํ”Œ๋ฆฝํ”Œ๋กญ์˜ D ์ž…๋ ฅ์— `q`์˜ ๋ฐ˜์ „๋œ ์‹ ํ˜ธ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•จ. ์ด ๋•Œ, `qbar` ์ฆ‰, `q`์˜ ๋ฐ˜์ „ ์‹ ํ˜ธ๋ฅผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์Œ 2. `clear` ์‹ ํ˜ธ๋Š” ํ”Œ๋ฆฝํ”Œ๋กญ์„ ๋ฆฌ์…‹ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ
  • ์—ฃ์ง€ ํŠธ๋ฆฌ๊ฑฐ D-ํ”Œ๋ฆฝํ”Œ๋กญ
    • notion image
      // ์—ฃ์ง€ ํŠธ๋ฆฌ๊ฑฐ D ํ”Œ๋ฆฝํ”Œ๋กญ module edge_dff(q, qbar, d, clk, clear); // ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ output q, qbar; // q๋Š” ์ผ๋ฐ˜ ์ถœ๋ ฅ, qbar๋Š” q์˜ ๋ฐ˜์ „ ์ถœ๋ ฅ input d, clk, clear; // d๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ, clk๋Š” ํด๋ก ์‹ ํ˜ธ, clear๋Š” ๋น„๋™๊ธฐ ๋ฆฌ์…‹ // ๋‚ด๋ถ€ ๋ณ€์ˆ˜ wire s, sbar, r, rbar, cbar; // ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ๊ฒฐ ์„  // ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๋ฌธ // clear ์‹ ํ˜ธ์˜ ๋ฐ˜์ „ ์ƒ์„ฑ assign cbar = ~clear; // clear ์‹ ํ˜ธ์˜ ๋ฐ˜์ „ // ์ž…๋ ฅ ๋ž˜์น˜; ๋ ˆ๋ฒจ ๊ฐ์ง€์ž„์„ ์ฃผ๋ชฉ. Edge-sensitive ํ”Œ๋ฆฝํ”Œ๋กญ์€ 3๊ฐœ์˜ SR ๋ž˜์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋จ // ๋‹ค์Œ์€ ๊ฐ ๋ž˜์น˜์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. assign sbar = ~(rbar & s), // sbar ๋Š” rbar์™€ s์˜ AND ์—ฐ์‚ฐ์˜ NOT ๊ฒฐ๊ณผ s = ~(sbar & cbar & ~clk), // s๋Š” sbar, cbar, clk์˜ NOT์˜ AND ์—ฐ์‚ฐ์˜ NOT ๊ฒฐ๊ณผ r = ~(rbar & ~clk & s), // r๋Š” rbar, clk์˜ NOT, s์˜ AND ์—ฐ์‚ฐ์˜ NOT ๊ฒฐ๊ณผ rbar = ~(r & cbar & d); // rbar๋Š” r, cbar, d์˜ AND ์—ฐ์‚ฐ์˜ NOT ๊ฒฐ๊ณผ // ์ถœ๋ ฅ ๋ž˜์น˜ // ๋‹ค์Œ์€ ์ถœ๋ ฅ ๋ž˜์น˜์˜ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. assign q = ~(s & qbar); // q๋Š” s์™€ qbar์˜ AND ์—ฐ์‚ฐ์˜ NOT ๊ฒฐ๊ณผ assign qbar = ~(q & r & cbar); // qbar๋Š” q, r, cbar์˜ AND ์—ฐ์‚ฐ์˜ NOT ๊ฒฐ๊ณผ endmodule
      1. ์ด ์ฝ”๋“œ๋Š” D ํ”Œ๋ฆฝํ”Œ๋กญ์˜ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ, ๋ฐ์ดํ„ฐ ์ž…๋ ฅ `d`, ํด๋ก `clk`, ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ๋ฆฌ์…‹ `clear` ์‹ ํ˜ธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Œ 2. `q`์™€ `qbar`๋Š” ํ”Œ๋ฆฝํ”Œ๋กญ์˜ ์ถœ๋ ฅ์œผ๋กœ, `q`๋Š” ์ผ๋ฐ˜ ์ถœ๋ ฅ์ด๋ฉฐ, `qbar`๋Š” `q`์˜ ๋ฐ˜์ „๋œ ๊ฐ’์ž„ 3. ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ wire๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋“ค์€ ํ”Œ๋ฆฝํ”Œ๋กญ์˜ ๋‚ด๋ถ€ ๋…ผ๋ฆฌ ํšŒ๋กœ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹ ํ˜ธ๋“ค์ž„ 4. `assign` ๋ฌธ์€ wire์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ. ์ด ์ฝ”๋“œ์—์„œ๋Š” ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Œ 5. ์‹ค์ œ ํ”Œ๋ฆฝํ”Œ๋กญ์˜ ๋™์ž‘์€ ์ด๋Ÿฌํ•œ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ตฌํ˜„๋จ. ์˜ˆ๋ฅผ ๋“ค์–ด, `sbar`์™€ `rbar`๋Š” SR ๋ž˜์น˜์˜ "Set"๊ณผ "Reset"์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, `s`์™€ `r`์€ ์ด๋“ค์˜ ๊ฐ๊ฐ ๋ฐ˜์ „๋œ ๊ฐ’์ž„ 6. ์ด ๊ตฌํ˜„์€ ํด๋ก์˜ ์ƒ์Šน ์—ฃ์ง€์—์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ˜ํ”Œ๋งํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, `clear`๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์ถœ๋ ฅ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฆฌ์…‹๋จ
  • ์Šคํ‹ฐ๋ฎฌ๋Ÿฌ์Šค
    • // ์ƒ์œ„ ๋ ˆ๋ฒจ ์Šคํ‹ฐ๋ฎฌ๋Ÿฌ์Šค ๋ชจ๋“ˆ module stimulus; // ์ž…๋ ฅ์„ ์ž๊ทนํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ reg CLOCK, CLEAR; // CLOCK๊ณผ CLEAR ์‹ ํ˜ธ๋ฅผ ์œ„ํ•œ ๋ ˆ์ง€์Šคํ„ฐ wire [3:0] Q; // 4๋น„ํŠธ ์ถœ๋ ฅ Q๋ฅผ ์œ„ํ•œ ์™€์ด์–ด initial // ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋™์•ˆ์˜ ๊ฐ’ ๋ณ€ํ™”๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ ํƒœ์Šคํฌ $monitor($time, " Count = %b Clear = %b", Q[3:0], CLEAR); // ์„ค๊ณ„ ๋ธ”๋ก 'counter'์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ counter c1(Q, CLOCK, CLEAR); // Clear ์‹ ํ˜ธ์— ๋Œ€ํ•œ ์Šคํ‹ฐ๋ฎฌ๋Ÿฌ์Šค initial begin CLEAR = 1'b1; // ์ดˆ๊ธฐ์— CLEAR๋ฅผ ๋†’์€ ์ƒํƒœ๋กœ ์„ค์ • #34 CLEAR = 1'b0; // 34 ์‹œ๊ฐ„ ๋‹จ์œ„ ํ›„์— CLEAR๋ฅผ ๋‚ฎ์€ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ #200 CLEAR = 1'b1; // 200 ์‹œ๊ฐ„ ๋‹จ์œ„ ํ›„์— ๋‹ค์‹œ CLEAR๋ฅผ ๋†’์€ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ #50 CLEAR = 1'b0; // 50 ์‹œ๊ฐ„ ๋‹จ์œ„ ํ›„์— CLEAR๋ฅผ ๋‹ค์‹œ ๋‚ฎ์€ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ end initial begin // ํด๋Ÿญ ์‹ ํ˜ธ๊ฐ€ 10 ์‹œ๊ฐ„ ๋‹จ์œ„๋งˆ๋‹ค ํ† ๊ธ€๋˜๋„๋ก ์„ค์ • CLOCK = 1'b0; // ์ดˆ๊ธฐ์— CLOCK๋ฅผ ๋‚ฎ์€ ์ƒํƒœ๋กœ ์„ค์ • forever #10 CLOCK = ~CLOCK; // ๋ฌดํ•œ ๋ฃจํ”„ ๋‚ด์—์„œ 10 ์‹œ๊ฐ„ ๋‹จ์œ„๋งˆ๋‹ค CLOCK ์ƒํƒœ ํ† ๊ธ€ end // ์‹œ๊ฐ„ 400์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ข…๋ฃŒ initial begin #400 $finish; // 400 ์‹œ๊ฐ„ ๋‹จ์œ„ ํ›„์— ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ข…๋ฃŒ end endmodule
      1. ์ด ์ฝ”๋“œ๋Š” stimulus๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ •์˜ํ•˜๋ฉฐ, ์ด๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ DUT(ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๋””๋ฐ”์ด์Šค)์ธ counter ๋ชจ๋“ˆ์„ ์‹œํ—˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž„
      1. CLOCK๊ณผ CLEAR๋Š” ์ž…๋ ฅ ์ œ์–ด ์‹ ํ˜ธ๋กœ, ์ด๋“ค์€ DUT์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
      1. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘ ์‹œ, CLEAR ์‹ ํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ณ , ํŠน์ • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ ํ›„์— ๋ณ€๊ฒฝ๋˜์–ด DUT์˜ ๋ฐ˜์‘์„ ํ…Œ์ŠคํŠธํ•จ
      1. CLOCK ์‹ ํ˜ธ๋Š” ์ง€์†์ ์œผ๋กœ ํ† ๊ธ€๋˜๋ฉฐ, ์ด๋Š” DUT์— ํด๋Ÿญ ์ž…๋ ฅ์„ ์ œ๊ณตํ•จ
      1. $monitor ์‹œ์Šคํ…œ ํƒœ์Šคํฌ๋Š” ์‹ ํ˜ธ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ฝ˜์†”์— ์ถœ๋ ฅํ•จ. ์ด๋ฅผ ํ†ตํ•ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋™์•ˆ Q ๋ฐ CLEAR์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Œ
      1. ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์ „์ฒด ๋™์ž‘์„ ๊ฒ€์ฆํ•œ ํ›„์— ์ข…๋ฃŒ๋จ
ย