北航计算机组成原理课程设计-2020秋 PreProject-Verilog HDL与ISE-前言

北航计算机学院-计算机组成原理课程设计-2020秋

PreProject-Verilog HDL 与 ISE - 前言


本节内容完全转载自北航计算机学院计算机组成原理课程组,原文链接:Verilog HDL 与 ISE - 前言,原链接并非所有用户都有权限打开,本转载如有侵权联系删除。


CSDN内置的markdown并不支持Verilog HDL语言格式的关键字高亮,因此本文及后续的文章将使用尽可能相近的C语言格式高亮来展示代码块。


使用说明与内容概览

在计算机组成原理课中,同学们将要学习计算机的各部分、特别是CPU的工作原理和组成部分。而在实验课中,大家最终将亲自实现一个带有中断异常处理的5阶段流水线MIPS CPU和配套外设。正如大家使用C语言进行软件开发一样,开发硬件也需要一种特定的工具、编程语言。

Verilog是一种硬件描述语言。通过类似软件的语法来描述硬件,并可以通过ISE、VIVADO等工具将描述硬件的代码转换成可以在FPGA上面运行的实际电路。Verilog也是大家在实验课使用最多的语言。本教程旨在通过一系列不断深入的图文描述、视频、例题、配套练习,让大家从完全没接触过Verilog,不知道Verilog如何编写、运行、调试,到可以利用相关工具对百行左右的Verilog模块进行设计、开发、调试;掌握使用Verilog开发简单组合、时序逻辑模块能力

除了前言,本教程还包括5部分:

  1. ISE的获取与使用。ISE就像DevC++、codeblocks那样,是集成了代码写、代码运行、项目调试等功能的集成开发环境(IDE)。相比于常见的软件IDE,ISE还具有仿真查看波形图、综合、布线等硬件相关的功能。这一小节讲述了安装、使用ISE进行Verilog开发的基本步骤,并附带了演示视频。

  2. Verilog语法。 无论学习什么语言,都要首先掌握它的基础语法。这一节内容讲述了常见的、课程中会用到的语法,并配套了选择填空题进行练习。

  3. Verilog题目实例与分析。 在理解verilog语法的基础上,这一小节旨在通过2个例题,对组合逻辑和时序逻辑两种最常见的硬件设计需求进行分析,讲述其如何从文字需求一步步转换为verilog代码。在每个例题后面配套了两道简单的练习题,可以直接在下载的例题标程源码上进行修改,或自主进行代码编写并提交。如果无法通过自动测试,可能是对部分语法内容的理解仍不正确,可以继续阅读这一部分,或先阅读下面的Verilog调试方法,进行debug。

  4. Verilog开发调试的流程。 在实际开发中很少有可供参考的标程,需要根据需求和分析方法、自主设计出相应的模块,并进行调试(debug)。这一节将主要介绍利用ISE和Isim工具(已经和ISE一起安装)进行Verilog代码仿真、调试的流程。此外,这一节还从模块设计、代码编写、仿真调试、综合上板等Verilog开发的全流程出发,讲述了各个环节值得注意的地方和推荐使用的其他工具。在小节最后有2个一般的题目,1个较难的题目和1个challenge(附加题),除附加题以外均需要大家进行设计、实现、调试,并最终通过自动测试。

  5. Verilog高级特性。前面的Verilog语法讲解部分仅讲述了完成题目要求所需的语法。但Verilog语言本身还有许多其他用法,例如系统任务、宏等等。此外,在Isim进行仿真的时候,使用了一种“层次化队列”的仿真驱动方法。这些方法或许可以增加对ISE、Verilog本身的理解,或许可以有效的减轻后面开发千行左右工程时的开发、调试难度。

此外,这一节还讲述了命令行环境下执行mips汇编、仿真verilog模块的方法,以实现搭建自动化评测机的目标,理解难度较高。可以在P4以后再进行阅读和相关学习。


推荐阅读顺序

在这一小节,本教程各部分将依次被简称为前言、安装使用、语法、题目、开发调试、高级特性

第一,阅读前言的前两部分,即使用说明与内容概览、推荐阅读顺序。随后,至少完整的读一遍后面的Verilog建模门级-行为级综述。先对硬件设计开发、Verilog具有最基本的全局认识。对于看不懂的地方,不需要仔细研究。

