赞
踩
虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
应用工具:VCS(verilog compiled simulator,编译型代码仿真器)
这小结学习循环语句和语句的顺序与并行执行
循环语句分为4种:
**【例 1】**用for语句描述的7人投票表决器:若超过4人(含4人)投赞成票,则表决通过。
module vote7 ( output pass, input [6:0] vote ); reg[2:0] sum; //sum为reg型变量,用于统计赞成的人数 integer i; reg pass; always @(vote) begin sum = 0; //sum初值为0 for(i = 0;i<=6;i = i+1) begin//for语句 if(vote[i]) sum = sum+1; //只要有人投赞成票,则 sum加1 end if(sum[2]) pass = 1; //若超过4人赞成,则表决通过 else pass = 0; end endmodule
仿真结果:超过四人时,pass输出1
**【例 2】**用repeat语句和移位操作实现两个8位二进制数乘法
仿真结果:(用for实现会更简单)
注1 :首先判断循环执行条件表达式是否为真,若不为真,则其后的语句一 次也不被执行!
注2 :在执行语句中,必须有一条改变循环执行条件表达式的值的语句。
注3 :whille语句只有当循环块有事件控制(即@(posedge clk))时才可综合。
**【例 3】**用while语句对一个8位二进制数中值为1的位进行计数
module count1s_while ( count,rega,clk ); output[3:0] count; input [7:0] rega; input clk; reg[3:0] count; always @(posedge clk) begin:count1 reg[7:0] tempreg; //用作循环执行条件表达式 count = 0; // count初值为0 tempreg = rega; // tempreg 初值为rega while(tempreg) begin// 若tempreg非0,则执行以下语句 if(tempreg[0]) count = count+1; //只要tempreg最低位为1,则 count加1 tempreg = tempreg >>1; //右移1位 end end endmodule
【例 4】用for语句对一个8位二进制数中值为1的位进行计数
结果:都一样
forever一般是不可综合的,所以用在搭建测试平台testbeech中比较多。
//常用在测试模块中产生周期性的波形,作为仿真激励信号。
//常用disable语句跳出循环
initial
begin : Clocking
clk = 0;
#10 forever #10 clk = !clk;
end
initial
begin : Stimulus
……
disable Clocking; // 停止时钟
end
在 “always”模块内,逻辑按书写的顺序执行。 顺序语句——“always”模块内的语句。在 “always”模块内,若随意颠倒赋值语句的书写顺序,可能导致不同的结果 。 注意阻塞赋值语句当本语句结束时即完成赋值操作!下面有两个例子:
//[ 例] 顺序执行模块1 。
module serial1(q,a,clk);
output q,a;
input clk;
reg q,a;
always @(posedge clk) begin
q=~q; //阻塞赋值
a=~q;
end
endmodule
结果:a和q的波形反相。
[例]顺序执行模块2 。
module serial2(q,a,clk);
output q,a;
input clk;
reg q,a;
always @(posedge clk) begin
a=~q;
q=~q;
end
endmodule
结果:a和q的波形一样。
//使用条件语句设计四选一的多路选择器 module select( input a, input b, input c, input d, input [1:0] sel, output reg out ); //always @(a or b or c or d or sel) always @(*)begin case(sel) 2'b00: out <= a; 2'b01: out <= b; 2'b10: out <= c; 2'b11: out <= d; default: out <= 1'bx; endcase end endmodule
//用for语句描述11人投票表决器:若超过6人(含6人)投赞成票,则表示表决通过 module vote11 ( output pass, input [10:0] vote ); reg[3:0] sum; //sum为reg型变量,用于统计赞成的人数 integer i; reg pass; always @(vote) begin sum = 0; //sum初值为0 for(i = 0;i<=10;i = i+1) //for语句 if(vote[i]) sum = sum+1; //只要有人投赞成票,则 sum加1 if(sum[3] | (sum[2] &sum[1]) ) pass = 1; //若超过6人赞成,则表决通过 else pass = 0; end endmodule
作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。