【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序

【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序

首先展示以下完整的程序

`timescale 1ns / 1ps


module hardreg(
input   wire clk,
input   wire clrb,
input wire [3:0] d,
output wire [3:0] q );

flop_D  f1(d[0],clk,clrb,q[0],),
      f2(d[1],clk,clrb,q[1],),
	  f3(d[2],clk,clrb,q[2],),
	  f4(d[3],clk,clrb,q[3],);
endmodule


/***********************门级表述的D触发器********************************
module flop_D(
input  data,
input  clock,
input  clear,
output  q,
output  qb);

nand       nd1(a,data,clock,clear),
           nd2(b,ndata,clock),
           nd4(d,c,b,clear),
           nd5(e,c,nclock),
           nd6(f,d,nclock),
           nd8(qb,q,f,clear);
nand       nd3(c,a,d),
           nd7(q,e,qb);
not        iv1(ndata,data),
           iv2(nclock,clock);
endmodule    

*****************************************************************************/
module flop_D(
input data,
input clock,
inout clear,
output reg q=1'b0 ,
output  qb);

always@(posedge clock or  posedge clear)
begin
if(clear)
q<=0;
else
q<=data;
end
endmodule

/**************激励模块******************
`timescale 1ns / 1ps
module sim_hardreg(  );
	
reg clock,clearb;
reg[3:0] data;
wire [3:0] qout;
`define  stim   #100 data=4'b
event end_first_pass;
hardreg  reg_4bit (.d(data),.q(qout),.clrb(clearb),.clk(clock));
initial 
begin
clock=0;
clearb=1;
end
always  #50  clock=~clock;

always@(end_first_pass)
clearb=~clearb;
always@(posedge clock)
$display ("at time %0d clearb=%b data=%d qout=%d",$time,clearb,data,qout);
initial
begin
repeat(4)
begin
data=4'b0000;
`stim 0001;
`stim 0010;
`stim 0011;
`stim 0100;
`stim 0101;
`stim 0110;
`stim 0111;
`stim 1000;
`stim 1001;
`stim 1010;
`stim 1011;
`stim 1100;
`stim 1101;
`stim 1110;
`stim 1111;
#200-> end_first_pass;
end
$finish;
end

endmodule```


关于主程序部分主要需要注意以下几个问题。

1、什么时候input和output可以使用reg型而什么情况下不可以?
  当输入输出信号出现在例化中的输出位置时必须用wire型也就是如本程序所示,如果输出错用了reg型会报如下错误:
*[Synth 8-685] variable ‘q’ should not be used in output port connection
2、为什么D触发器中有五个变量而例化的时候只用了四个变量?
  要注意如果被引用的模块中有变量有一个在例化中不需要的话,需要用逗号代替,没有逗号是不对的。如果被引用的模块中没有多余的变量时多写了逗号也是不对的。
  

重点在这个激励模块运用了很多新东西。

1、时钟的一种表示方法

initial 
begin
clock=0;
end
always  #50  clock=~clock;

用这种方式来产生时钟非常方便也很常用。

2、宏定义

`define  stim   #100 data=4'b

这句话的含义是指定stim 代替 #100 data=4’b,在以后的程序中一旦看到`stim全部替换成#100 data=4’b。可以使源程序简洁。

3、事件

event end_first_pass;
.....
#200-> end_first_pass;

第一句话用来定义一个事件。而第二句话用来触发这个事件。
触发方式为 # time (触发的时刻)-> (事件名)

4、展示和结束

$display ("at time %0d clearb=%b data=%d qout=%d",$time,clearb,data,qout);
$finish;

第一行用于展示数据,展示数据可以和Modelsim的波形一起反应程序运行的情况。如果用vivado和Modelsim联合仿真的话展示结果可以在Modelsim的Transcript窗口展示。
第二行的finish用来结束程序,在仿真过程中会提示是否要finish如果点击确定的话程序执行完毕会自动关掉,而不展示波形。如果点击取消程序会执行到finish那一步。

5、如何调整vivado仿真默认的1000ns?
请添加图片描述
请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值