第二,安装使用的前5部分,即“开始新项目”及之前。以能够成功在ISE中创建一个项目为目标。

第三,语法。 以独立完成所有小题,能够看懂教程中所给样例的每一条代码为目标。

第四,题目分析。以根据例题标程进行修改,能够通过配套练习的自动评测为目标。

第五,开发调试除了“综合工程”以外的部分。以独立通过配套题目,AC为目标。这些题目的难度高于题目分析中的练习,且没有对应的相似例题、标程。需要在这一过程中尽快掌握设计、开发、调试的能力

第六,在进行第四、第五步的练习时,参考安装使用的6、9、11部分,并完成7、8、10、12的小题练习。部分关键讲解将以图文和视频的形式放在题目分析开发调试的对应部分,但没有从打开ISE到完成Isim仿真调试的全部操作视频。有需要的同学可以在看完图文教程和关键视频后,跟着安装使用部分的完整视频走一遍。

第七,再次阅读前言部分的Verilog建模门级-行为级综述。将视野从具体的语法、题目中重新拉回到全局,旨在对Verilog、硬件设计等概念有更深的理解,为设计更复杂的模块做准备

第八,高级特性。学有余力的同学推荐全部看完,并进行对应的探索、尝试。对前面题目和教程感到困难的同学,也请务必在P4之前阅读学习完第二部分——“系统任务”。

第九,开发调试的“综合工程”。P8要求将P7的工程烧写在FPGA(课程会提供)上并编写外设,这一过程要求P7的工程必须是可综合的。P4-P7属于增量型开发,即每个P都是在上一个P的基础上增加新功能。因此,请希望完成P8的同学尽量在P4之前完成这一部分的学习和操作。学有余力的同学可以在学习完高级特性后立刻尝试对自己的工程进行综合。

值得注意的是,上面的流程只是教程编写人员推荐的一种阅读和学习顺序。同学们可以在实际学习中,根据自己的特点进行调整。


Verilog建模概述

Verilog模型可以描述实际电路中不同级别的抽象。所谓不同的抽象级别,是指同一个物理电路,可以在不同的层次上用Verilog语言来描述它。使用硬件描述语言(HDL)对系统进行抽象,可以在不同层次观察系统。类似于C语言当中,函数调用是对一组表达式集合的抽象。在本节我们着重于硬件设计的两类仿真级别:结构级建模以及行为级建模。

在进行电路刻画时,可用原理图(Schematic)进行表示。原理图通常包括器件(components)以及连线(wires),其中连线用于连接各器件。原理图具有输入输出,因而本身可以作为器件使用,从而易于层次化设计。使用Verilog语言进行结构级建模时,可将原理图中器件及连线映射为相应的语言描述要素,从而完成建模。该层次建模描述使用低层次器件(如常见简单门电路)描述模块(module),同时使用连线描述系统内各模块输入输出间的关系。

行为级建模则着力于使用系统输出及输入的作用关系。

同一个电路可以在上述两种级别分别进行建模。

复杂数字逻辑电路和系统的层次化、结构化设计意味着硬件设计方案的逐次分解。在设计过程的任意层次,硬件至少有一种描述建模形式。在集成电路设计的一层中,硬件可分解为一些模块(基本单元),这一层的硬件结构由这些模块的互连进行描述,该层次的硬件行为则有这些模块的行为描述。其中,基本单元可由下一层的基本单元互连而成。如此,完整的硬件设计可以由一棵倒置的设计树进行描述。在这棵设计树上,节点对应基本单元的描述,枝干对应于单元结构分解。

常用的硬件系统设计方法主要分为自顶向下设计以及自底向上设计两种:

在自顶向下设计(Top-down design)当中,从顶层开始,进行功能划分和结构设计,重写行为建模至结构建模,直到可使用元件/原语(primitive)进行描述;从底向上设计(Bottom-up design)当中,从简单门器件出发(通常复用已制造的标准基本单元模块),逐层搭建更复杂的模块,直到实现顶层行为要求。

更进一步,电路的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。这些模块可以分别用不同抽象级别的Verilog HDL描述,在一个模块中也可以有多种级别的描述。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。


结构化建模(门级描述)

