modelsim模十BCD计数器数据流描述和行为描述3,四位同步计数器数据流描述和行为描述(代码及错误记录)

1.没设置实体名报错

** Error: D:/my/modelsim/modelsimsoft/win64/lab3_7.v(6): Missing instance name in instantiation of 'lab3_5'.
# ** Error: D:/my/modelsim/modelsimsoft/win64/lab3_7.v(7): Missing instance name in instantiation of 'lab3_6'.

改后,最开始我把调用放在initial后面,设置实体名也没用,然后把调用放到前面就能用了很玄。

2.仔细设计每个文件的文件名及文件路径,不然容易出现调用错误

实验3.2模十BCD计数器模块设计

主从JK触发器Verilog HDL数据流描述源代码

文件名:lab3_1

module lab3_1(Q,QN,J,K,CLK,CLR);

// 主从jkT 触发器 Verilog HDL 数据流描述

input J,K,CLK,CLR; //负向沿时钟和高电平清零

output Q,QN; //Q 为 1 位输出

wire net1,net2,net3,net4,net5,net6; //定义内部线

assign net1 = !(net3 && (!CLK));

assign net2 =!(net4 && (!CLK));

assign net3=!(net5 && net4);

assign net4=!(net3 && net6 && CLR);

assign net5=!(QN && J && CLK && CLR);

assign net6=!(Q && CLK && K);

assign QN =!(Q && CLR && net2),

       Q =!(net1 && QN);

 endmodule

模十BCD计数器Verilog HDL门级结构描述源代码

文件名:module lab3_2

module lab3_2(Q,CLK,CLR,CTR);

//模十BCD计数器 Verilog HDL 门级结构描述

input CLK,CLR,CTR; //负向沿时钟和高电平清零

output [3:0]Q; //Q 为输出总线,线宽为 4 位

lab3_1 lab3_1r0(Q[0], ,CTR,CTR,CLK,CLR), //隐式调用,注意端口顺序

        lab3_11(Q[1], ,QN,CTR,Q[0],CLR), //counter模块 QN 端口未使用,用空格表示该端口悬çᄅ  ᄎ

       lab3_12(Q[2], ,CTR,CTR,Q[1],CLR),

       lab3_13(Q[3],QN,Q[1]&&Q[2],CTR,Q[0],CLR);

 endmodule

模十BCD计数器Verilog HDL行为描述源代码

文件名:

module lab3_3(Q,CLK,CLR,CTR);

input CTR, //数据输入端

CLK, //时钟信号下降沿触发

CLR; //清零信号

output [3:0]Q; //输出

reg [3:0]Q; //定义为寄存器类型

always@(negedge CLK or negedge CLR or negedge CTR)//每当CLK,CLR,CTR负向沿的时候

begin //always只能有一个语句,多个语句用begin end

if(!CLR) //当CLR=0,无,表示1

Q<=4'b0; //数据清零

else if(!CTR)//其他情况

begin //??else多个语句用begin end

Q<=Q; //暂停保持不变

end

