Kraklog

[Verilog] LED shift 본문

Study/VerilogHDL

[Verilog] LED shift

Krakens 2023. 12. 16. 21:11
728x90
 
module shift (
    input [1:0]KEY,
    output [6:0] LEDR
);
		wire clk = KEY[1];
		wire rst_n = KEY[0];
		reg [6:0] ledr;
		reg [4:0] clk_count;
			parameter clkk=10;
		
		
    always @(posedge clk or negedge rst_n)
        if (!rst_n) begin
            clk_count <= 0;
        end else if (clk_count <= clkk-1) begin
            clk_count <= clk_count + 1;
        end else begin
            clk_count <= 0;
        end

    always @(posedge clk or negedge rst_n)
        if (!rst_n) begin
            ledr <= 0;
        end else if (clk_count == 0) begin
            if (ledr == 0) begin
                ledr <= 7'h01;
            end else begin
                ledr <= ledr << 1;
            end
        end

    assign LEDR = ledr;

endmodule

KEY[1]의 입력을 10번 받으면 shift가 발생해서 LED를 다음 칸으로 옮겨준다.
즉, KEY[1]의 입력을 10번 카운트 후, 초기화를 해주고 초기화를 해준 뒤 다음 클럭이 들어왔을때 LED를 다음 주소로 옮겨서 on 시키는 동작을 한다.

 

 

 

 
module shift (
	input			clk,
    input [1:0]KEY,
    output [6:0] LEDR
);
		//wire clk = KEY[1];
		wire rst_n = KEY[0];
		reg [6:0] ledr;
		reg [4:0] clk_count;
			parameter clkk=50000000;
		
		
    always @(posedge clk or negedge rst_n)
        if (!rst_n) begin
            clk_count <= 0;
        end else if (clk_count <= clkk-1) begin
            clk_count <= clk_count + 1;
        end else begin
            clk_count <= 0;
        end

    always @(posedge clk or negedge rst_n)
        if (!rst_n) begin
            ledr <= 0;
        end else if (clk_count == 0) begin
            if (ledr == 0) begin
                ledr <= 7'h01;
            end else begin
                ledr <= ledr << 1;
            end
        end

    assign LEDR = ledr;

endmodule
module tb_shift;
    reg 	[1:0]	KEY	;
    wire	[6:0] LEDR	;
	 reg clk;
	 reg rst_n;

defparam uShift.clkk=10;
 shift uShift(
	.clk(clk),
    .KEY(KEY),
    .LEDR(LEDR)
);

initial fork
	clk_task;
	reset_task;
	data_task;
join

 task clk_task;
      begin
         clk = 1'b0;
         forever #(10) clk = ~clk;
      end
   endtask
	
	
 task reset_task;
      begin
         rst_n = 1'b1;
         repeat(2) @(negedge clk);
         rst_n = 1'b0;
         repeat(2) @(negedge clk);
         rst_n = 1'b1;
      end
   endtask


	task data_task;
      begin

      end
   endtask

endmodule

 

내부 동작 클럭 50Mhz에 따라서 clk_count가 증가하고, 50,000,000 에 도달하면 초기화를 해주고 LED를 다음 칸으로 자동으로 옮겨주는 동작을 한다.
testbench에서는 defparam을 활용해서 처음 수동으로 입력했을때와 같은 횟수로 줄여서 동작 확인을 했다.

 

 

 

728x90

'Study > VerilogHDL' 카테고리의 다른 글

[Study] 디지털 시계 설계  (0) 2023.12.09
FSM - Moore, Mealy  (0) 2023.11.16
[Study] 기타회로 설계 [진행중]  (0) 2023.09.02
[Study] 순차논리회로 설계 [진행중]  (0) 2023.09.02
[Study] 디지털 논리 회로 설계  (2) 2023.09.02