적극적 생각/FPGA

[프로젝트] 주사위 (작성용2)

무말랭이 2022. 8. 12. 13:27

화가나서 죽을 것 같아 ...

현재 RTL이 제대로 동작하지 않는듯하다.

sensitivy와 제어를 잘못 다룬 것 같다.

이 부분을 점검하자.

`timescale 1ns / 1ps

module dice_controller(clk, reset_n, reset_button, shuffle_button, led);

// io

input clk;
input reset_n;
input reset_button;
input shuffle_button;

output reg [3:0] led;

// reg

reg [1:0] dice_status;
reg [31:0] count;

// init

initial begin // reset initial
    dice_status = 2'b00;
    led = 4'b1111;
    count = 0;
end

// main

always@(posedge clk or negedge reset_n) begin // reset signal
    if(!reset_n) begin
        dice_status <= 2'b00;
        led <= 4'b1111;
        count <= 0;
    end
end

always@(posedge clk) begin // status 0, shuffle shufle_button
    if((dice_status==2'b00)&(!shuffle_button)) begin
        led <= 4'b0111;
        count <= count+1;
        if(count == 100000000) begin
            dice_status <= 2'b01;
            count <= 0;
        end
    end
end

always@(posedge clk) begin // status 1
    if(dice_status==2'b01) begin
        led <= 4'b0011;
         count <= count+1;
        if(count == 100000000) begin
            dice_status <= 2'b10;
            count <= 0;
        end
    end
end

always@(posedge clk) begin // status 2, reset reset_button
    //
    if((dice_status==2'b10)&(!reset_button)) begin
        dice_status <= 2'b00;
        led <= 4'b1111;
        count <= 0;
    end
end

endmodule

 

모식도는 다음과 같다.

모식도와 코드가 크게 달라보이지 않으므로

sensitivity와 if조건을 잘 확인해보자.

 

여기는 틀린건 없어보인다.

 

여기는 dice_status와 shuffle_button을 요구로한다.

https://inst.eecs.berkeley.edu/~cs150/fa06/Labs/verilog-ieee.pdf

 

점검해야 하는 지점은 두 지점인데 

- posedge clk 만 두어도 되는가

- & 써야하는가 && 써야하는가

 

점심먹으면서 코드 째려보고 있었는데

아 이쪽이 잘못된게 맞기는 하다. 

이 구문은 논리적으로 동작될 수 없다. 

clk 그리고 concurrent를 많이 생각해야한다.

 

 

수정해서 다시 비트스트림 넣어봤는데

아직도 안된다... ㅠ_ㅠ 왜... ㅠ_ㅠ

`timescale 1ns / 1ps

module dice_controller(clk, reset_n, reset_button, shuffle_button, led);

// io

input clk;
input reset_n;
input reset_button;
input shuffle_button;

output reg [3:0] led;

// reg

reg [1:0] dice_status;
reg [31:0] count;

// init

initial begin // reset initial
    dice_status = 2'b00;
    led = 4'b1111;
end

// main

always@(posedge clk or negedge reset_n) begin // reset signal
    if(!reset_n) begin
        dice_status <= 2'b00;
        led <= 4'b1111;
    end
end

always@(posedge clk) begin // status 0, shuffle shufle_button
    if((dice_status==2'b00)&(!shuffle_button)) begin
        led <= 4'b0111;
		dice_status <= 2'b01;
    end
end

always@(posedge clk) begin // status 1
    if(dice_status==2'b01) begin
        count <= count+1;
		if(count == 100000000) begin
			dice_status <= 2'b10;
			count <= 0;
			led <= 4'b0011;
		end
    end
end

always@(posedge clk) begin // status 2, reset reset_button
    //
    if((dice_status==2'b10)&(!reset_button)) begin
        dice_status <= 2'b00;
        led <= 4'b1111;
    end
end

endmodule

 

그냥 led 말고 버튼 누르면 깜빡이는 led로 축소해서 진행해보자 ... ㅠ_ㅠ 왜이래 이거 정말...

'적극적 생각 > FPGA' 카테고리의 다른 글

dice_new 오류해결완료  (0) 2022.08.16
dice_new  (0) 2022.08.16
@sensitivity  (0) 2022.08.12
대주제  (0) 2022.08.10
pci에 대해 공부하는 법  (0) 2022.08.09