verilog中的“always”模块和C语言中的for 乍一看always和for循环差不多,如always @(posedge clk or reset)意思是当clk的上跳沿到来或者reset由低电平变到高电平时候执行之后的代码,不断重复,但是,与for相比,1、循环结束条件:always没有循环结束条件,也就是个死循环;2、循环执行条件:always的循环执行条件时()中的变量发生变化时,如always @(reset)是指reset由低电平变到高电平时候执行,且always的条件只有“或”(or),没有与。3、对条件语句的限制:if、case条件语句只能用在“always”模块中(或者是initial模块),在always之外的部分使用条件判断语句,可用类似下面的化简语句:assign out=enable?a:b;4、数据类型:“always”模块中的“被赋值”数据类型必须是reg型的,应为reg型是需要暂存的;5、赋值特点:非阻塞赋值只能在“initial”和“always”块中使用;6、并行执行:每个在“always”模块中的语句在仿真的一开始立即开始执行,而always语句不断重复直到仿真结束。也就是说所有在always中的语句都是并行执行的。
一个例子:带异步高电平有效置位/复位端的D触发器 昨晚在实验室看教材的always部分的时候突发奇想,想自己设计一个D触发器,写了几行代码没有通过,又到网上找了代码,虽然编译成功但是觉得还有问题,第二天上午在书本和ISE自带的例子里找到了答案,并和师兄做了讨论:夏老师书上的例子和ISE自带的例子如下:
module DFF(q,qn,d,clk,set,reset); input d,clk,set,reset; output q,qn; reg q,qn; always @(posedge clk or posedge set or posedge reset) begin if (reset) begin q <= 0; qn <= 1; //异步清0,高电平有效 end else if (set) begin q <=1; qn <=0; //异步置1,高电平有效 end else begin q <= d; qn <= ~d; endendmodule always语句:当clk或者set或者reset出现上跳沿时,开始判断,若reset高,q=0,若set高,q=1;否则,q=d。本程序的不足之处在于:若一开始reset或set高(此时没有出现reset或set的上跳沿),照D触发器的原理,q应该是0或1的,但是按照本例,q不会被重新赋值。 为此想出了一个新的程序,能符合实际情况(为了简化,删去了高电平有效的置位端,但是有问题,不能编译通过)
module DFF(d,clk,q,oq,reset); input d,clk,reset; output q,oq; reg q,oq; always begin if(reset) q <= 0; oq <= 1; end always @(posedge clk ) begin q <= d; oq <= !q; endendmodule
本程序用了一个无条件的always,含有对reset高或低的判断,避免了一开始置高带来的问题。但是由于always是并行执行的,两个always没有先后之分,当同时满足两个条件时,q会被赋予两个不同的值,所以会出现问题。具体如何修改,还有待之后思考。
赋值:C中的赋值很简单,但是Verilog中的赋值却很复杂,分为令人很难理解的所谓“非阻塞幅值”和“阻塞赋值”。
我觉得首先有必要搞清楚什么是组合逻辑电路,什么是时序逻辑电路。维基百科上是这样定义的:组合逻辑电路在任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,而与该时刻以前的输入变量取值无关。 时序逻辑电路是指电路任何时刻的稳态输出不仅取决于当前的输入,还与前一时刻输入形成的状态有关。换句话说,时序逻辑拥有储存元件(内存)来存储信息,而组合逻辑则没有。前一时刻、后一时刻的确定就需要时钟信号来确定,所以时序逻辑需要CLK信号。
阻塞赋值非阻塞赋值
阻塞赋值与非阻塞赋值最大的区别在于:前者是单条赋值语句顺序执行:计算第一条赋值语句等号右边的值->将第一条赋值语句等号右边的值赋给左边->计算第二条赋值语句……,后者则是整体执行:计算所有赋值语句等号右边的值->将所有赋值语句等号右边的值赋给左边。前者一般用在组合逻辑,后者则用于时序逻辑,这是因为:若将阻塞赋值用于同一个时钟沿触发的过程,由时钟偏差造成的时钟沿到达的前后差别会影响执行的顺序。
关于如何将testbench导入modelsim开始仿真,只要确认include的文件路径没错,选中要导入的testbench文件,选择Simulate Behavioral Model即可开始modelsim仿真看到波形。