举个简单点的例子,如下。
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作一个与,这个就不对了。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)