Kraklog
[Verilog] LED shift 본문
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 |