一、条件、循环、块语句(续)

(一) always语句

1、always #<halfperiod> clk = ~clk;

2、简单的 2 分频

reg[7:0] counter;

reg tick;

always @(posedgeareg)

begin

tick =~tick;

counter = counter +1;

end

3、always 的时间控制可以是沿触发也可以是电平触发的,可以单个信号

也可以多个信号,中间需要用关键字 or 连接。

4、沿触发的 always 块常常描述时序行为,如有限状态机,而电平触发的

always 块常常用来描述组合逻辑的行为。

5、关键词“or”也可以使用“,”来代替。

6、Verilog 语言用关键字 wait 来表示等待电平敏感的条件为真。

always

wait (count_enable) #20 count = count + 1;

(二) task 和function

1、语句的不同点

任务和函数有些不同,主要的不同有以下四点:

1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己 的仿真时间单位。

2) 函数不能启动任务,而任务能启动其它任务和函数。

3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的 变量。

4) 函数返回一个值,而任务则不返回值。

2、常量函数

常量函数实际上是一个带有某些限制的常规 Verilog 函数。这种函数能够用来 引用复杂的值,因而可用来代替常量。在例 15中我们声明了一个常量函数,它 可以用来计算模块中地址总线的宽度。

[例 15] 常量函数

module ram ( ... ... ...) ;

parameter RAM_DEPTH = 256 ;

input [ clog2( RAM_DEPTH) - 1 : 0 ] addr_bus ; //

(三)其它

在 Verilog HDL 语言中每个系统函数和任务前面都用一个标识符$来加以 确认。

二、时钟分频的另一种方法

按照指数分频的简单方法

reg [3:0] count;

wire clk2, clk4, clk8, clk16; always @(posedge clk)

begin

count <= count+1;

end

assign clk2 = count[0];

assign clk4 = count[1];

assign clk8 = count[2];

三、调试用系统任务和常用编译预处理语句

(一)常用系统任务语句

$monitor、

$time、

$readmemb、

$readmemh、

$stop、

$random‘

$Random生成有符号的随机数。

(二)编译预处理语句

define、include;

(三)时间尺度

timescale;

时间精度参量是用来声明该模块的仿真时间的精确程度的;

四、通过练习进一步熟悉ISE的操作

采用 1s、2s、4s 三种不同频率控制 led 等;

五、VerilogHDL模型的不同抽象级别

9.1 门级结构描述;

9.2 Verilog HDL 的行为描述建模;