十六进制计数器

十六进制计数器

couter.v

十六进制计数器模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module counter (
input clk, // 输入脉冲
input rst, // 复位信号
output reg[3:0] data // 输出计数器
);

initial begin
data = 4'b0000; // 一开始 data 初始化为 0
end

always @(posedge clk) begin
if (rst == 1'b1) begin
// 如果复位信号为 1 则复位 data 成 0
data = 4'b0000;
end else begin
// 否则 data + 1 计数
data = data + 1;
end
end

endmodule

clkdiv

分频模块
数位板的脉冲为100whz
如果不分频,频率太高了,输出的灯会一直亮着

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module clkdiv (
input clk_in, // 输入脉冲
output reg clk_out // 输出脉冲
);
reg [24:0] data = 25'b0;
// 输入脉冲 除以 2^25 = 输出脉冲

initial begin
// 初始化为 0
clk_out = 0;
end

always @(posedge clk_in) begin
data = data + 1; // data++
if (data == 25'b0) begin
// 如果 data == 0 则输出脉冲反转一次
clk_out = ~clk_out;
end
end

endmodule

testbench.v

测试模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
module testbench (  
);

// 变量区
reg clk; // 模拟脉冲
reg rst; // 模拟复位信号
wire [3:0] data; // 计数器
reg clk_div; // 模拟分频后的脉冲

// 初始化区
initial begin
$dumpfile("wave.vcd"); //生成的vcd文件名称
$dumpvars(0, testbench); //tb模块名称
end

initial begin
// 复位信号初始化为 1
// 模拟脉冲初始化为 0
// 100000 ns 后结束
rst = 1'b1;
clk = 1'b0;
#100000 $finish;
end

always #1 begin
// 每个 10 ns 模拟脉冲反转一次
clk = ~clk;
end

// 实例化区
// 实例化分频模块
// 实例化计数模块
clkdiv clkdiv(.clk_in(clk), .clk_out(clk_out));
counter counter(.clk(clk), .rst(rst), .data(data));

endmodule

十六进制计数器
http://yjh-2860674406.github.io/2022/09/04/编程/Verilog/十六进制计数器/
Author
Ye JinHua
Posted on
September 4, 2022
Licensed under