使用T触发器设计3位计数器

时间:2016-03-07 13:26:23

标签: verilog

module tff(t,i,qbprev,q,qb);
input t,i,qbprev;
output q,qb;
wire q,qb,w1;
begin
assign w1=qbprev;
if(w1==1)begin
not n1(i,i);
end
assign q=i;
not n2(qb,i);
end
endmodule

module counter(a,b,c,cin,x0,x1,x2);
input a,b,c,cin;
output x0,x1,x2;
reg a,b,c,x0,x1,x2,temp,q,qb;
always@(posedge cin)
begin
tff t1(.t(1) ,.i(a),.qbprev(1),.q(),.qb());
x0=q;
temp=qb;
tff t2(.t(1) ,.i(b),.qbprev(temp),.q(),.qb());
x1=q;
temp=qb;
tff t3(.t(1) ,.i(c),.qbprev(temp),.q(),.qb());
x2=q;
a=x0;
b=x1;
c=x2;
end
endmodule

这是我在verilog中的代码。我的输入是 - 初始状态 - a,b,c和cin

我遇到很多错误,其中第一个是“w1不是常数”这是什么意思?

我也得到错误“非网络端口a不能是模式输入”但是我想要一个输入!

谢谢。

1 个答案:

答案 0 :(得分:3)

模块被实例化为硬件。它们不是软件调用,因此您无法动态创建和销毁硬件:

if(w1==1)begin
  not n1(i,i);
end

考虑到这一点,我希望你能看到,除非w1是一个常量参数,这是'生成if'你的描述没有意义。

实例n1未根据需要调用或创建,它必须始终存在。

此外,您的输入和输出已连接到ii代表一条物理线,它不是我而不是我。这些需要用不同的名称来表示不同的物理线路。

在你的第二个模块中,你有:

input a,b,c,cin;
// ...
reg a,b,c; //...

警告说输入不能是regs,只是不要将它们声明为regs。

input  a,b,c,cin;
output x0,x1,x2;
reg    x0,x1,x2,temp,q,qb;