else if(Q==4'b1001)//计数到第十个清零

begin

Q<=4'b0000;

end

else

begin

Q<=Q+1;//正常计数

end //?? else if??

end //??always??

endmodule //计数器模块结束

模十BCD计数器testbench  Verilog HL源码

文件名:

`timescale 10ns/1ns

module lab3_4;

reg CLK,CLR,CTR; //输入端口

wire [3:0] QA;

wire [3:0] QB; //对应移位寄存器的输出总线

lab3_2  lab3_20(QA,CLK,CLR,CTR);//调用移位寄存器描述模块

lab3_3  lab3_30(QB,CLK,CLR,CTR);

initial //

begin

$monitor($time, "Q_SD = %b Q_BD = %b CTR =%b CLR =%b",QA,QB,CTR,CLR);//输出结构描述的结果

CLK = 0; //将所有信号的寄存器初始值赋值为0

CLR = 0;

CTR=0;

#22 CLR = 1; //退出清0状态

#22 CTR = 1; //退出暂停状态,开始计数

#200 CLR = 0; //中途清零状态

#20 CLR=1;//继续计数

#100 CTR = 0; //中途暂停

#22 CTR = 1; //继续计数

#50 $stop;

end

always #5 CLK = ~CLK; //时钟5个时间单位翻转一次

always @(posedge CLK);

endmodule

实验3.3四位同步计数器模块设计

主从JK触发器Verilog HDL门级结构描述或数据流描述源代码

文件名:

module lab3_1(Q,QN,J,K,CLK,CLR);

// 主从jkT 触发器 Verilog HDL 数据流描述

input J,K,CLK,CLR; //负向沿时钟和高电平清零

output Q,QN; //Q 为 1 位输出

wire net1,net2,net3,net4,net5,net6; //定义内部线

assign net1 = !(net3 && (!CLK));

assign net2 =!(net4 && (!CLK));

assign net3=!(net5 && net4);

assign net4=!(net3 && net6 && CLR);

assign net5=!(QN && J && CLK && CLR);

assign net6=!(Q && CLK && K);

assign QN =!(Q && CLR && net2),

       Q =!(net1 && QN);

 endmodule

.

四位同步计数器Verilog HDL门级结构描述源代码

文件名:lab3_5

module lab3_5(Q,CLK,CLR,EN);

//四位同步计数器 Verilog HDL 门级结构描述

input CLK,CLR,EN; //负向沿时钟和高电平清零

output [3:0]Q; //Q 为输出总线,线宽为 4 位

lab3_1  lab3_10(Q[0], ,EN,EN,CLK,CLR),  //隐式调用,注意端口顺序

        lab3_11(Q[1], ,EN&&Q[0],EN&&Q[0],CLK,CLR),

        lab3_12(Q[2], ,EN&&Q[0]&&Q[1],EN&&Q[0]&&Q[1],CLK,CLR),

        lab3_13(Q[3], ,EN&&Q[0]&&Q[1]&&Q[2],EN&&Q[0]&&Q[1]&&Q[2],CLK,CLR);

 endmodule

四位同步计数器Verilog HDL行为描述源代码

文件名:

module lab3_6(Q,CLK,CLR,EN);

input EN, //数据输入端

CLK, //时钟信号下降沿触发

CLR; //清零信号

output [3:0]Q; //输出

reg [3:0]Q; //定义为寄存器类型

always@(negedge CLK or negedge CLR or negedge RN)//每当CLK,CLR,RN负向沿的时候

begin //always只能有一个语句,多个语句用begin end

if(!CLR) //当CLR=0,无,表示1

Q<=4'b0; //数据清零

else if(RN)//其他情况

begin //??else多个语句用begin end

Q<=Q; //暂停保持不变

end

else if(Q==4'b11111)//计数清零

begin

Q<=4'b0000;

end

else

begin

Q<=Q+1;//正常计数

end //?? else if??

end //??always??

endmodule //计数器模块结束

根据实验要求编写计数器电路的测试激励文件,比较全面分析计数器的功能,并能对比门级结构描述(或数据流描述)和行为描述的结果。

四位同步计数器testbench  Verilog HL源码

文件名:

`timescale 10ns/1ns

module lab3_4;

reg CLK,CLR,EN; //输入端口

wire [3:0] QA;

wire [3:0] QB; //对应移位寄存器的输出总线

lab3_5  lab3_50(QA,CLK,CLR,EN);//调用移位寄存器描述模块

lab3_6  lab3_60(QB,CLK,CLR,EN);

initial //

begin

$monitor($time, "Q_SD = %b Q_BD = %b EN =%b CLR =%b",QA,QB,EN,CLR);//输出结构描述的结果

CLK = 0; //将所有信号的寄存器初始值赋值为0

CLR = 0;

EN=0;

#22 CLR = 1; //退出清0状态

#22 EN = 1; //退出暂停状态,开始计数

#300 CLR = 0; //中途清零状态,完整周期

#20 CLR=1;//继续计数

#100 EN = 0; //中途暂停

#22 EN = 1; //继续计数

#50 $stop;

end

always #5 CLK = ~CLK; //时钟5个时间单位翻转一次

always @(posedge CLK);

endmodule

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值