怎么用Verilog编一个计数器的程序?

怎么用Verilog编一个计数器的程序?,第1张

举个简单点的例子,如下。

设计一个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进制计数器。

使用4个单bit的减法级联,组成4bit的减法,供参考。

//单bit减法

module a_sub_b_1bit (a, b, c, s, sc)

input a, b, c //C为上个减法的借位。

output reg s, sc //sc为当前的借位

always@(*)

begin

s = a^b^c

if (a)

sc = b&c

else

sc = b|c

end

endmodule

///主程序

module a_sub_b_4bit (a, b, c, s, sc)

input [3:0] a, b

input c //C为上个减法的借位。

output reg [3:0] s

output sc //sc为当前的借位

wire[3:0] sc_t

assign sc = sc_t[3]

a_sub_b_1bita_sub_b_1bit_0u (.a(a[0], .b(b[0], .c(c),.s(s[0]), .sc(sc[0]))

a_sub_b_1bita_sub_b_1bit_1u (.a(a[1], .b(b[1], .c(sc_t[0]), .s(s[1]), .sc(sc[1]))

a_sub_b_1bita_sub_b_1bit_2u (.a(a[2], .b(b[2], .c(sc_t[1]), .s(s[2]), .sc(sc[2]))

a_sub_b_1bita_sub_b_1bit_3u (.a(a[3], .b(b[3], .c(sc_t[2]), .s(s[3]), .sc(sc[3]))

endmodule

你这个是enable为高的时候计数器进行计数,计数到10输出full到下一级。从你的信号连接看,几个级联没有问题,问题出在最后的full的输出,那个应该是送出最后一个的full信号,你现在将四级的full作一个与,这个就不对了。


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

原文地址: http://outofmemory.cn/yw/11529732.html

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

发表评论

登录后才能评论

评论列表(0条)

保存