반응형

프로젝트 생성부터 시작한다.

Project name : pll_clock

Project type : RTL

Source : X

 

 

프로젝트를 생성 후 pll_clock_top.v 파일을 생성해 준다.

코드는 다음과 같다.

module pll_clock_top(
    input i_Clk,
    input i_Rst,
    output reg [3:0] o_LED
    );
    
parameter CLOCK_FREQ = 1_000_000_00;
parameter COUNTER_MAX_CNT=CLOCK_FREQ/2 - 1;    
reg [31:0] cnt;
reg [1:0] led_on_number;
wire clk_out1;
    
clk_wiz_0 clk_wiz_0_inst(
    .clk_out1(clk_out1),
    .resetn(i_Rst),
    .locked(),
    .clk_in1(i_Clk)
);

always@(posedge clk_out1, negedge i_Rst) begin
    if(!i_Rst) begin
        cnt <= 32'd0;
        led_on_number <= 2'd0;
    end else begin
        cnt <= cnt + 1'b1;
        if(cnt == COUNTER_MAX_CNT) begin
            cnt <= 32'd0;
            led_on_number <= led_on_number + 1'b1;
        end
    end
end

always@(led_on_number) begin
    case(led_on_number)
        0: o_LED <= 4'b0001;
        1: o_LED <= 4'b0010;
        2: o_LED <= 4'b0100;
        3: o_LED <= 4'b1000;
        default: o_LED <= 4'b1111;
    endcase
end
   
endmodule

 

Project manager > IP catalog 를 클릭 해 준다.

IP(Intellectual Property) 는 재사용 가능한 블럭들을 지칭한다. 근데 이 블럭들은 기능을 가지고 있는 

 

 

그러면 다음과 같은 창이 나온다.

 

 

Search : clock

 

아래에 있는 FPGA Features and Design > Clocking > Clocking Wizard 를 더블클릭 해 준다.

 

 

다음과 같은 IP 생성창이 나온다.

 

 

 

Input Frequency 를 50Mhz 로 조정해 준다.

 

 

위의 Output Clocks 탭을 클릭하고 clk_out1이 100Mhz인지 확인한다.

 

 

이 창에서 휠 다운을 해서 Reset Type > Negetive 로 돌려준다.(Active low)

 

 

OK 를 눌러 생성한다.

 

 

OK > 다음과 같은 창이 나온다.

 

 

이 정보가 생성이 된다고 알려주는데 그냥 generate 시킨다.

생성을 다하면 다음과 같은 창이 나오고 OK 눌러준다.

 

 

그럼 소스에 IP가 추가되어 있는 것을 볼 수 있다.

 

다음 사진과 같이 빨간 원을 친 부분을 누르면

 

 

 

이런 창이 뜨는데, OK를 눌러준다. 그러면 아래에 clk_wiz_0이 생기는걸 볼 수 있다(위 사진과 같음)

생성된 clk_wiz_0.v 파일을 열어본다.

 

 

자동 생성된 clk_wiz_0 모듈을 볼 수 있다.

이 모듈은 submodule 로 clk_wiz_0_clk_wiz 를 받는다.

그리고 우리가 설정한 대로 input 50Mhz clock 을 output 100Mhz clock 으로 늘려주는 역할을 한다.

 

모듈을 상세하게 더 알아보고 싶으면 submodule 을 클릭해 보면 된다.

 

반응형
반응형

오늘은 Vivado tool을 이용해 Sim & Run 까지 실행 해 본다.

먼저, 새로 프로젝트를 생성한다.

 

 

이름은 led_pwm 으로 지정해 주었다.

프로젝트 타입 : RTL

소스 X

보드 선택 : xc7z010clg400-1

 

 

프로젝트를 생성했다.

led_pwm.v 파일을 생성해 준다.

Design source 추가 > Create file

 

생성한 led_pwm 파일을 열어준다.

