谁能帮忙翻译一下这个verilog程序

谁能帮忙翻译一下这个verilog程序,第1张

代码一段一段的解释吧,如果还有什么不明白的,可以给我留言

整个程序总体的意思是:将一个输入为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、在仿真模式下运行仿真,效果如图。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7746897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存