结构化建模就是把基本门和/或功能单元(主要是我们自己定义的模块)连接起来,从而产生特定的功能元件。结构化建模的过程,类似于我们在Logisim中连接一个电路。

在Verilog中,我们想要使用一个元件前,需要对其进行实例化(instantiate)。在实例化的同时,我们需要指定模块输入输出端口与对应的信号。

对电路元件进行实例化的最常见语法是:

模块名 实例名(端口信号映射);

其中,端口信号映射的格式也有两种:

  1. 位置映射:模块名 实例名(信号1, 信号2, …),其中信号n对应被实例化模块声明时排在第n位的端口。

  2. 名映射:模块名 实例名(.端口名a(信号1), .端口名b(信号2), …),其中信号n对应其前的端口名。

值得注意的是,在实例化元件时,wire类型信号可以被连接至任意端口上,但reg类型的信号只能被连接至元件的输入端口上。在声明元件时,我们可以将任意端口声明为wire类型,但只能将输出端口声明为reg类型,否则会出现问题。

Verilog中已经为我们预备好了一系列基本功能元件,称为原语,主要包括:

and nand or nor xor xnor这些n输入原语和not这一n输出原语

n输入原语可以有多个输入,只能通过位置映射连接,对应端口连接顺序为输出, 输入1, 输入2, 输入3, …

n输出原语可以有多个输出,只能通过位置映射连接,对应端口连接顺序为输出1, 输出2, …, 输出n, 输入

下面来看一个例子:

module Adder(
    input a, 
    input b, 
    input cin, 
    output sum, 
    output overflow
    );
    wire s1, s2, s3;
    //xor与and均为原语,是系统预定义的模块
    xor xor1(sum, a, b, cin);
    and and1(s1, a, b);
    and and2(s2, a, cin);
    and and3(s3, b, cin);
    or or1(overflow, s1, s2, s3);
endmodule   

对应的电路图如下所示:

在这里插入图片描述


行为级描述

对于一个复杂电路来说门级电路结构看起来会相当复杂。而且,使用Verilog描述的电路,一般最终都需要转换出实物,而同样的逻辑门,在不同的实现工艺上成本也会不同。因此,利用门级电路的结构直接对一个模块进行描述时,可能就显得不够灵活。

为了解决这些问题我们可以用比较直观的行为级描述进行电路的设计。使用行为级描述设计电路时,我们主要描述电路输入信号和输出信号间的逻辑关系,关注电路“干什么”而不是“怎么做”。低层次内部结构和实现细节等的考虑,以及将其转化为物理电路的过程,都由有关软件自动完成。其中这一转化过程就叫综合(synthesis)。

值得注意的是,Verilog的行为级描述并不意味着我们可以“为所欲为”。正如上文所说,任何电路设计最终都要着眼于最终的实现。综合工具的能力是有限的,并不是所有的结构都可以被有效的转换成真实的电路结构。因此在编写代码时,我们也要注重自己编写的代码的可综合性,了解自己代码对应的真实电路。

行为级描述的方法一般有两种:1. 利用连续赋值语句 assign描述电路。2. 利用initial结构、always结构和过程控制语句描述电路。

连续赋值语句 ASSIGN

一种很重要的行为级描述就是连续赋值语句,其常见形式为:

assign signal = expression

其中signal必须是wire型数据,而expression则是由数据和运算符组成的表达式

assign语句的作用是将右侧表达式的值持续性的赋给左侧的信号,一般用于描述一个信号是如何由其他信号生成的。所谓持续性,指的是当右侧表达式中变量的发生变化时,左侧信号的值也会随之变化。

assign语句非常适合简单的组合逻辑的描述,经常与三目运算符配合使用。一般来说,assign语句综合出来的电路是右侧表达式化简后所对应的逻辑门组合。

过程控制语句与有关结构

一个电路的输出,可以由输入信号决定(此时为纯粹的组合逻辑电路),也可以由输入信号电路当前的状态决定(此时电路一般为时序电路)。我们可以把电路的当前状态(如果有)和电路的输出抽象为一些变量。通过描述不同条件下对这些变量的变化规律来描述电路,这就是利用过程控制语句与有关结构进行的行为级描述。

