module cout_asyn(
clk, //时钟输入,48MHz
reset, //复位输入,低电平有效
Q //输出,0:点亮,1:熄灭
);
input clk; //输入说明
input reset; //输入说明
output [3:0] Q; //输出说明
reg [3:0] Q; //寄存器说明
wire clk_out; //低频时钟,周期1S
/*第一个寄存器描述,对clk_out 计数*/
always @(posedge clk_out or negedge reset)
begin
if(!reset)
Q[0] <= 1'b0; //复位0值
else
Q[0] <= ~Q[0]; //反向
end
/*第二个寄存器描述,用Q[0]负边缘触发*/
always @(negedge Q[0] or negedge reset)
begin
if(!reset)
Q[1] <= 1'b0; //复位0值
else
Q[1] <= ~Q[1]; //反向
end
/*第三个寄存器描述,用Q[1]负边缘触发*/
always @(negedge Q[1] or negedge reset)
begin
if(!reset)
Q[2] <= 1'b0; //复位0值
else
Q[2] <= ~Q[2]; //反向
end
/*第四个寄存器描述,用Q[2]负边缘触发*/
always @(negedge Q[2] or negedge reset)
begin
if(!reset)
Q[3] <= 1'b0; //复位0值
else
Q[3] <= ~Q[3]; //反向
end
/*分频模块例化关系*/
clk_div clk_div_0( //分配得到2S的时钟,便于观察
.clk(clk), //时钟输入,48M
.reset(reset), //异步复位输入,高电平复位
.clk_out(clk_out) //分频时钟输出
);
endmodule
module clk_div
(
clk, //时钟输入,48M
reset, //异步复位输入,高电平复位
clk_out //分频时钟输出
);
parameter cnt_top=26'd48000000; //分频系数
input clk; //端口定义
input reset;
output clk_out;
reg clk_out; //寄存器定义
reg [25:0] clk_cnt;
always @(posedge clk or negedge reset)
begin
if(!reset) //复位
begin
clk_out <= 1'b0;
clk_cnt <= 0;
end
else
begin
if(clk_cnt==cnt_top-1)
begin
clk_out <= ~clk_out; //分频输出
clk_cnt <= 0;
end
else
clk_cnt <= clk_cnt+1'b1; //计数器加1
end
end
endmodule
阅读(652) | 评论(0) | 转发(0) |