verilog HDL复习(一)

1、敏感列表
如果组合逻辑块语句的输入变量很多,编写敏感列表就很繁琐,针对这种情况,verilog提供了
两个特殊的符号:@ * 和@(*),他们都表示对其后面语句块中所有输入变量的变化是敏感的。

//@ *操作符的使用
//用or操作符的组合逻辑
//编写敏感列表很繁琐

  [email protected](a or b or c or d or e or f or g or h or p or m)
    begin
      out1 = a ? b + c : d + e;
      out2 = f ? g + h : p + m;
    end

//不用上述方法,用符号@(*)代替,可以把所有的输入变量自动包括进敏感列表

  [email protected](*)
    begin
      out1 = a ? b + c : d + e;
      out2 = f ? g + h : p + m;
    end

//or事件敏感列表
//有异步复位的电平敏感锁存器

  [email protected](reset or clock or d)
    //等待复位信号reset或时钟信号clock,或者输入信号d的变化
    begin
      if(reset)
        q = 1‘b0;
      else if(clock)
        q = d;
      end

2、task...endtask

a.任务定义语法:
  task <任务名>
  <端口及数据类型声明语句>
  <语句1>
  <语句2>
  .
  .
  .
  <语句n>
  endtask

b.任务的调用即变量的传递:
<任务名>(端口1,端口2,...,端口n)

  例子:

1   task task_demo;//任务开头,命名为task_demo
2   input [7:0] x,y;    //输入端口
3   output [7:0] tmp;    //输出端口
4
5   if(x > y)
6     tmp = x;
7   else
8     tmp =y;
9   endtask

说明:
在任务定义的描述语句中,可以使用出现不可综合操作语句(使用最频繁的就是延迟控制语句),单这样会造成任务不可综合;

  例子:描述红绿灯行为
  

 1 module traffic_lights;
 2   reg clock,red amber,green;
 3   parameter on = 1,off = 0,red_tics = 350,
 4   amber_tics = 30;green_tics = 200;
 5
 6   //交通灯初始化
 7   initial red =off;
 8   initial amber=off;
 9   initial green=off;
10
11   //交通灯控制时序
12   always
13     begin
14       red=on;//开红灯
15       lights(red,red_tics);//调用任务等待
16       green=on;
17       lights(green,green_tics);
18       amber=on;
19       light(amber,amber_tics);
20     end
21
22   //定义交通灯开启时间的任务
23   task light;
24   output color;
25   input [31:0] tics;
26   begin
27   repeat(tics)
28     @(posedge clock)
29     color = off;
30   end
31   //产生时钟脉冲模块
32   always
33     begin
34       #100 clock = 0;
35       #100 clock = 1;
36   end
37
38 endmodule

注:
@(条件表达式) do_something;
表示等待条件表达式满足,然后do_something,然后就往下走了。通常用在testbench中,不可综合。

------------------------------------
always @(a or b or c) begin
do_something;
end
表示不停地监测a、b、c,一旦它们任何一个发生变化,就立刻do_something,并且这个“监测”是始终存在的。这种电路综合出来时组合逻辑电路。

3、function...endfunction
a.定义函数的语法:
  function<返回值的类型或范围>(函数名)
  <端口说明语句>
  <变量类型说明语句>
  begin
  <语句>
  ... ...
  endfunction

例子:

1   function [7:0] getbyte;
2   input [15:0] address;
3     begin
4       <说明语句>    //从地址字中提取低字节的程序
5       getbyte=result_expression;    //把结果赋值于函数的返回字节
6     end
7   endfunction

注:<返回值的类型或范围>是可选项,如果是一位寄存器类型数据。

b.函数的调用
<函数名>(<表达式>,...<表达式>)

  例子:两次调用函数getbyte,把两次调用产生的值进行拼接运算以生成一个字。
    word = control ? {getbyte(msbyte),getbyte(lsbyte)} : 0;

注:函数使用规则
  a.函数的定义不能包括含有任何的时间控制语句,即任何用#、@、或wait来标示的语句;
  b.函数不能启动任务;
  c.定义函数时至少要有一个输入参量;
  d.在函数的定义中必须有一条赋值语句给函数中得一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字;

1   function [31:0] factorial; //函数定义
2   input [3:0] operand;
3   reg [3:0] index;
4     begin
5       factorial=operand ? 1:0;
6       for(index=2;index <= operand;index=index+1)
7       fortorial=index*fatorial;
8     end
9   endfunction

task和function说明语句的不同点:

  a.函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
  b.函数不能启动任务,而任务能启动其他任务和函数。
  c.函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。
  d.函数返回一个值,而任务则不返回值。

时间: 2025-01-12 04:30:52

verilog HDL复习(一)的相关文章

3_8译码器Verilog HDL语言的简单实现

最近在学Verilog HDL语言,觉得learn in doing是比较好的学习方式,所以我们来直接分析分析代码好了. 先来一波代码: 1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口声明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8

基于Verilog HDL整数乘法器设计与仿真验证

基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为0表示为正数),取值范围为-127~127. 负数的表示方法为正值的求反又加1.例如: 8’b0000_0100; //表示值:4,正值求反为:8’b1111_1011:再加1表示为:8’b1111_1100,这样便得到了-4的表示方法为:8’b1111_1100. 同理,负值变成正值的方法为:负值

&lt;转&gt;Verilog HDL宏定义define

宏定义 `define 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define signal string 它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string.这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串

自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第七篇,我尽量每周四篇 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包括有过程语句,过程语句有两种:initial.always.其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的.此外,always过程语句是可综合的,initial过程语句是不可综合的.       1.always过程语句 always过程语句的格式如图2-10所示.

verilog HDL 编码风格

1.有意义且有效的名字. 2.同一信号在不同层次应该保持一致. 3.添加有意义的后缀,使信号的有效性更加明确. 4.模块输出寄存器化,使得输出的驱动强度和输入延时是可以预测的. 5.使用括号表明优先级. 6.每一个if都应该有一个else.如果esle没有任何相应的动作,则用一条空语句.(if..esle可能有优先级) 7.case 语句最好有一个default分支,如果default不要执行动作就使用空语句. 8.在每个 模块的开始做模块级的注释,在模块端口列表中出现的信号做简要的功能描述.

Verilog HDL基础语法讲解之模块代码基本结构

Verilog HDL基础语法讲解之模块代码基本结构 ? 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的基本结构. 以下为本章中例子中的代码: 01????/*======================================= 02????*????file neme : mux2.v 03????*????author????:????小梅哥 04????*????Verison????:????

MiS603 开发板2.2 Verilog HDL硬件语言基础

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.2 Verilog HDL硬件语言基础 2.2.1 技术背景 大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅

MiS603开发板 2.1 Verilog HDL 代码规范

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.1 Verilog HDL 代码规范 规范的代码风格,可以让程序更容易阅读和维护. u 文档管理 合理的文档管理也是程序代码规范的重

Verilog HDL实现奇数次分频

在数字逻辑电路中,经常需要设计分频电路,本文是通过Verilog HDL实现了奇数次分频. 以下是设计程序源代码: module freq_div( // Input clk_50, rst_n, // Output clk_div2, clk_div5 ); parameter DIVN = 5; input clk_50; // Clockinput rst_n; // Resetoutput clk_div2; // indicates write transferoutput clk_d