上文所述的变量,其实就是Verilog中的reg类型数据。要注意的是,reg类型数据只是一个变量,用途是方便我们的描述,并不一定对应一个真实电路中的寄存器。综合工具在综合时,会通过对整体结构的分析,来判断电路具体如何实现。

利用过程控制语句与有关结构进行的行为级描述时,我们要解决两个主要问题:

  1. 如何将变量和模块的输出建立起关系。
  2. 如何描述不同情况下各变量的变化规律
变量和模块输出间的关系

一般可以采用两种方法将变量和模块的输出建立起联系:

  1. 采用assign语句,将变量的值赋给输出信号(此时输出信号为wire型)
  2. 直接将output端口声明为reg型
变量变化规律的描述

我们采用过程控制语句对变量的变化进行描述。过程控制语句与我们学习过的C语言有一定相似,主要包括阻塞/非阻塞赋值语句、if/case等条件语句以及各种循环语句。

过程控制语句不能直接存在于模块内,一般只能在initial或always结构中出现 (还可以出现在任务和函数中,但是我们的实验基本上不会涉及) 。一个模块中可以包含多个initial或always结构。多个initial或always结构中的语句会同时执行。

两种基本结构和语句块
initial结构

initial结构,形式为initial 语句(块),从仿真0时刻开始执行其中的语句。在整个仿真过程中只执行一次,一般用于初始化某些变量的值。

always结构

always结构,形式有为always@(敏感条件列表) 语句(块),从仿真0时刻开始执行。

敏感条件列表一般由多个敏感条件之间用or连接形成。always条件语句在敏感条件列表中有任一条件满足时被触发。

敏感条件主要分为两种:边沿敏感和电平敏感,一般不应混用。边沿敏感条件的格式为posedge/negedge 信号名,表明信号在处于上升沿/下降沿的时候会执行结构中的语句,一般用于时序逻辑的描述。电平敏感条件的格式为信号名,表明该信号发生改变(注意不是为真)时会执行结构中的语句,一般用于组合逻辑的描述。

使用always结构描述组合逻辑时,敏感条件列表可以简写为@(*),表示语句中所涉及到变量的任何变化都会引起该always结构的执行。

可省去@(敏感条件列表),此时整个结构无条件执行,一次执行完毕后,立即重新开始执行。一般配合延迟语句在testbench的编写中使用,例:always #5 clk = ~clk;

语句块

块语句的作用是将多条语句合并成一组,使它们像一条语句那样。在使用上一节提到的各种控制语句或者要使用always/initial过程块时,如果要执行多条语句,就可以使用块语句,这就类似于C语言中大括号里的语句。

块语句有两种:顺序块和并行块。顺序块的关键字是begin - end,并行块的关键字是fork - join,关键字位于块语句的起始位置和结束位置,相当于C语言中的左大括号和右大括号。块语句也可以嵌套。

从名字就可以看出这两种块的特点,顺序块中的语句是顺序执行的,而并行块中的语句是并行执行的。在我们的实验中只会用到顺序块,顺序块有以下特点:

  1. 顺序块中的语句是一条接一条按顺序执行的,只有前面的语句执行完成之后才能执行后面的语句,除非是带有内嵌延迟控制的非阻塞赋值语句。

  2. 如果语句包括延迟,那么延迟总是相对于前面那条语句执行完成的仿真时间的。

配合语句块使用,两种基本结构的格式就变为:

initial begin
// more procedural statements
end

always@(/*敏感条件列表*/) begin
// more procedural statements
end
常见的过程控制语句

i. if语句

if (expression1)
	statement1;
else if (expression2)
	statement2;
else
	statement3;

ii. while语句

while (expression)
	statement;

iii. for语句

for (expression1; expression2; expression3)
	statement;

其中,每个statement可能是阻塞赋值语句或非阻塞赋值语句。他们在仿真时具有不同的行为。具体影响可以参考Verilog语法部分的讲解,实现原理可以参考高级特性的层次化事件队列。

过程控制语句描述的一般用法

always块实现组合逻辑的一般格式为:

always@(*) begin
// 采用阻塞赋值,描述电路的变化规律
end

always块实现时序逻辑的一般格式为:

always@(posedge clk) begin
// 采用非阻塞赋值,描述电路的变化规律
end

