본문 바로가기

분류 전체보기

(24)
덧셈과 뺄셈, 그리고 sign extension 베릴로그로 4비트 덧셈과 뺄셈을 구현해봤다. 그러기 위해서는 1비트 단위의 덧셈부터 구현해야 하는데, 이는 위키피디아에 잘 정리되어 있다. https://en.wikipedia.org/wiki/Adder_(electronics) Adder (electronics) - Wikipedia From Wikipedia, the free encyclopedia Jump to navigation Jump to search Digital circuit that produces sums from inputs An adder, or summer,[1] is a digital circuit that performs addition of numbers. In many computers and other kinds of pr..
integer, case문 및 always문 오류 피드백 오늘은 잘못된 설계 예시를 살펴보면서 뭐가 문제인지 알아보도록 하겠다. 내가 운영하는 소규모 오픈채팅방에서 받은 질문을 토대로 작성하였다. module SwitchEncoder( input clk, input [15:0] key, input [3:0] a, b, output [6:0] FNDa, output [6:0] FNDb, output FNDSel2,FNDSel1 ); reg clk100Hz; reg [6:0] FNDa, FNDb; // 에러 1 integer m=0; always @ (posedge clk) begin if (m >= 4999) begin m
include의 필요성 및 사용법 설명은 생략한다. c언어에서부터 이미 많이들 쓰고 있는 명령어라서 굳이 설명을 할 필요는 없어보인다. 파일 등록을 통해서만 모듈을 쓸 수 있는게 아니란걸 알았으면 좋겠다는 생각에 포스팅하게 됐다. 이게 왜 베릴로그 코딩에서도 필요한가를 설명해보려 한다. 3가지 이유가 존재한다. 1. 터미널 환경을 위해 모델심, 비바도를 제외한 다른 툴은 학부 강의 때 잘 사용하지 않는다. 그러나 실제로 칩 설계를 할때는 터미널 환경에서 코딩을 하게 된다. GUI? 그런거 없다. 있는 GUI라고는 입출력 파형을 보여주는 뷰어뿐이다. 그럼 디버깅은 어떻게 하는가라고 물어볼 수도 있는데, 에러로그만 보면 되니까 문제없다. 제대로 설계됐는지의 확인은 출력 파형으로 확인한다. 터미널 환경에서는 스크립트를 사용해 터미널에서 설계가..
파라미터를 이용한 모듈 선언 코딩하다보면 비슷한 회로지만 비트수가 다른 회로를 설계하는 경우가 있다. 이걸 편하게 해주는 기능이 베릴로그에도 있다. 파라미터를 모듈과 함께 선언해주는 방법인데, 이걸 잘 활용하면 코딩 시간을 좀 줄일 수도 있다. 간단하게 카운터로 예시를 살펴보자. module counter #(parameter param1 = 4, parameter param2 = 14) ( output [param1-1:0] count, input clk, rst ); reg [3:0] cntreg; always @ (posedge clk) begin if (rst) begin cntreg
Simple Finite State Machine implementation Finite State Machine, 이하 FSM은 제어 회로에서 주로 사용된다. 레지스터 변수에 특정 상태(state) 값을 지정하고 그 값에 따라 제어신호를 변화시키는 방식이다. 아주 간단한 FSM을 구현해봤다. module fsm_ex1( output [1:0] state_out, output reg done, input clk, rst, start ); reg [1:0] state; reg [3:0] count; assign state_out = state; always @ (posedge clk) begin if (rst) begin state
테스트벤치 작성 예시 테스트 벤치는 설계한 회로가 제대로 동작하는지 확인하기 위해서 쓴다. 시뮬레이션을 위해서 일반적으로 필요한 신호는 clock과 reset이다. 그 외 제어신호는 각자 하기 나름이지만, clock과 reset은 sequential circuit에서 무조건적으로 필요하다. `timescale 1ns / 1ps module tb_cla(); reg clk, rst; reg [3:0] in_a, in_b; reg carry_in; wire [4:0] cla_result; top TEST(.in_a(in_a), .in_b(in_b), .carry_in(carry_in), .clk(clk), .rst(rst), .out(cla_result) ); initial begin clk
Countdown control & display 신호등과 같은 CountDown 표시가 필요한 회로는 세 가지 조건을 만족해야 한다. Condition 1. 신호등은 정해진 시간부터 0초까지 1초씩 신호가 바뀐다. 1의 자릿수가 0이 되면 그 다음에는 10의 자릿수가 1씩 감소하며, 1의 자릿수는 9가 된다. 각 자릿수의 카운터가 서로 엮여있으므로 nested counter를 쓸 것이다. nested counter에 대해서는 이전 포스트에서 언급한 적이 있어서 자세히는 설명하지 않겠다. Condition 2. 신호등은 각자 다른 시간을 가지고 있기 때문에 그리고 언제든지 조정이 될 수 있어야하기 때문에, 값을 조정할 수도 있어야 할 것이다. Condition 3. 또한 한번 신호가 끝나면 일정 시간 후에 다시 반복해야하기 때문에 신호가 끝나면 일정 시..
BCD to 7 segment decimal code를 7 segment 신호로 변환하는 회로는 사실 case문 써서 그냥 0~9일때 {A, B, C, D, E, F, G}의 값을 전부 지정할 수도 있지만, 이번에는 4 to 16 decoder를 써볼까 한다. 4 to 16 decoder는 4비트 인풋이 들어오면 16개의 아웃풋 포트 중 한 포트만 1, 나머지는 0이 되는 속성을 지니고 있다. 이말은 즉 16개의 신호를 적당히 OR 연산을 취하면 7 segment 신호를 만들 수 있다는 것이다. 왼쪽 사진과 같은 7 segment에서(DP는 무시한다.) {I3, I2, I1, I0}가 b'0001일 경우 B와 C만 1이고 나머지는 0이다. 이를 임시로 아래와 같이 나타낼 수 있다. B = Q1 | ??? C = Q1 | ??? b'0..