Verilog语言快速入门.ppt

* 浅色部分很少用。只有三种语句:一、assign语句;二、always语句;三、底层模块调用语句。 这是一个模块结构,而不是程序结构,因为程序除了模块以外还有编译语句等、程序还可以包括多个模块。程序还可以是UDP,而不是模块。 模块说明部分体现了模块的名字,输入输出信号类型等信息。 * * 对程序的结构和语法进行说明。 1.模块表达:以module为引导关键词,后跟模块名,模块名由用户自定义,Verilog区别大小写,名字要有望文生义的功能,括号中是所有的端口信号名,信号名之间用逗号隔开,括号后加分号;最后以endmodule结束(注意所有的关键词都是小写)。 2.端口语句是指一整条语句,说明了端口信号的模式和名称以及数据类型;端口模式是指input、output、inout,描述的是端口信号的流向;端口信号名是指端口信号的名称; 端口模式有输入、输出、输入输出双向三种。(双向举例:RAM的数据口信号就是双向的。) 端口名由用户自定义,注意也要望文生义; 端口名之间用逗号隔开,最后加分号; 信号的位数说明: 如果信号是一位的,也称标量,不需特别说明; 如果是信号是多位的,也称矢量,要在端口模式后加[msb:lsb]说明,msb是高位标号,lsb是低位标号,比如output [7:0] C,D; 表示C、D是8位矢量,分别为C[7]、C[6]、……C[0],共8位,D亦如此。 * assign的含义为安排,分配,交给,在这里引申为赋值。 * 详见夏宇闻教材第6章,自学。 * * * * * * * * * * always语句的关键词意义在于区别initial语句,前者只要满足激活条件就总是执行,而后者只在仿真开始执行一次。 * * * * 如果用assign语句描述时序电路,需要在门级描述层次上描述。 如果复位信号下降沿到来,则激活过程块,且直接清零。 如果时钟上升沿到来,则激活过程块,此时如果复位信号不为零,则执行下面的语句,如果使能信号有效,则Q=D,否则保持;如果RST为0,则Q仍保持为0; * Begin end类似C语言中的大括号。 思考问题:在仿真时,begin和end之间的语句执行顺序如何? * 所谓执行是指仿真时 这是对阻塞和非阻塞的基本理解,全面的理解是: 阻塞赋值:过程块激活后,按从上到下顺序进行计算赋值,一条不结束不会执行下一条; 非阻塞赋值:过程块激活后,保存旧值,按从上到下顺序进行计算,但不进行赋值,需要等到整个always语句结束时再进行赋值(按从上到下顺序) * 所谓执行是指仿真时 这是对阻塞和非阻塞的基本理解,全面的理解是: 阻塞赋值:过程块激活后,按从上到下顺序进行计算赋值,一条不结束不会执行下一条; 非阻塞赋值:过程块激活后,保存旧值,按从上到下顺序进行计算,但不进行赋值,需要等到整个always语句结束时再进行赋值(按从上到下顺序) * 例a*b原值为4,m=4,某时刻a*b变为6,则阻塞赋值结果y=6;非阻塞赋值结果y=4。 * 这一部分举第8章例子最好,以便学生使用教材。例8-3~例8-7。 * * 综合举例 采用顺序法,需要知道底层模块的端口信号列表顺序,从底层模块的模块说明部分可得知。 * * 关于基本逻辑门,详见第5章,自学。 3. always语句块 begin end之间的赋值语句有阻塞赋值和非阻塞赋值之分。 阻塞赋值:语句顺序执行,前面的执行完才能执行后面; 赋值符号:= 非阻塞赋值:所有语句并行执行。 赋值符号:= 赋值目标1=表达式1; 赋值目标2=表达式2; 赋值目标1=表达式1; 赋值目标2=表达式2; 赋值语句1会阻塞赋值语句2 ,即只有当赋值语句1执行完才能执行赋值语句2。 赋值语句1不会阻塞赋值语句2 ,赋值语句1和赋值语句2并行执行。 3. always语句块 举例比较: 阻塞赋值 begin m=a*b; y=m; end 非阻塞赋值begin m=a*b; y=m; end 当m=a*b 执行完才能执行y=m 。 当m赋值完成后,才能执行y的赋值,y得到的是m的新值。 m和y的赋值并行执行,y得到的是m的旧值。 m=a*b 和y=m并行执行 。 阻塞赋值的实质:右边表达式的计算和对左边寄存器变量的赋值是一个统一的原子操作中的两个动作,这两个动作之间不能再插入其他任何动作。 非阻塞赋值的实质:首先按顺序计算右边表达式的值,但是并不马上赋值,而是要等到过程结束时再按顺序赋值。 赋值目标1=表达式1; 赋值目标2=表达式2; 赋值目标1=表达式1; 赋值目标2=表达式2; 阻塞赋值【例8-6】 always @ (A,B) begin M1=A; M2=BM1; Q=M1|M2; end

文档评论(0)

1亿VIP精品文档

相关文档