소스 코드는 다음과 같이 작성했다.

 

led_pwm.v

module led_pwm(
    input i_Clk,
    input i_Rst,
    output o_LED
    );

// 시뮬레이션용으로 [7:0], 1ms sim run
reg [21:0] c_Cnt, n_Cnt;
// 시뮬레이션용으로 [4:0]
reg [9:0] c_pwm_period, n_pwm_period, pwm_counter;
reg r_LED;
    
always@(posedge i_Clk, negedge i_Rst)
if(!i_Rst) begin
    c_Cnt <= 0;
    c_pwm_period <= 0;
end else begin
    c_Cnt <= n_Cnt;
    c_pwm_period <= n_pwm_period;
end    
        
always@* begin
    n_Cnt <= c_Cnt + 1;
    n_pwm_period <= c_pwm_period;
    if(&c_Cnt)  n_pwm_period <= c_pwm_period + 10;    
end

always@(posedge i_Clk, negedge i_Rst) 
if(!i_Rst) begin
    pwm_counter <= 0;
end else begin
    pwm_counter <= pwm_counter + 1;
    if(pwm_counter < c_pwm_period)  r_LED <= 1;
    else                            r_LED <= 0; 
    if(&pwm_counter) pwm_counter <= 0;  
end

assign o_LED = r_LED;    




endmodule

 

 

 

 

simulation 에 사용할 tb_led_pwm.v 도 생성해 준다.

 

Testbench 파일 생성을 위해 simulation sources 를 만든다.

이름은 tb_led_pwm 으로 지정한다.

 

 

내용은 다음과 같다. (simulation sources 에 파일이 있다)

tb_led_pwm.v

module tb_led_pwm();

reg clk, rst;
wire led;

led_pwm U0(clk, rst, led);

always
#10 clk = ~clk;

initial begin
    clk <= 0; 
    rst <= 0; 
    @(negedge clk) rst <= 1;
end

endmodule

 

/  \

| 시뮬레이션  |

\_ _ _ _ _ _ _ /

시뮬레이션은 왼쪽의 SIMULATION > Run Simulation > Run behavior simulation 에서 가능하다.

누르면 다음과 같은 창이 나온다.

 

보기 편하도록 objects, scope 탭을 최소화한다.

 

위의 메뉴 탭을 보면 이게 시뮬레이션에서 사용하는 도구들이다.

Start(T) 버튼, 가장 오른쪽의 Relaunch simulation,  가장 왼쪽의 Restart 만 일단 써 보도록 한다.

처음에 10 us 로 지정이 되어 있을텐데 1 ms로 바꿔 주고 Start(T) 를 눌러준다.

 

다음의 Zoom fit 버튼을 눌러준다.

 

 

그러면 시뮬레이션이 실행되는데 이렇게 되어 있으면 정확하게 보고 판단할 수 없으므로 Zoom 을 이용해 세부 값을 알아본다.

나는 보통 왼쪽 Ctrl 을 누르고 마우스 휠을 돌리는게 편해서 자주 그렇게 사용한다.

 

 

보게 되면 led가 변하는 모습을 확인할 수 있다. 코드가 주기성을 가지므로 시뮬레이션 결과도 주기성을 가진다.

만약 버그로 led 표기가 제대로 되지 않는다면 relaunch simulation 버튼을 눌러 다시 실행한다.

코드를 수정해도 relaunch를 해 줘야 바뀐 코드가 정상 적용된다. Restart 로는 불가능하다.

 

 

다음은 보드에서 실행되는 모습을 확인한다.

합성 진행해 준다.

I/O 포트는 다음과 같다.

 

 

Implementation 진행 해 준다.

이후 bitstream 만들고 HW manager 켜서 테스트까지 한다.

 

 

잘 동작하는 것을 볼 수 있다.

조금 더 세부 조정을 위해서는 카운팅하는 값을 내리면 된다.

반응형

+ Recent posts