云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 可编程FPGA数字系统设计实验指导书 - 图文

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

  • 62 次阅读
  • 3 次下载
  • 2026/4/24 22:27:18

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

? 任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值;

? 任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器类

型的;

? 任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出

时才传递给调用参数。

实例应用:利用task和电平敏感的always块设计比较后重组信号的组合逻辑。可以看到,利用task非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余逻辑等问题。

模块源代码:

//----------------- sort4.v ------------------ module sort4(ra,rb,rc,rd,a,b,c,d); output[3:0] ra,rb,rc,rd; input[3:0] a,b,c,d; reg[3:0] ra,rb,rc,rd; reg[3:0] va,vb,vc,vd; always @ (a or b or c or d) begin {va,vb,vc,vd}={a,b,c,d}; sort2(va,vc); //va 与vc互换。 sort2(vb,vd); //vb 与vd互换。 sort2(va,vb); //va 与vb互换。 sort2(vc,vd); //vc 与vd互换。 sort2(vb,vc); //vb 与vc互换。 {ra,rb,rc,rd}={va,vb,vc,vd}; end task sort2; inout[3:0] x,y; reg[3:0] tmp; if(x>y) begin tmp=x; //x与y变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。 x=y; y=tmp; end endtask

endmodule

值得注意的是task中的变量定义与模块中的变量定义不尽相同,它们并不受输入输出类型的限制。如此例,x与y对于task sort2来说虽然是inout型,但实际上它们对应的是always块中变量,都是reg型变量。

测试模块源代码: `timescale 1ns/100ps `include \module task_Top;

reg[3:0] a,b,c,d;

wire[3:0] ra,rb,rc,rd;

2 6

initial begin a=0;b=0;c=0;d=0;

repeat(5) begin

#100 a ={$random}; b ={$random}; c ={$random}; d ={$random};

end #100 $stop;

sort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd));

endmodule

3,设计

1,设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和阶乘的运算。编写测试模块,并给出仿真波形。

2,设计一个模块,通过任务完成3个8位2进制输入数据的冒泡排序。要求:时钟触发任务的执行,每个时钟周期完成一次数据交换的操作。

三、实验报告要求

1、简要描述Verilog HDL中任务和函数的区别和使用要点;

2、实验报告应包括Modelsim环境下仿真得到的波形和QuatusII环境下综合得到RTL级电路图; 3、实验报告应附硬件仿真的波形或显示的照片。

2 7

实验四 有限状态机(FSM)的设计 一 、实验目的

1、了解FSM的应用范围和两种类型的不同特点; 2、掌握FSM的电路结构和设计要点。

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

1、 FSM相关概念和设计要点

FSM适合于设计数字系统的控制模块。用Verilog HDL的case/if-else等语句能很好地描述基于状态机的设计。状态机可以认为是组合逻辑和时序逻辑的特殊组合。时序逻辑部分用于存贮状态,组合电路用于状态译码和产生输出信号。状态机的下一个状态不仅与输入信号有关,还与状态寄存器当前所处的状态有关。

状态机分为Mealy和Moore两种类型,前者的输出只是当前状态的函数,也就是状态的转换与输入信号无关,后者的输出则是当前状态和当前输入的函数,即状态的转换与输入信号有关。

状态机的表示方法:状态图、状态表和流程图。 状态机设计要点

? 一般采用同步时序方式,在时钟信号的触发下完成状态转移;

? 起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁、高效,

有的综合器会自动为状态机的设计选择一个最佳的起始状态; ? 状态编码的方式主要有二进制编码、格雷编码和一位热码编码等:

? 二进制编码(Binary State Machine):采用普通的二进制数代表每个状态,如4个状

态state0/state1/state2/state3对应编码为00/01/10/11。这种编码的缺点是相邻状态的转换有可能有多个比特发生变化(如01->10),瞬变次数多,容易产生毛刺,引起逻辑错误;

? 格雷编码(Gray Code State Machine): 4个状态state0/state1/state2/state3对应编

码为00/01/11/10即为格雷编码方式。格雷码节省逻辑单元,而且在状态的顺序转换中相邻状态每次只有一个比特发生变化,这样减少了瞬变的次数,也减少了产生毛刺和一些暂态的可能。

? 一位热码编码(One-Hot State Machine Encoding):采用n位来编码具有n个状态的

状态机 。如4个状态state0/state1/state2/state3对应编码为1000/0100/0010/0001。采用一位热码编码,虽然多用了触发器,但可以有效节省和简化组合电路。对于寄存器数量多而门逻辑相对缺乏的FPGA来说,采用一位热码编码可以有效地提高电路地速度和可靠性,也有利于提高器件资源的利用率。因此,对于FPGA器件,建议采用这种编码方式。采用这种编码会出现一些多余的状态,即一些无效的状态,需要增加default分支项,以便这些状态下能自动回到起始状态。

? 状态编码的定义可以用parameter或者`define语句。建议采用前者。尽量采用同步电路设

计;

`define state0 2’b00 //不要加分号 `define state1 2’b01 …. case (state)

`state0: …; //不能少“`”

2 8

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com