例题:设计一个异步清0,同步时钟使能和异步数据加载型8位二进制加法计数器。
1.异步清0是当rst信号变化时(上升沿或下降沿)计数器直接清0,而不是等到下一个时钟信号来的时候才清0。清0操作不受时钟信号影响。
2.同步时钟使能是操作受时钟信号影响。
3.异步数据加载是当load信号变化时(上升沿或下降沿),将预设数据加载到计数器中,而不是等到下一个时钟信号来的时候才加载到计数器中。加载操作也不受时钟影响。
核心模块代码:
module CNT8 (CLK,RST,EN,LOAD,COUT,DOUT,DATA);
input CLK,EN,RST,LOAD;
input[7:0] DATA;
output[7:0] DOUT;
output COUT;
reg[7:0] Q1;
reg COUT;
assign DOUT = Q1;
always@(posedge CLK or negedge RST or negedge LOAD)
begin
if (!RST) Q1<= 0;
else if (!LOAD) Q1<=DATA;
else if (EN) begin
if (Q1<255) Q1<=Q1+1;
else Q1 <= 8'b00000000;
end
end
always@(Q1)
if (Q1==8'hFF) COUT=1'b1;
else COUT =1'b0;
endmodule
测试模块代码:
module testCNT8;
reg CLK,EN,RST,LOAD;
reg [7:0] DATA;
wire [7:0] DOUT;
wire COUT;
CNT8 testit(CLK,RST,EN,LOAD,COUT,DOUT,DATA);
//设置时钟信号
initial
CLK=0;
always
#5 CLK=~CLK;
//设置其他信号变化
initial
begin
RST=0;LOAD=1;EN=1;DATA=8'h11;
#20 RST=1;
#50 LOAD=0;
#5 LOAD=1;
#50 $finish;
end
endmodule