본문 바로가기

반응형

rtl design

(5)
[Verilog HDL] 16. FSM을 이용한 APB register file 설계 자 드디어 APB inteface를 갖는 register file을 설계할 때가 되었다. APB interface logic을 설계하기 위해서 우리는 FSM에 대해서 배울 것이다. FSM은 Finite State Machine의 약자로 하드웨어의 제어 로직을 만들 때 많이 사용하는 구조이다. 어떤 기능을 하는 하드웨어 로직을 제어 하기 위해서는 그 하드웨어가 어떤 상태에 있는지를 정의할 수 있어야 한다. 그래야 각 상태별로 필요한 제어 신호를 만들어 낼 수 있다. FSM은 유한한 하드웨어 상태를 정의하고 입/출력과 현재 상태에 따라 필요한 제어신호를 만들고 다음 상태는 어떤 상태가 되는지를 정의하는 하드웨어 로직이다. 우리가 설계하고자 하는 FSM의 목적은 APB bus protocol을 register..
[Verilog HDL] 15. regfile.v를 최적화 하자.(parameter와 배열 인덱싱 기법) 이번 장에서는 ch13에서 만들었던 regfile.v code를 좀 더 유연하고 단순하게 최적화 해 보겠다. 이러한 작업을 refactoring이라고도 한다. 처음에는 기능 구현에만 중점을 두어 빨리 코딩했더라도 추후에 refactoring을 통해 코드를 단순화 시키고 최적화 시키는 작업이 필요할 수 있다. 비단 합성 했을 때 하드웨어 성능이나 면적 측면에서 좋아 지지 않더라도 코드의 가독성을 높이고 재사용 가능성을 높이기 위한 최적화도 필요한 경우가 많다. 이를 위해 새로 배워햐 할 기능이 'parameter'이다. parameter는 verilog에서 주로 상수를 표현하는데 사용하기도 하지만 한 module의 instance마다 다르게 사용해야 할 변수들이 있을 때 사용하기도 한다. 어떤 면에서 C+..
[Verilog HDL] 11. ALU (Arithmetic Logic Unit) 설계 ALU는 CPU에서 덧셈, 뺄셈 등과 같은 산술 논리 연산을 담당하는 하드웨어 블록이다. 지금 까지 배운 덧셈기, 뺄셈기, 시프터를 이용하여 ALU설계를 해보자. 일반적인 ALU의 개념은 아래 링크를 참조한다. https://ko.wikipedia.org/wiki/%EC%82%B0%EC%88%A0_%EB%85%BC%EB%A6%AC_%EC%9E%A5%EC%B9%98 산술 논리 장치 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. ko.wikipedia.org 산술논리장치의 일반적인 입출력은 다음과 같이 구성할 수 있다. 1) 입력 operand A : 산술 연산의 대상이 되는 입력 값 operand B : 산술 연산의 대상이 되는 입력 값 opcode OP : 산술 연산의 종류를 결정..
[Verilog HDL] 9. Function 을 사용한 뺄샘기(Subtractor) 설계 * 이 장에서 배우는 것 function clock gating enable 이번에는 verilog function block을 사용하여 뺄셈기를 설계해 보자. function block은 C언어에서의 함수와 같이 특정 코드 블록을 모아 호출할 수 있는 기능을 제공해 준다. verilog에서는 주로 조합회로를 구현 하기 위해 사용한다. 특정 조합회로를 function으로 구현하면 같은 기능을 필요로 하는 곳에 중복해서 코딩을 할 필요 없이 function을 호출하면 된다. 뺄셈기의 기본 설계 개념은 시퀀셜 가산기와 동일하다. 아래는 완성된 뺄셈기 코드이다. module subtractor ( input clock, input resetn, input en, input wire [7:0] a, input ..
[Verilog HDL] 8. 순차논리 (Sequential Logic) Adder 설계 앞에서 배운 DFF 설계 기법을 활용하여 clock에 동기되어 동작하는 adder를 설계해 보자. 우선 완성된 source code는 아래와 같다. module adder_seq ( input clock, input resetn, input [7:0] a, input [7:0] b, output reg [7:0] y ); reg [7:0] sum; always@(*) begin sum = a+b; end always @(posedge clock or negedge resetn) begin if (!resetn) y

반응형