注意:不要混用阻塞和非阻塞赋值,尽量只在组合逻辑中使用阻塞赋值,只在时序逻辑中使用非阻塞赋值。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算机组成与设计实训是一门重要的课程,它主要通过使用 Verilog HDL 来进行计算机硬件系统设计。在这门课程中,我们将学习计算机体系结构、硬件描述语言和计算机硬件的设计原理。 Verilog HDL 是一种硬件描述语言,它可以用于描述数字电路和系统。在这门课上,我们将学习如何使用 Verilog HDL 来描述计算机的各个模块和组件,比如控制单元、算术逻辑单元、寄存器等。我们将学习如何使用 Verilog HDL 来描述这些模块的功能、结构和延迟等属性。 在课程中,我们将了解计算机系统的各个层次,从逻辑门到寄存器传输级别,再到处理器级别和存储器层次。我们将学习如何使用 Verilog HDL 来设计这些层次的各个模块和组件,并将它们整合在一起以构建完整的计算机硬件系统。 通过实践,我们将能够更深入地理解计算机硬件系统的工作原理和设计方法。我们将学习如何进行硬件仿真和验证,以确保我们设计的系统能够正常工作。我们还将学习如何进行性能优化,以提高计算机硬件系统的效率和性能。 在计算机组成与设计实训中,我们将不断进行实践和项目,以锻炼我们的设计和解决问题的能力。这门课程将为我们以后的学习和职业发展奠定坚实的基础,使我们能够在计算机硬件系统设计领域有更多的发展机会。 ### 回答2: 计算机组成与设计实训是一门通过使用Verilog HDL(硬件描述语言)来设计和实现计算机硬件系统的课程。Verilog HDL是一种专门用于设计硬件的高级编程语言,它可以描述和模拟数字系统的行为和结构。 在这门课程中,我们将学习如何使用Verilog HDL来设计和实现各种计算机硬件组件,包括中央处理器(CPU)、存储器、数据通路和控制单元等。我们将学习如何使用Verilog语言描述这些硬件组件的行为和结构,并通过仿真和测试来验证设计的正确性。 在实训过程中,我们将进行一系列的实验,从简单到复杂逐步深入,以逐步掌握计算机硬件系统的设计原理和方法。我们将编写Verilog代码来实现各种硬件组件,并通过仿真工具进行功能验证和调试。 在完成实验后,我们将能够独立设计和实现一个完整的计算机硬件系统。我们将了解计算机硬件系统的工作原理、各个组件的功能和相互之间的协作方式。我们还将学习硬件描述语言的基本知识和技巧,以便能够进行更复杂的硬件系统设计。 设计实训将提供一个实践的平台,让我们能够将理论知识应用到实际中去。通过手动编写Verilog代码并进行仿真测试,我们将深入理解计算机硬件系统的设计过程和实现细节。这将为我们今后从事电子工程和计算机科学等相关领域打下坚实的基础。 ### 回答3: 计算机组成与设计实训是一门课程,目的是通过使用Verilog HDL(硬件描述语言)玩转计算机硬件系统设计。在这门课上,我们学习如何使用Verilog HDL创建和实现计算机的各个组件,包括处理器、存储器、控制单元等。这种实践性的学习方式使我们能够深入了解计算机硬件系统的工作原理和设计方法。 在实训过程中,我们首先需要了解计算机硬件系统的基本原理,包括二进制表示法、逻辑门电路、布尔代数等。然后,我们开始学习Verilog HDL的语法和基本概念,掌握如何使用Verilog HDL来描述和模拟硬件电路。 在掌握了Verilog HDL的基本知识后,我们开始进行计算机硬件系统的设计。这包括设计和实现各个组件,如寄存器、加法器、ALU(算术逻辑单元)、控制单元等。我们使用Verilog HDL编写代码,并通过仿真验证我们的设计是否符合预期。 实训过程中,我们还会进行实际的硬件实现。通过使用FPGA(现场可编程门阵列)等硬件平台,我们能够将我们的设计加载到真实的硬件上,并进行功能验证和性能测试。 通过这门实训课程,我们不仅能够深入了解计算机硬件系统的设计原理和方法,还能够提高我们的编程能力和问题解决能力。同时,我们也能够更好地理解计算机系统的工作原理,为以后的学习和研究打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值