题目2-1:多周期-恒最大值计数-显示电路
设计思路:电路应由3部分构成 第一部分,秒脉冲生成器,输出秒脉冲信号,每秒输出1个CLK周期的高电平,用于后级电路的工作使能。 第二部分,0-9多周期计数器,每个工作使能有效的CLK周期,进行一次计数动作。 第三部分,4-7译码器,把0-9计数器的计数值,译码成HEX LED 的显示逻辑值
设计原理图
秒脉冲生成器RTL图
Verilog HDL代码
module clk_sec(
CLK ,
CNTVAL,
OV );
input CLK;
output [
32-
1:
0] CNTVAL;
output OV;
parameter MAX_VAL =
50_00_0000;
reg [
32-
1:
0] CNTVAL;
reg OV;
always @ (posedge CLK)
begin
if(CNTVAL >= MAX_VAL)
CNTVAL <=
0;
else
CNTVAL <= CNTVAL +
1'b1;
end
always @ (CNTVAL)
begin
if(CNTVAL == MAX_VAL)
OV =
1'b1;
else
OV =
1'b0;
end
endmodule
0-9计数器RTL图
Verilog HDL代码
module cnt0to9(
CLK ,
CNTVAL,
EN ,
OV );
input CLK;
input EN;
output [
4-
1:
0] CNTVAL;
output OV;
reg [
4-
1:
0] CNTVAL;
reg OV;
always @ (posedge CLK )
begin
if(EN)
begin
if(CNTVAL >=
9)
CNTVAL <=
0;
else
CNTVAL <= CNTVAL +
1'b1;
end
else
CNTVAL <= CNTVAL ;
end
always @ (CNTVAL)
begin
if(CNTVAL ==
9)
OV =
1'b1;
else
OV =
1'b0;
end
endmodule
4-7译码器RTL图
Verilog HDL代码
module dec47 (data_in ,data_out );
input [
3:
0] data_in ;
output [
6:
0] data_out ;
reg [
6:
0] data_out ;
always @(data_in )
begin
data_out =
7'b1111111;
case (data_in )
4'b0000: data_out =
7'b1000000; //
0
4'b0001: data_out =
7'b1111001; //
1
4'b0010: data_out =
7'b0100100; //
2
4'b0011: data_out =
7'b0110000; //
3
4'b0100: data_out =
7'b0011001; //
4
4'b0101: data_out =
7'b0010010; //
5
4'b0110: data_out =
7'b0000011; //
6
4'b0111: data_out =
7'b1111000; //
7
4'b1000: data_out =
7'b0000000; //
8
4'b1001: data_out =
7'b0011000; //
9
4'b1010: data_out =
7'b0001000; // A
4'b1011: data_out =
7'b0000011; // b
4'b1100: data_out =
7'b0100111; // c
4'b1101: data_out =
7'b0100001; // d
4'b1110: data_out =
7'b0000110; // E
4'b1111: data_out =
7'b0001110; // F
default: data_out =
7'b1111111;
endcase
end
endmodule
Signaltap的分段触发捕获
题目2-2 :LED 亮度调节
设计思路:电路应由两部分构成 第一部分,1600Hz的脉冲发生器,10ms内有16个高电平脉冲,便于调节方波占空比 第二部分,四个不同占空比的方波发生器,根据对输入脉冲的计数,调节输出的正负,控制占空比
设计原理图
1600Hz的脉冲发生器RTL图
Verilog HDL代码
module clk_f1600(
CLK ,
CNTVAL,
OV );
input CLK;
output [
32-
1:
0] CNTVAL;
output OV;
parameter MAX_VAL =
31250;
reg [
32-
1:
0] CNTVAL;
reg OV;
always @ (posedge CLK)
begin
if(CNTVAL >= MAX_VAL)
CNTVAL <=
0;
else
CNTVAL <= CNTVAL +
1'b1;
end
always @ (CNTVAL)
begin
if(CNTVAL == MAX_VAL)
OV =
1'b1;
else
OV =
1'b0;
end
endmodule
方波发生器RTL图
Verilog HDL代码
module squWave4(
input clk,
output reg wave);
reg [3:0] count;
always @ (posedge clk)
begin
if(count == 15)
begin
count <= 0;
end
else if(count <= 3)
begin
count <=count + 1'b1;
wave <= 1'b1;
end
else if(count < 15)
begin
count <=count + 1'b1;
wave <= 0;
end
end
endmodule
Signaltap的分段触发捕获
Sample depth选256,选32 8 Sample segments
题目2-3 :PWM的创意发挥
一个计数器从0-9循环计数,不同的数值的亮度不同,0最暗,9最亮
设计思路:电路应由4部分构成 第一部分,秒脉冲生成器,输出秒脉冲信号,每秒输出1个CLK周期的高电平,用于后级电路的工作使能。 第二部分,0-9多周期计数器,每个工作使能有效的CLK周期,进行一次计数动作。 第三部分,可控制占空比的方波发生器,根据计数值,调节输出波形的占空比 第四部分,带使能的4-7译码器,不同占空比的方波作为使能信号,把0-9计数器的计数值,译码成HEX LED 的显示逻辑值
设计原理图
秒脉冲生成器和0-9多周期计数器与题目2-1原理相同。
可控制占空比的方波发生器RTL图
Verilog HDL代码
module squWave(
input clk,
input [3:0] max,
output reg wave);
reg [3:0] count;
always @ (posedge clk)
begin
if(count == 9)
begin
count <= 0;
end
else if(count <= max)
begin
count <=count + 1'b1;
wave <= 1'b1;
end
else if(count < 9)
begin
count <=count + 1'b1;
wave <= 0;
end
end
endmodule
带使能的4-7译码器RTL图
Verilog HDL代码
module dec47 (data_in ,data_out ,en);
input [
3:
0] data_in ;
input en;
output [
6:
0] data_out ;
reg [
6:
0] data_out ;
always @(data_in
or en)
begin
data_out =
7'b1111111;
if(en)
begin
case (data_in )
4'b0000: data_out =
7'b1000000; //
0
4'b0001: data_out =
7'b1111001; //
1
4'b0010: data_out =
7'b0100100; //
2
4'b0011: data_out =
7'b0110000; //
3
4'b0100: data_out =
7'b0011001; //
4
4'b0101: data_out =
7'b0010010; //
5
4'b0110: data_out =
7'b0000011; //
6
4'b0111: data_out =
7'b1111000; //
7
4'b1000: data_out =
7'b0000000; //
8
4'b1001: data_out =
7'b0011000; //
9
4'b1010: data_out =
7'b0001000; // A
4'b1011: data_out =
7'b0000011; // b
4'b1100: data_out =
7'b0100111; // c
4'b1101: data_out =
7'b0100001; // d
4'b1110: data_out =
7'b0000110; // E
4'b1111: data_out =
7'b0001110; // F
default: data_out =
7'b1111111;
endcase
end
else data_out =
7'b1111111;
end
endmodule