整个程序总体的意思是:将一个输入为50HZ的时钟分频得到一个1HZ的时钟,然后通过这个1HZ时钟驱动两个计数器计算,将计数的值用两个七段数码管显示出来,每秒钟计数变化一次。
module 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])
)
endmodule
下面这个div模块是用来分频的,分频系数为50_000_000,所以比如你的输入时钟是100MHZ的话,出来就只有2HZ了,如果你输入时钟是50M,则输出的时钟每个周期就是1秒,即1HZ
module 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
endmodule
//seg7_lut
//
下面这个模块是用于显示7段数码管的查找表,输入一个十进制的数字,会输出一个7位的数据用来驱动七段数码管,至于七段数码管的原理,你可以百度一下,很简单的。
module 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 // ltrt
4'h4: oseg = 7'b0011001 // ||
4'h5: oseg = 7'b0010010 // ---m---
4'h6: oseg = 7'b0000010 // ||
4'h7: oseg = 7'b1111000 // lbrb
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
endmodule
1、首先,在项目上右键,点击New Source创建新的代码文件。
2、选择User Document创建自定义的文本文件。
3、创建好后,在下方切换到Files面板,双击打开该文件,按照自己喜欢的形式输入数据。
4、数据文件写好后,就要编写Verilog测试模块读取该文件并对模块进行测试了。在项目上右键,点击New Source,接着选择Verilog Test Fixture,输入文件名并继续,选择待测模块,接着创建文件。
5、编写以下代码。
6、在仿真模式下运行仿真,效果如图。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)