Input wire reset_n
Input wire clk
Input wire baud_sel //输出速率选择,李茄1为高速(哪悉察每个时钟输出一个)0为低速(16个时钟输出一个)
Input wire[2:0] mode //模式选择输入
Output reg [6:0] led_8 //7未共阴级数码管显示输出
Reg [3:0] div //输出速率分频
Reg [12:0] out_reg //序列数值存储
Reg [3:0] out_cnt //序列串行输出计数器。每次序列数值都在计数器为11时更新即前一个序列数串行输出完毕
//输出速率
Always@(posedge clk or negedge reset_n )
Begin
If(!reset_n)
Div <=‘h0
Else if(baud_sel)
Div<=‘hf
Else
Div<=div+’h1
End
//序列串行输出计数器,向下递减
//输出序列数据产生
Always@(posedge clk or negedge reset_n )
Begin
If(!reset_n)
out_cnt <=‘hc
else if(Div=’hf)
out_cnt<= out_cnt –‘h1
else
out_cnt<= out_cnt
end
//输出序列数据产生
Always@(posedge clk or negedge reset_n )
Begin
If(!reset_n)
out_reg <= ‘h0
else if(out_cnt==’hc)
Case(mode)
3’h0 : out_reg<= ‘h191c
3’h1 : out_reg<= ‘h1922
3’h2 : out_reg<= ‘h1949
3’h3 : out_reg<= ‘h196d
3’h4 : out_reg<= ‘h1992
3’h5 : out_reg<= ‘h19b6
3’陆山h6 : out_reg<= ‘h19db
3’h7 : out_reg<=‘h19ff
Endcase
Else
Out_reg<={1’h0, out_reg[12:1]} //out_reg 的低位先串行输出
End
Assign out =out_reg[0]
// 数码管显示模式
Always@(posedge clk or negedge reset_n )
Begin
If(!reset_n)
led_8<= ‘h0 //复位时关闭数码管显示
else if(out_cnt==’hc) //一个序列数据输出完毕时更新数码管显示
Case(mode)
3’h0 : led_8 <= ‘h3f
3’h1 : led_8 <= ‘h06
3’h2 : led_8 <= ‘h5b
3’h3 : led_8 <= ‘h4f
3’h4 : led_8 <= ‘h66
3’h5 : led_8 <= ‘h6b
3’h6 : led_8 <= ‘h7d
3’h7 : led_8<= ‘h07
Endcase
Else
led_8 <=led_8
End
Endmodule
这个一个很简单的用verilog实现的四个LED轮流闪的程序。实橘纤悔现竖团的原理是将输入的高圆正频时钟clk做2500000分频,分成肉眼能识别的频率,然后驱动四个LED灯依次闪灯。
代码输入输出好几个管脚都么有使用,建议去掉。有其他问题随时提问,欢迎采纳。
举个简单点的例子,如下。
设计一个4bit的计数器,在记到最大值时输出一个信号
module counter_16 ( input clk, input rst_n, input cnt_in ,output reg cnt_out )
reg [3:0] cnt
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) cnt <= 4'b0
else if (cnt_in) cnt <中弯= cnt +1'b1
else cnt <= cnt
end
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) cnt_out <= 1'b0
else if (cnt_in &&cnt == 4'b1111) cnt_out <= 1'b1
else cnt_out <= 1'b0
end
endmodule
这实际上设计了一个16进制计卖唤闷数器其中的一位,你可以例化多个相同模块,将低位的cnt_out连接到高位的链搏cnt_in,级联成一个任意位数的16进制计数器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)