这是代码:
module counter(q,clock,clear);
output [3:0] q;
input clock,clear;
T_FF tff0(q[0],clock,clear);
T_FF tff1(q[1],q[0],clear);
T_FF tff2(q[2],q[1],clear);
T_FF tff3(q[3],q[2],clear);
endmodule
module T_FF(q,clock,reset);
output q;
input clock,reset;
D_FF d_ff(.q(q),.clk(clock),.clear(reset),.d(~q));
endmodule
module D_FF(q,qbar,clear,clk,d);
output q,qbar;
input clear,clk,d;
wire sbar,s,r,rbar,cbar;
assign cbar=~clear;
assign sbar=~(rbar&s);
assign s=~(sbar&cbar&~clk);
assign r=~(s&~clk&rbar);
assign q=~(s&qbar);
assign qbar=~(q&cbar&r);
endmodule
module counters
timulus;
reg clock,clear;
wire [3:0] q;
counter c1(q,clock,clear);
initial
begin
$monitor($time," q=%b,clock=%b,clear=%b",q,clock,clear);
end
initial
begin
clear=1'b1;
forever #30 clear=~clear;
end
initial
begin
clock=1'b0;
forever #10 clock=~clock;
end
endmodule
这是
仿真结果:
# 0 q=0000,clock=0,clear=1
run
run
# 10 q=0000,clock=1,clear=1
run
run
# 20 q=0000,clock=0,clear=1
run
run
# 30 q=xxx0,clock=1,clear=0
run
run
# 40 q=xxxx,clock=0,clear=0
run
run
# 50 q=xxxx,clock=1,clear=0
run
run
# 60 q=0000,clock=0,clear=1
run
run
# 70 q=0000,clock=1,clear=1
run
run
# 80 q=0000,clock=0,clear=1
run
run
# 90 q=xxx0,clock=1,clear=0
run
run
# 100 q=xxxx,clock=0,clear=0
run
run
# 110 q=xxxx,clock=1,clear=0
run
q为什么会出现xxxx?
- module edge_dff(q, qbar, d, clk, clear);
- // Inputs and outputs
- output q,qbar;
- input d, clk, clear;
- // Internal variables
- wire s, sbar, r, rbar,cbar;
- // Data flow statements
- //Create a complement of signal clear
- assign cbar = ~clear;
- // Input latches
- assign sbar = ~(rbar & s),
- s = ~(sbar & cbar & ~clk),
- r = ~(rbar & ~clk & s),
- rbar = ~(r & cbar & d);
- // Output latch
- assign q = ~(s & qbar),
- qbar = ~(q & r & cbar);
- endmodule
复制代码主从JK触发器设计同步计数器:http://wenku.baidu.com/view/b1547f91195f312b3169a595.html
不客气
module counter(q,clock,clear); 实现的是计数器,clear是复位信号,低有效,
仿真q出现xxxx是因为你的仿真信号中的clear一直在翻转,所以一会复位,一会无效。
仿真程序中
begin
clear=1'b1;
forever #30 clear=~clear;
end
把forever #30 clear=~clear;这句话去掉,然后clear赋初值为0,先复位在置1。
程序这段改为
begin
clear=1'b0;
#30 clear=1'b1;
end
这样你在试试。
谢谢,clear翻转确实太快了,但是我不太明白,虽然翻转快了,但是还是有时间间隔的吧,难道仿真器识别不了?
因为你的时钟周期是20个单位时间,而clear周期是60个单位时间,也就是说,有效的工作时间只有30个单位时间,当clear=1时,程序还没有进行输出就被复位了
一周热门 更多>