发布网友 发布时间:2022-04-24 17:37
共1个回答
热心网友 时间:2023-10-27 01:31
代码一段一段的解释吧,如果还有什么不明白的,可以给我留言
整个程序总体的意思是:将一个输入为50HZ的时钟分频得到一个1HZ的时钟,然后通过这个1HZ时钟驱动两个计数器计算,将计数的值用两个七段数码管显示出来,每秒钟计数变化一次。
mole kk(output [6:0]HEX0,
output [6:0]HEX1,
input CLOCK_50,
input [0:0]KEY
);
wire clk_1hz;
reg [3:0]cnt,cnt1;
下面这句是实例化一个时钟分频器,输入时钟是50M,因此得到一个1HZ的输出时钟,这样每隔一秒变化一次。
div u0(.o_clk(clk_1hz),.i_clk(CLOCK_50),.rst_n(KEY));
下面这段always是控制cnt和cnt1计数,大概意思是如果cnt大于8时:首先将cnt清零,接着如果cnt1等于9,将cnt1清零,否则cnt1加1;如果cnt不大于8时,则cnt每次加2。我觉得这段代码是不是写得有点问题,这个计数好奇怪~~
always @(posedge clk_1hz or negedge KEY)
begin
if(!KEY)
begin
cnt<=4'b0;
cnt1<=4'b0;
end
else
begin
if(cnt>4'd8)
begin
cnt<=4'b0;
if(cnt1==4'd9)
cnt1<=4'b0;
else
cnt1<=cnt1+1;
end
else
cnt<=cnt+1'b2;
end
end
下面实例化两个七段数码管的查找表,用于得到输出cnt和cnt1对应的七段数码管值
seg7_lut u1(
.oseg(HEX0),
.idig(cnt[3:0])
);
seg7_lut u2(
.oseg(HEX1),
.idig(cnt1[3:0])
);
endmole
下面这个div模块是用来分频的,分频系数为50_000_000,所以比如你的输入时钟是100MHZ的话,出来就只有2HZ了,如果你输入时钟是50M,则输出的时钟每个周期就是1秒,即1HZ
mole div(
output reg o_clk,
input rst_n,
input i_clk
);
parameter N=50_000_000;
parameter M=24_999_999;
//
reg [25:0]cnt;
这一段就是分频的计数器,当每次从0~49999999,就相当于分频50000000次了
always @(posedge i_clk or negedge rst_n)
begin
if(!rst_n)
cnt<=26'b0;
else
begin
if(cnt==N-1)
cnt<=26'b0;
else
cnt<=cnt+26'b1;
end
end
这一段是产生输出时钟的高电平和低电平,当0~M半周期内,时钟是高电平,后半周期为低电平
always @(posedge i_clk or negedge rst_n)
begin
if(!rst_n)
o_clk<=0;
else
begin
if(cnt<=M)
o_clk<=1;
else
o_clk<=0;
end
end
endmole
//seg7_lut
//
下面这个模块是用于显示7段数码管的查找表,输入一个十进制的数字,会输出一个7位的数据用来驱动七段数码管,至于七段数码管的原理,你可以百度一下,很简单的。
mole seg7_lut (idig,oseg
);
output reg [6:0] oseg;
input [3:0] idig;
always @ (idig)
begin
case (idig)
4'h1: oseg = 7'b1111001; // ---t---
4'h2: oseg = 7'b0100100; // | |
4'h3: oseg = 7'b0110000; // lt rt
4'h4: oseg = 7'b0011001; // | |
4'h5: oseg = 7'b0010010; // ---m---
4'h6: oseg = 7'b0000010; // | |
4'h7: oseg = 7'b1111000; // lb rb
4'h8: oseg = 7'b0000000; // | |
4'h9: oseg = 7'b0011000; // ---b---
4'ha: oseg = 7'b0001000;
4'hb: oseg = 7'b0000011;
4'hc: oseg = 7'b1000110;
4'hd: oseg = 7'b0100001;
4'he: oseg = 7'b0000110;
4'hf: oseg = 7'b0001110;
default: oseg = 7'b1000000;
endcase
end
endmole