verilog 中的 4 位双向计数器
4 bit Bi-Directional counter in verilog
我的作业要求设计一个4位双向计数器,从0递增到12递增,达到12后,从12递减到0递增3次(0 2 4 6 8 10 12 9 6 3 0 2 4 ...)。直到程序被用户使用 "stop" 命令终止,这个循环应该继续
本项目将采用触发器设计,必须使用D触发器
这是我的verilog代码。当我创建 textbench 文件时出现错误:
module CounterTopLevel(
input clk,
input rst,
input stop,
output [3:0] counter_out
);
//-----------Input Ports---------------
//input clk, stop;
//-----------Output Ports---------------
//output reg [3:0] counter_out;
//initial counter_out = 4'b0000;
//------------Internal Variables--------
wire rst;
wire stop;
wire clk;
wire [3:0] counter_out;
wire q3;
wire q2;
wire q1;
wire q0;
wire d3;
wire d2;
wire d1;
wire d0;
//D3=Q3Q0' + Q2Q1Q0
//D2= Q2Q1' + Q2Q0' + Q2'Q1Q0
//D1= Q3'Q1'Q0 + Q1Q0'
//D0= Q0'
//Z3=Q2
//Z2= Q3Q0' + Q2'Q1 + Q1Q0'
//Z1= Q3 + Q2'Q0
//Z0= Q3Q0 + Q2Q1Q0
assign d3 = (q3 & ~q0) | (q2 & q1 & q0);
assign d2 = (q2 & ~q1) | (q2 & ~q0) | (~q2 & q1 & q0);
assign d1 = (~q3 & ~q1 & q0) | (q1 & ~q0);
assign d0 = ~q0;
assign counter_out[3] = q2;
assign counter_out[2] = (q3 & ~q0) | (~q2 & q1) | (q1 & ~q0);
assign counter_out[1] = q3 | (~q2 & q0) | (~q1 & q0);
assign counter_out[0] = (q3 & q0) | (q2 & q1 & q0);
DFF DFF0 (
.clk(clk),
.rst(rst),
.d(d0),
.stop(stop),
.q(q0)
);
DFF DFF1 (
.clk(clk),
.rst(rst),
.d(d1),
.stop(stop),
.q(q1)
);
DFF DFF2 (
.clk(clk),
.rst(rst),
.d(d2),
.stop(stop),
.q(q2)
);
DFF DFF3 (
.clk(clk),
.rst(rst),
.d(d3),
.stop(stop),
.q(q3)
);
endmodule
module DFF(
input clk,
input rst,
input d,
input stop,
output reg q
);
always @(posedge clk) begin
if (rst == 1'b1) begin
q <= 1'b0;
end
else begin
if (stop == 1'b1) begin
q <= q;
end
else begin
q <= d;
end
end
end
endmodule
这是文本台:
module test2;
// Inputs
reg clk;
reg rst;
reg stop;
// Outputs
wire [3:0] counter_out;
// Instantiate the Unit Under Test (UUT)
CounterTopLevel uut (
.clk(clk),
.rst(rst),
.stop(stop),
.counter_out(counter_out)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
stop = 0;
// Wait 100 ns for global reset to finish
#100;
rst=1;
#100;
clk=1; ===> line 28
#20;
rst=0;
clk=0;
#20; ===>line 32
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
stop=1;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
stop=0;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
// Add stimulus here
end
endmodule
它给出了这个错误:
ERROR:HDLCompiler:806 - "C:/Users/Ahmed Yasin/Desktop/exps/cift_yonlu_sayaci/test2.v" Line 28: Syntax error near ";".
ERROR:HDLCompiler:806 - "C:/Users/Ahmed Yasin/Desktop/exps/cift_yonlu_sayaci/test2.v" Line 32: Syntax error near "(".
ERROR:ProjectMgmt - 2 error(s) found while parsing design hierarchy.
我该如何解决?
我已经在 EDA Playground 上试过了。稍作改动后效果很好。
CounterTopLevel 我不得不删除 rst
、stop
、clk
和 counter_out
.
的重新声明
对于您的测试台时钟,您可能需要考虑以下方面的一些事情:
initial begin
clk =0;
forever begin
#20 clk = ~clk;
end
end
对于测试程序,您可以执行以下操作:
initial begin
rst =0;
stop=0;
@(posedge clk);
@(posedge clk);
rst=1;
repeat(10)
@(posedge clk); //Wait ten clock edges until setting stop
stop=1;
end
我的作业要求设计一个4位双向计数器,从0递增到12递增,达到12后,从12递减到0递增3次(0 2 4 6 8 10 12 9 6 3 0 2 4 ...)。直到程序被用户使用 "stop" 命令终止,这个循环应该继续 本项目将采用触发器设计,必须使用D触发器
这是我的verilog代码。当我创建 textbench 文件时出现错误:
module CounterTopLevel(
input clk,
input rst,
input stop,
output [3:0] counter_out
);
//-----------Input Ports---------------
//input clk, stop;
//-----------Output Ports---------------
//output reg [3:0] counter_out;
//initial counter_out = 4'b0000;
//------------Internal Variables--------
wire rst;
wire stop;
wire clk;
wire [3:0] counter_out;
wire q3;
wire q2;
wire q1;
wire q0;
wire d3;
wire d2;
wire d1;
wire d0;
//D3=Q3Q0' + Q2Q1Q0
//D2= Q2Q1' + Q2Q0' + Q2'Q1Q0
//D1= Q3'Q1'Q0 + Q1Q0'
//D0= Q0'
//Z3=Q2
//Z2= Q3Q0' + Q2'Q1 + Q1Q0'
//Z1= Q3 + Q2'Q0
//Z0= Q3Q0 + Q2Q1Q0
assign d3 = (q3 & ~q0) | (q2 & q1 & q0);
assign d2 = (q2 & ~q1) | (q2 & ~q0) | (~q2 & q1 & q0);
assign d1 = (~q3 & ~q1 & q0) | (q1 & ~q0);
assign d0 = ~q0;
assign counter_out[3] = q2;
assign counter_out[2] = (q3 & ~q0) | (~q2 & q1) | (q1 & ~q0);
assign counter_out[1] = q3 | (~q2 & q0) | (~q1 & q0);
assign counter_out[0] = (q3 & q0) | (q2 & q1 & q0);
DFF DFF0 (
.clk(clk),
.rst(rst),
.d(d0),
.stop(stop),
.q(q0)
);
DFF DFF1 (
.clk(clk),
.rst(rst),
.d(d1),
.stop(stop),
.q(q1)
);
DFF DFF2 (
.clk(clk),
.rst(rst),
.d(d2),
.stop(stop),
.q(q2)
);
DFF DFF3 (
.clk(clk),
.rst(rst),
.d(d3),
.stop(stop),
.q(q3)
);
endmodule
module DFF(
input clk,
input rst,
input d,
input stop,
output reg q
);
always @(posedge clk) begin
if (rst == 1'b1) begin
q <= 1'b0;
end
else begin
if (stop == 1'b1) begin
q <= q;
end
else begin
q <= d;
end
end
end
endmodule
这是文本台:
module test2;
// Inputs
reg clk;
reg rst;
reg stop;
// Outputs
wire [3:0] counter_out;
// Instantiate the Unit Under Test (UUT)
CounterTopLevel uut (
.clk(clk),
.rst(rst),
.stop(stop),
.counter_out(counter_out)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
stop = 0;
// Wait 100 ns for global reset to finish
#100;
rst=1;
#100;
clk=1; ===> line 28
#20;
rst=0;
clk=0;
#20; ===>line 32
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
stop=1;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
stop=0;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
clk=1;
#20;
clk=0;
#20;
// Add stimulus here
end
endmodule
它给出了这个错误:
ERROR:HDLCompiler:806 - "C:/Users/Ahmed Yasin/Desktop/exps/cift_yonlu_sayaci/test2.v" Line 28: Syntax error near ";".
ERROR:HDLCompiler:806 - "C:/Users/Ahmed Yasin/Desktop/exps/cift_yonlu_sayaci/test2.v" Line 32: Syntax error near "(".
ERROR:ProjectMgmt - 2 error(s) found while parsing design hierarchy.
我该如何解决?
我已经在 EDA Playground 上试过了。稍作改动后效果很好。
CounterTopLevel 我不得不删除 rst
、stop
、clk
和 counter_out
.
对于您的测试台时钟,您可能需要考虑以下方面的一些事情:
initial begin
clk =0;
forever begin
#20 clk = ~clk;
end
end
对于测试程序,您可以执行以下操作:
initial begin
rst =0;
stop=0;
@(posedge clk);
@(posedge clk);
rst=1;
repeat(10)
@(posedge clk); //Wait ten clock edges until setting stop
stop=1;
end