可编程FPGA数字系统设计实验指导书 - 图文(5)

2019-05-24 11:21

`timescale 1ns/100ps `define clk_cycle 50 module division_Top;

reg F10M_clk,RESET; wire F500K_clk; always

#`clk_cycle F10M_clk = ~ F10M_clk; initial

begin

RESET=1; F10M=0;

#100 RESET=0; #100 RESET=1; #10000 $stop;

end

fdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk)); endmodule

2.设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别

非阻塞赋值语句(<=)右端表达式计算完后并不立即赋值给左端,而是同时启动下一条语句继续执行,而阻塞赋值语句(=)在每个右端表达式计算完成后立即赋值给左端变量。非阻塞赋值不能用于assign语句中,而只能用于对寄存器型变量进行赋值,只能在intial和always等过程过程块中。阻塞赋值既能用于assign语句,也能用于intial和always等过程赋值中。对于时序逻辑的描述和建模,应尽量使用非阻塞赋值方式。若在同一个always过程块中描述时序和组合逻辑混合电路时也最好使用非阻塞赋值方式。

在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。

可综合设计中阻塞赋值和非阻塞赋值设计要点:

1)非阻塞赋值不能用于assign持续赋值中,一般只出现在initial和always等过程块中,对reg型变量进行赋值;

2)当用always块来描述组合逻辑时,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值;

3)在向函数funtion的返回值赋值时,应使用阻塞赋值;

4)不能在一个以上的always过程块中对同一个变量赋值,这样会引起冲突,在综合时会报错;

5)在一个模块中,严禁对同一个变量既进行阻塞赋值,又进行非阻塞赋值,这样会在综合时报错;

6)对时序逻辑的描述和建模,应尽量使用非阻塞赋值方式,此外,若在同一个always过程块中描述时序和组合逻辑混合电路时,最好使用非阻塞赋值方式。

阻塞赋值与非阻塞赋值示例:分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块blocking.v和non_blocking.v来阐明两者之间的区别。 模块源代码:

// ------------- blocking.v --------------- module blocking(clk,a,b,c); output [3:0] b,c;

2 1

input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk) begin b = a; c = b; $display(\ end

endmodule

//------------- non_blocking.v ------------------- module non_blocking(clk,a,b,c);

output [3:0] b,c;

input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk) begin b <= a; c <= b; $display(\ end endmodule

测试模块源代码:

//------------- compareTop.v ----------------------------- `timescale 1ns/100ps `include \

`include \module compareTop;

wire [3:0] b1,c1,b2,c2;

reg [3:0] a; reg clk; initial begin clk = 0; forever #50 clk = ~clk; end initial begin a = 4'h3; $display(\ # 100 a = 4'h7; $display(\ # 100 a = 4'hf; $display(\ # 100 a = 4'ha;

2 2

$display(\ # 100 a = 4'h2; $display(\ # 100 $display(\ $stop; end non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);

endmodule

3,设计题

1,10M的时钟,设计一个单周期形状如下的周期波形。

20μs 10μs 20μs

三、实验报告要求

1、简要描述Verilog HDL中条件语句的使用,阻塞性赋值和非阻塞性赋值的区别和使用要点; 2、实验报告应包括Modelsim环境下仿真得到的波形和QuatusII环境下综合得到RTL级电路图; 3、实验报告应附硬件仿真的波形或显示的照片。

2 3

实验三 函数和任务的应用设计 一 、实验目的

1、掌握函数在模块设计中的使用;

2、掌握任务在结构化Verilog HDL设计中的应用。

二、实验原理、内容及步骤

1、 函数在模块设计中的使用

函数可以在模块不同位置执行共同代码。函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其它的任务。

函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函数。

函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定。如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为1位二进制数。函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值必须出现在函数定义中。

函数调用是表达式的一部分。与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在函数的多个调用之间保持它们的值。

下例是函数调用的一个简单示范,采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算。并且在测试模块中,通过调用系统任务$display在时钟的下降沿显示每次计算的结果。

模块源代码:

module tryfunct(clk,n,result,reset); output[31:0] result; input[3:0] n; input reset,clk; reg[31:0] result; always @(posedge clk) //clk的上沿触发同步运算。

begin

if(!reset) //reset为低时复位。 result<=0; else begin result <= n * factorial(n)/((n*2)+1); end end function [31:0] factorial; //函数定义。 input [3:0] operand; reg [3:0] index; begin factorial = operand ? 1 : 0;

2 4

for(index = 2; index <= operand; index = index + 1) factorial = index * factorial; end endfunction endmodule

测试模块源代码: `include \`timescale 1ns/100ps `define clk_cycle 50 module tryfuctTop;

reg[3:0] n,i; reg reset,clk; wire[31:0] result; initial

begin n=0; reset=1; clk=0; #100 reset=0; #100 reset=1; for(i=0;i<=15;i=i+1) begin #200 n=i; end #100 $stop; end

always #`clk_cycle clk=~clk;

tryfunct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset)); endmodule

上例中函数factorial(n)实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计中,我们不希望设计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是,我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。

2、 任务在结构化设计中的应用

一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以包含时序控制,即时延控制,并且任务也能调用其它任务和函数。

任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义在模块说明部分中编写。

任务调用:

? 一个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变

量值;

? 任务调用语句是过程性语句,可以在always 语句或initial 语句中使用;

? 任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序

匹配。此外,参数要按值传递,不能按地址传递;

2 5


可编程FPGA数字系统设计实验指导书 - 图文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:国家电网国网招聘综合能力测试考试笔试题内容试卷历年考试真题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: