반응형

오늘은 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