《EDA课后习题答案》由会员分享,可在线阅读,更多相关《EDA课后习题答案(48页珍藏版)》请在金锄头文库上搜索。
1、EDAEDA课后习题答案课后习题答案1-1 EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?答:EDA技术进行电子系统设计的最后目标,是完成专用集成电路(ASIC)的设计和实现,FPGA是实现这一途径的主流器件,它们的特点是直接面向它们的特点是直接面向它们的特点是直接面向它们的特点是直接面向用户、具有极大的灵活性和通用性、使用方便、硬件测试和实现快捷、开发用户、具有极大的灵活性和通用性、使用方便、硬件测试和实现快捷、开发用户、具有极大的灵活性和通用性、使用方便、硬件测试和实现快捷、开发用户、具有极大的灵活性和通用性、使用方便、硬件测试和实现快捷、开发效率高
2、、成本低、上市时间短、技术维护简单、工作可靠性好等效率高、成本低、上市时间短、技术维护简单、工作可靠性好等效率高、成本低、上市时间短、技术维护简单、工作可靠性好等效率高、成本低、上市时间短、技术维护简单、工作可靠性好等。FPGA的应用是EDA技术有机融合软硬件电子设计技术、ASIC设计,以及对自动设计与自动实现最典型的诠释。 1-2 与软件描述语言相比,Verilog有什么特点?答:Verilog语言的特点:(1)按照设计目的,Verilog程序可以划分为面向仿真和面向综合两类,而可综合的Verilog程序能分别面向FPGA和ASIC开发两个领域。(2)能在多个层次上对所设计的系统加以描述,从
3、开关级、门级、寄存器传输级(RTL)至行为级都可以加以描述。(3)灵活多样的电路描述风格。1-3 什么是综合?有哪些类型?综合在电子设计自动化中的地位是什么?答:综合(Synthesis),就其字面含义应该是:把抽象的实体结合成单个或统一的实体。 在电子设计领域,综合的概念可以表述为:将用行为和功能层次表达的电子系统转换为低层次的、便于具体实现的模块组合装配的过程。(1)从自然语言转换到Verilog语言算法表述,即自然语言综合。 (2)从算法表述转换到寄存器传输级(Register Transport Level,RTL)表述,即从行为域到结构域的综合,也称行为综合。(3)从RTL级表述转换
4、到逻辑门(包括触发器)的表述,即逻辑综合。(4)从逻辑门表述转换到版图级表述(如ASIC设计),或转换到FPGA的配置网表文件,可称为版图综合或结构综合。 综合器就是能够将一种设计表述形式自动向另一种设计表述形式转换的计算机程序,或协助进行手工转换的程序。它可以将高层次的表述转化为低层次的表述,可以将行为域转化为结构域,可以将高一级抽象的电路描述(如算法级)转化为低一级的电路描述(如门级),并可以用某种特定的“技术”(如CMOS)实现。 1-4 IP在EDA技术的应用和发展中的意义是什么?答:IP就是知识产权核或知识产权模块的意思,在EDA技术和开发中具有十分重要的地位。美国著名的Dataqu
5、est咨询公司将半导体产业的IP定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”。IP分软IP、固IP和硬IP。 软软IPIP是用是用HDLHDL等硬件描述语言描述的功能块,但是并不涉等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。及用什么具体电路元件实现这些功能。固固IPIP是完成了综合的功能块。它有较大的设计深度,以网是完成了综合的功能块。它有较大的设计深度,以网表文件的形式提交客户使用。表文件的形式提交客户使用。 硬硬IPIP提供设计的最终阶段产品提供设计的最终阶段产品掩模。随着设计深度的掩模。随着设计深度的提高,后续工序所需要做的事情就越少;当然,灵
6、活性也就越小。提高,后续工序所需要做的事情就越少;当然,灵活性也就越小。不同的客户可以根据自己的需要订购不同的不同的客户可以根据自己的需要订购不同的IPIP产品。产品。 1-5 叙述EDA的FPGA/CPLD设计流程,以及涉及的EDA工具及其在整个流程中的作用。答:完整地了解利用EDA技术进行设计开发的流程对于正确地选择和使用EDA软件、优化设计项目、提高设计效率十分有益。一个完整的、典型的EDA设计流程既是自顶向下设计方法的具体实施途径,也是EDA工具软件本身的组成结构。 基于EDA的FPGA/CPLD开发流程 1-6 OLMC有何功能?说明GAL是怎样实现可编程组合电路与时序电路的。答:输
7、出逻辑宏单元(Output Logic Macro Cell,OLMC),此结构使得PLD器件在组合逻辑和时序逻辑中的可编程或可重构性能都成为可能。GAL16V8型号的器件,它包含了8个逻辑宏单元OLMC,每一个OLMC可实现时序电路可编程,而其左侧的电路结构是与阵列可编程的组合逻辑可编程结构。 GAL的的OLMC单元设有多种组态,可配置成专用组合输出、专用输入、单元设有多种组态,可配置成专用组合输出、专用输入、组合输出双向口、寄存器输出、寄存器输出双向口等,为逻辑电路设计提供组合输出双向口、寄存器输出、寄存器输出双向口等,为逻辑电路设计提供了极大的灵活性。了极大的灵活性。GAL的输出逻辑宏单
8、元的输出逻辑宏单元OLMC中含有中含有4个多路选择器,通过不同的选个多路选择器,通过不同的选择方式可以产生多种输出结构,分别属于择方式可以产生多种输出结构,分别属于3种模式,一旦确定了某种模式,所种模式,一旦确定了某种模式,所有的有的OLMC都将工作在同一种模式下。图都将工作在同一种模式下。图1-14即为其中一种输出模式对应的即为其中一种输出模式对应的结构。结构。图图1-14 寄存器输出结构寄存器输出结构 1-7 什么是基于乘积项的可编程逻辑结构?什么是基于查找表的可编程逻辑结构?答:基于乘积项的可编程结构,即由可编程的“与”阵列和固定的“或”阵列组成。 可编程的查找表(可编程的查找表(Loo
9、k Up Table,LUT)结构,)结构,LUT是可编程的最小逻是可编程的最小逻辑构成单元。大部分辑构成单元。大部分FPGA采用基于采用基于SRAM(静态随机存储器)的查找表逻辑(静态随机存储器)的查找表逻辑形成结构,形成结构,即用即用即用即用SRAMSRAM来构成逻辑函数发生器来构成逻辑函数发生器来构成逻辑函数发生器来构成逻辑函数发生器。一个。一个N输入输入LUT可以实现可以实现N个个输入变量的任何逻辑功能,如输入变量的任何逻辑功能,如N输入输入“与与”、N输入输入“异或异或”等。等。 1-8 就逻辑宏单元而言,GAL中的OLMC、CPLD中的LC、FPGA中的LUT和LE的含义和结构特点
10、是什么?它们都有何异同点?答:输出逻辑宏单元(Output Logic Macro Cell,OLMC),此结构使得PLD器件在组合逻辑和时序逻辑中的可编程或可重构性能都成为可能。 MAX7000S系列器件包含32256个逻辑宏单元(Logic Cell,LC),其单个逻辑宏单元结构如图1-15所示。 LUT即可编程的查找表(Look Up Table,LUT)结构,是可编程的最小逻辑构成单元。大部分FPGA采用基于SRAM(静态随机存储器)的查找表逻辑形成结构,即用SRAM来构成逻辑函数发生器。一个N输入LUT可以实现N个输入变量的任何逻辑功能,如N输入“与”、N输入“异或”等。 LE是Cy
11、clone III FPGA器件的最基本的可编程单元,LE主要由一个4输入的查找表LUT、进位链逻辑、寄存器链逻辑和一个可编程的寄存器构成。 1-9 为什么说用逻辑门作为衡量逻辑资源大小的最小单元不准确。答:专业习惯是将OLMC及左侧的可编程与阵列合称一个逻辑宏单元,即标志PLD器件逻辑资源的最小单元,由此可以认为GAL16V8器件的逻辑资源是8个逻辑宏单元,而目前最大的FPGA的逻辑资源达数十万个逻辑宏单元。也有将逻辑门的数量作为衡量逻辑器件资源的最小单元,如某CPLD的资源约2000门等,但此类划分方法误差较大。 1-10 标志FPGA/CPLD逻辑资源的逻辑宏单元包含哪些结构?逻辑宏单元
12、包含哪些结构?逻辑宏单元包含哪些结构?逻辑宏单元包含哪些结构?答: CPLD( MAX7000S)系列中的 逻辑宏单元由3个功能块组成:逻辑阵列、乘积项选择矩阵和可编程寄存器,它们可以被单独地配置为时序逻辑和组合逻辑工作方式。其中逻辑阵列实现组合逻辑,可以给每个逻辑宏单元提供5个乘积项。“乘积项选择矩阵”分配这些乘积项作为到“或门”和“异或门”的主要逻辑输入,以实现组合逻辑函数;或者把这些乘积项作为宏单元中寄存器的辅助输入:清零(Clear)、置位(Preset)、时钟(Clock)和时钟使能控制(Clock Enable)。FPGA(Cyclone III)器件的可编程资源主要来自逻辑阵列块
13、LAB,而每个LAB都由多个逻辑宏单元(Logic Element,LE)构成。LE是Cyclone III FPGA器件的最基本的可编程单元,LE主要由一个4输入的查找表LUT、进位链逻辑、寄存器链逻辑和一个可编程的寄存器构成。 1-11 解释编程与配置这两个概念。答:基于电可擦除存储单元的EEPROM或Flash技术。CPLD一般使用此技术进行编程(Progam)。CPLD被编程后改变了电可擦除存储单元中的信息,掉电后可保持。 AlteraAltera的的FPGAFPGA器件有两类配置下载方式:主动配置方式和被动配器件有两类配置下载方式:主动配置方式和被动配置方式。主动配置方式由置方式。主
14、动配置方式由FPGAFPGA器件引导配置操作过程,它控制着外器件引导配置操作过程,它控制着外部存储器和初始化过程,而被动配置方式则由外部计算机或控制器部存储器和初始化过程,而被动配置方式则由外部计算机或控制器控制配置过程。控制配置过程。 对于SRAM型FPGA,在实用中必须利用专用配置器件来存储编程信息,以便在上电后,该器件能对FPGA自动编程配置。 EPC器件中的EPC2型号的器件是采用Flash存储工艺制作的具有可多次编程特性的配置器件。 第第2章章 Verilog程序结构与数据类型程序结构与数据类型 习习 题题 2-1 wire2-1 wire型变量与型变量与型变量与型变量与regreg
15、型变量的什么本质区别,它们可用于什么类型语句中?型变量的什么本质区别,它们可用于什么类型语句中?型变量的什么本质区别,它们可用于什么类型语句中?型变量的什么本质区别,它们可用于什么类型语句中?答:书上答:书上P3335第第2章章 Verilog程序结构与数据类型程序结构与数据类型 线网线网(wire)表示硬件单元之间的连接。就像在真实的电路中一样,线网由其表示硬件单元之间的连接。就像在真实的电路中一样,线网由其连接器件的输出端连续驱动。线网不能储存值,而且它必须受到驱动器连接器件的输出端连续驱动。线网不能储存值,而且它必须受到驱动器(例如门例如门或连续赋值语句,或连续赋值语句,assign)的
16、驱动。如果没有驱动源,则线网的值为的驱动。如果没有驱动源,则线网的值为z。 reg寄存器用来表示存储元件,它保持原有的数值,通过赋值语句可以改变寄存器用来表示存储元件,它保持原有的数值,通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。寄存器储存的值,其作用与改变触发器储存的值相当。reg类型数据的默认初始类型数据的默认初始值为不定值值为不定值x。 定义为定义为Net型的变量常被综合为硬件电路中的物理连接,其特点是输出的值型的变量常被综合为硬件电路中的物理连接,其特点是输出的值紧跟输入值的变化而变化,因此常被用来表示以紧跟输入值的变化而变化,因此常被用来表示以assign关键
17、词引导的组合电路描关键词引导的组合电路描述。述。 Register类型变量必须放在过程语句中,如类型变量必须放在过程语句中,如initial、always引导的语句中,引导的语句中,通过过程赋值语句通过过程赋值语句(包括阻塞与非阻塞语句包括阻塞与非阻塞语句)完成赋值操作,换言之,在完成赋值操作,换言之,在always和和initial等过程结构内被赋值的变量必须定义成等过程结构内被赋值的变量必须定义成Variable类型。类型。 2-3 2-3 以下的标符是否合法?以下的标符是否合法?XORXOR、oror、74LS0474LS04、4Badder4Badder、ASCASC、$SMD$SMD
18、、A5A5加法器、加法器、BEGINBEGIN答:正确答:正确XORXOR、 BEGIN BEGIN 、 ASC( ASC(还有一类标识符,即转义标识符还有一类标识符,即转义标识符(Escaped (Escaped Identifiers)Identifiers)。转义标识符以斜杠。转义标识符以斜杠“”“”开头,以空白符结尾,可以包含任何字开头,以空白符结尾,可以包含任何字符。例如,符。例如,80318031、-Gt-Gt。 ) )不正确不正确74LS0474LS04、4Badder(4Badder(起始为数字起始为数字起始为数字起始为数字) ), A5 A5加法器,加法器, or( or(关
19、键词关键词) ), $SMD( $SMD(任何任何任何任何标识符必须以英文字母或下划线开头标识符必须以英文字母或下划线开头标识符必须以英文字母或下划线开头标识符必须以英文字母或下划线开头。) )2-2 2-2 下列数字的表述方式是否正确?下列数字的表述方式是否正确?4b-11014b-1101、6sb010_11016sb010_1101、5d825d82、bx01bx01、6b10x1016b10x101、10d710d7、HzDHzD、- -3b1013b101答:正确答:正确bx01bx01、6b10x1016b10x101、10d710d7、HzDHzD、-3b101-3b101不正确
20、不正确4b4b- - - -11011101、6sb6sb0 0 0 010_110110_1101、5d82(5d82(1010010101001010100101010010) )注意注意注意注意: : : :关键字关键字关键字关键字都是小写的。如都是小写的。如都是小写的。如都是小写的。如regregregreg是关键字,但是关键字,但是关键字,但是关键字,但REGREGREGREG不属于关键字,所以可用作普不属于关键字,所以可用作普不属于关键字,所以可用作普不属于关键字,所以可用作普通标识符。通标识符。通标识符。通标识符。2-4 定义以下的变量和常数。定义以下的变量和常数。(1) 定义一
21、个名字为定义一个名字为Q1的的8位位reg总线。总线。 (reg7:0 Q1;)(reg7:0 Q1;)(2) 定义一个名字为定义一个名字为asg的整数。的整数。 ( ( ( ( integen asg; )integen asg; )integen asg; )integen asg; )(3) 定义参数定义参数s1=3b010,s2=3b110,s3=3b011。 parameter s1=3b010parameter s1=3b010parameter s1=3b010parameter s1=3b010,s2=3b110s2=3b110s2=3b110s2=3b110,s3=3b011
22、;s3=3b011;s3=3b011;s3=3b011;(4) 定义一个容量定义一个容量(深度深度)为为128,字长为,字长为32位的存储器,存储器名是位的存储器,存储器名是MEM32。(reg31:0 mem 127:0 MEM32;)(reg31:0 mem 127:0 MEM32;)(5) 定义一个名字为定义一个名字为WBUS的的16位位wire总线。总线。 (wire15:0 WBUS)(wire15:0 WBUS)2-5 2-5 设设“reg3:0A; reg7:0B; reg15:0C;”,“reg3:0A; reg7:0B; reg15:0C;”,(1) (1) 执行赋值语句执行
23、赋值语句A=8B11011010A=8B11011010后,后,A A实际获得赋值是多少?实际获得赋值是多少?(1010)(1010)(1010)(1010)(2) (2) 执行赋值语句执行赋值语句A=8H3456A=8H3456后,后,A A实际获得赋值是多少?实际获得赋值是多少? (6(6(6(6、0110)0110)0110)0110)(3) (3) 执行赋值语句执行赋值语句C=9C=9和和C=-9C=-9,C C分别获得赋值是什么?什么类型?分别获得赋值是什么?什么类型? C=9C=9 (0000_0000_0000_1001) (0000_0000_0000_1001) (0000_
24、0000_0000_1001) (0000_0000_0000_1001)无符整数、无符整数、无符整数、无符整数、 C=-9C=-9 (1111_1111_1111_0111) (1111_1111_1111_0111) (1111_1111_1111_0111) (1111_1111_1111_0111)有符有符有符有符整数整数整数整数(4) (4) 执行赋值语句执行赋值语句B=38B=38后,后,B B获得赋值是什么?获得赋值是什么? (0010_0110)(0010_0110)(0010_0110)(0010_0110)什么类型?什么类型?无符无符无符无符整数整数整数整数第第3章章 Ve
25、rilog行为语句行为语句 3-1 3-1 讨论讨论alwaysalways和和initialinitial异同点。异同点。答:答: Verilog支持两种过程语句,即支持两种过程语句,即always和和initial语句。语句。通常情况下initial语句语句不可综合,主要用于仿真程序中的初始化; always语句属于语句属于可综合语句,主要引导行为描述语句,使用频度非常高。在一个语句,主要引导行为描述语句,使用频度非常高。在一个Verilog程序程序模块模块(module)中,中, always和和initial语句被使用的次数没有限制,即它们本语句被使用的次数没有限制,即它们本身属于并行
26、执行特征的语句。身属于并行执行特征的语句。 过程语句的基本格式如下:过程语句的基本格式如下: always(敏感信号及敏感信号列表或表达式敏感信号及敏感信号列表或表达式) 包括块语句的各类行为语句包括块语句的各类行为语句 Verilog Verilog的过程语句除的过程语句除alwaysalways外,还有外,还有initialinitial过程语句。其基本格式过程语句。其基本格式如下:如下: initial initial begin begin语句语句1 1;语句;语句2 2;endend 与与alwaysalways结构不同,结构不同,initialinitial过程语句结构中没有敏感信
27、号列表,即不过程语句结构中没有敏感信号列表,即不带触发条件。带触发条件。initialinitial过程中的块语句沿时间方向轴只执行一次。过程中的块语句沿时间方向轴只执行一次。(always(always总是可以自动执行无限次总是可以自动执行无限次) ) initial语句通常用于仿真模块中对激励矢量的描述,或用于给寄存器变量赋初值,而在实际电路中,赋初值是没有意义的。因此这是面向模拟仿真的过程语句,通常不能被综合工具所接受,或在综合时被忽略,但却可以对存储器加载初始化文件,这是可综合行为。习习 题题 3-2 3-2 阻塞赋值和非阻塞赋值有何区别?阻塞赋值和非阻塞赋值有何区别?在应用中应注意哪
28、些问题?在应用中应注意哪些问题? 答:答:VerilogVerilog中,用普通等号中,用普通等号“=”“=”作为阻塞式赋值语句的赋值符号,如作为阻塞式赋值语句的赋值符号,如y=by=b。 Verilog Verilog中,用普通等号中,用普通等号“=”“=”作为非阻塞式赋值语句的赋值符号,如作为非阻塞式赋值语句的赋值符号,如y=by=b。 阻塞式赋值的特点是,一旦执行完当前的赋值语句,赋值目标变量阻塞式赋值的特点是,一旦执行完当前的赋值语句,赋值目标变量y y即刻即刻获得来自等号右侧表达式的计算值。如果在一个块语句中含有多条阻塞式赋值获得来自等号右侧表达式的计算值。如果在一个块语句中含有多条
29、阻塞式赋值语句,则当执行到其中某条赋值语句时,其他语句将禁止执行,即如同被阻塞语句,则当执行到其中某条赋值语句时,其他语句将禁止执行,即如同被阻塞了一样。了一样。 非阻塞式赋值的特点是必须在块语句执行结束时才整体完成赋值操作。非非阻塞式赋值的特点是必须在块语句执行结束时才整体完成赋值操作。非阻塞的含义可以理解为在执行当前语句时,对于块中的其他语句的执行情况一阻塞的含义可以理解为在执行当前语句时,对于块中的其他语句的执行情况一律不加限制,不加阻塞。这也可以理解为,在律不加限制,不加阻塞。这也可以理解为,在begin_endbegin_end块中的所有赋值语句都块中的所有赋值语句都可以并行运行。可
30、以并行运行。 3-3 用用Verilog设计一个设计一个3-8译码器,要求分别用译码器,要求分别用case语句和语句和if_else语句。比语句。比较这两种方式。较这两种方式。 3-3 用用Verilog设计一个设计一个3-8译码器,要求分别用译码器,要求分别用case语句和语句和if_else语句。比较这两种语句。比较这两种方式。方式。module decoder3_8 ( G1 ,Y ,G2 ,A ,G3 );input G1, G2, G3;wire G1, G2, G3;input 2:0 A ;wire 2:0 A ;output 7:0 Y ;reg 7:0 Y ;reg s;al
31、ways ( A ,G1, G2, G3) begin s = G2 | G3 ; if (G1 = 0) Y = 8b1111_1111; else if (s) Y = 8b1111_1111; else case ( A ) 3b000: Y = 8b11111110; 3b001: Y = 8b11111101; 3b010: Y = 8b11111011; 3b011: Y = 8b11110111; 3b100: Y = 8b11101111; 3b101: Y = 8b11011111; 3b110: Y = 8b10111111; 3b111: Y = 8b01111111;
32、default:Y = 8bxxxxxxxx; endcase end endmodule 3-3 用用Verilog设计一个设计一个3-8译码器,要求分别用译码器,要求分别用case语句和语句和if_else语句。比较这两种语句。比较这两种方式。方式。module decoder3_8 ( G1 ,Y ,G2 ,A ,G3 ); input G1, G2, G3; wire G1, G2, G3; input 2:0 A ; wire 2:0 A ; output 7:0 Y ; reg 7:0 Y ; reg s; always ( A ,G1, G2, G3) begin s = G2
33、| G3 ; if (G1 = 0) Y = 8b1111_1111; else if (s) Y = 8b1111_1111; else begin if (A=3b000)Y=8b11111110; else if (A=3b001)Y=8b11111101; else if (A=3b010)Y=8b11111011; else if (A=3b011)Y=8b11110111; else if (A=3b100)Y=8b11101111; else if (A=3b101)Y=8b11011111; else if (A=3b110)Y=8b10111111; else if (A=3
34、b111)Y=8b01111111; else Y=8bxxxxxxxx;end endendmodule/测试文件,测试文件,?部分请根据被测试的文件修改部分请根据被测试的文件修改module stimulus; reg 2:0A ; wire7:0Y ; reg G1 ,G2 ,G3; decoder3_8 DUT ( G1 ,Y ,G2 ,A ,G3 ); initial begin $monitor($time,A=%d,G1=%b,G2=%b, G3=%b,Y= %dn,A, G1, G2, G3, Y); endinitial begin G1=1 ;G2=1 ;G3=1;A=0;
35、 #10 G2=0;G1=0; #10 G2=0;G1=1;#10 G2=1;G1=0;G3=0; #10 G1=0;G1=1;G3=1; #10 G1=0;G1=0;G3=0; #10 G1=1;G2=0;G3=0; #50 A= 0; #50 A= 1; #50 A= 2; #50 A= 3; #50 A= 4; #50 A= 5; #50 A= 6; #50 A= 7; #50 $finish; endendmodule习习 题题 3-4图图3-26所示的是双所示的是双2选选1多路选择器构成的电路多路选择器构成的电路MUXK。对于其中。对于其中MUX21A,当,当s=0和和s=1时,分别
36、有时,分别有y=a和和y=b。试在一个模块结构中用两个过程来表达此电路。试在一个模块结构中用两个过程来表达此电路。答:参考实验答:参考实验1图图3-26 含含2选选1多路选择器的模块多路选择器的模块module MUXK (a1, a2, a3, s0, s1, outy); input a1, a2, a3, s0, s1; output outy; wire outy; wire tmp; mux21a u1 (.a(a2),.b(a3),.s(s0),.y(tmp); mux21a u2 (.a (a1),.b (tmp),.s(s1),.y(outy);endmodule习习 题题3-
37、5 给出一个给出一个4选选1多路选择器的多路选择器的Verilog描述。选通控制端有描述。选通控制端有4个输入:个输入:S0、S1、S2、S3。当且仅当。当且仅当S0=0时:时:Y=A;S1=0时:时:Y=B;S2=0时:时:Y=C;S3=0时:时:Y=D。module MUX41a (A,B,C,D,S0,S1,S2,S3,Y); output Y; /定义定义Y为输出信号为输出信号 input A, B, C, D; input S0,S1,S2,S3; reg Y; /定义输出端口信号定义输出端口信号Y为寄存器型变量为寄存器型变量 always (A,B,C,S0,S1,S2,S3 )b
38、egin /块语句起始块语句起始 if (S0=0)Y=A; /当当S0 =0成立,即成立,即(S0 =0)=1时,时,Y=A; else if (S1=0)Y=B; /当当(S1 =1)为真,则为真,则Y=B; else if (S2=0)Y=C; /当当(S2 =2)为真,则为真,则Y=C; else if (S3=0) Y=D; /当当(S3 =3)为真,即为真,即Y=D; end /块语句结束块语句结束endmodule3-6 3-6 3-6 3-6 利用利用利用利用ifififif语句设计一个全加器。语句设计一个全加器。语句设计一个全加器。语句设计一个全加器。 sum = 0; co
39、ut = 1; end else if (ain = 0 & bin = 0 & cin = 1 ) begin sum = 1; cout = 0; end else if (ain = 1 & bin = 0 & cin = 1 ) begin sum = 0; cout = 1; end else if (ain = 0 & bin = 1 & cin = 1 ) begin sum = 0; cout = 1; end else begin sum = 1; cout = 1; end end endmodule timescale 1 ns / 1 ps module f_adder
40、 ( ain,bin,cin,cout,sum); input ain,bin,cin; wire ain,bin,cin; output cout,sum; reg cout,sum; always (ain or bin or cin) begin if (ain = 0 & bin = 0 & cin = 0 ) begin sum = 0; cout = 0; end else if (ain = 1 & bin = 0 & cin = 0 ) begin sum = 1; cout = 0; end else if (ain = 0 & bin = 1 & cin = 0 ) beg
41、in sum = 1; cout = 0; end else if (ain =1 & bin = 1 & cin = 0 ) begin 真值表为ainbincinsumcout00000001100101001101100101010111001111113-6 3-6 3-6 3-6 利用利用利用利用ifififif语句设计一个全加器。语句设计一个全加器。语句设计一个全加器。语句设计一个全加器。timescale 1 ns / 1 ps module f_adder ( ain,bin,cin,cout,sum); input ain,bin,cin; wire ain,bin,cin;
42、 output cout,sum; reg cout,sum; always (ain or bin or cin) begin if (ain = 0 & bin = 0 & cin = 0 ) begin sum = 0;cout = 0;end else if (ain&(bincin)|(ain&bin&cin) begin sum = 1;cout = 0;end else if (ain&(bincin)|(ain&bin&cin) begin sum =0 ;cout =1 ;end else begin sum = 1;cout = 1;end end endmodule 习习
43、 题题3-7 3-7 设计一个求补码的程序,输入数据是一个有符号的设计一个求补码的程序,输入数据是一个有符号的8 8位二进制数。位二进制数。/设计一个求补码的程序,输入数据是一个有符号的设计一个求补码的程序,输入数据是一个有符号的8 8位二进制数位二进制数module Binary_complement(a,b); /module Binary_complement(a,b); /二进制数补码二进制数补码input 7:0 a;input 7:0 a;output 7:0 b;output 7:0 b;integer i;integer i;reg 7:0d;reg 7:0d;reg 6:0c
44、;reg 6:0c;always (a) always (a) beginbegin if(a7=1) if(a7=1) begin begin for(i=0;i7;i=i+1)ci=!ai; for(i=0;i=0;i=i- for(i=length-2;i=0;i=i- for(i=length-2;i=0;i=i- for(i=length-2;i=0;i=i-1)1)1)1) Bini=Bini+1Gryi; Bini=Bini+1Gryi; Bini=Bini+1Gryi; Bini=Bini+1Gryi; end end end endendmoduleendmoduleendm
45、oduleendmoduletimescale 1ns/1ns include gry2bin.v module stimulus; reg2:0 Gry;wire2:0Bin;gry2bin mycount(Gry,Bin); initialbegin Gry=3b000;#10 Gry=3b001;#10 Gry=3b011;#10 Gry=3b010;#10 Gry=3b110;#10 Gry=3b111;#10 Gry=3b101;#10 Gry=3b100;#10 $finish; end initial $monitor($time,Gry=%b, Bin=%bn,Gry,Bin)
46、; endmodule 习习 题题 3-9 用不同循环语句分别设计一个逻辑电路模块,用以统计一用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制数中含位二进制数中含1的数的数量。量。 module Statistics8(sum,A);output3:0sum;input7:0 A;reg3:0 sum;integer i; always (A) begin sum=0; for(i=0;i1; end endendmodulerepeatrepeatrepeatrepeat循环语句循环语句循环语句循环语句forfor循环语句循环语句module Statistics8(sum,A)
47、; parameter S=8; output3:0sum; input7:0 A; regS:1 AT; reg3:0 sum; regS:0 CT; always (A) begin AT=S1b0,A; sum=0; CT=S; while(CT0) begin if(AT1)sum=sum+1;else sum=sum; begin CT= CT-1; AT=AT1; end end end endmodule 3-9 3-9 用不同循环语句分别设计一个逻辑电路模块,用以统计一用不同循环语句分别设计一个逻辑电路模块,用以统计一8 8位二进制数位二进制数中含中含1 1的数量。的数量。 w
48、hilewhilewhilewhile循环语句循环语句循环语句循环语句module module voter7(pass,vote);output output pass;inputinput6:0 vote;regreg2:0 sum;integer integer i; reg reg pass;always always (vote) begin begin sum=0; for for(i=0;ib)?a:b;assign sum2=(cd)?c:d;assign Mostlarge=(sum1sum2)?sum1:sum2;endmodule3-12 3-12 利用利用casecas
49、e语句设计一个加、减、乘、除语句设计一个加、减、乘、除4 4功能算术逻辑单元功能算术逻辑单元ALUALU,输入的,输入的两个操用数都是两个操用数都是4 4位进制数;输入的操作码是两位二进制数;输出结果是位进制数;输入的操作码是两位二进制数;输出结果是8 8位位二进制数。为了便于记忆和调试,建议把操作码用二进制数。为了便于记忆和调试,建议把操作码用parameterparameter定义为参数。定义为参数。 module MUX_ ALU (A,B,S,Y); output 7:0 Y; /定义定义Y为输出信号为输出信号 input 3:0 A, B; input 1:0 S; paramete
50、r add = 2b00, reduce = 2b01, multiply = 2b10, Trad = 2b11; reg 7:0Y; /定义输出端口信号定义输出端口信号Y为寄存器型变量为寄存器型变量 always (A,B,S ) begin case (S ) 2b00: Y = A+B; 2b01: Y = A-B; 2b10: Y = A*B; 2b11: Y = A/B; default: Y = 8bxxxxxxxx; endcase end endmodule module stimulus;reg 3:0A,B;reg 1:0S;wire7:0 Y;MUX_ALU r1(A,
51、B,S,Y);initialbeginA=4b0100;B=4b0010;S=2b00;#10 S=2b01;#10 S=2b10;#10 S=2b11;#10 $finish;/?end/?initial$monitor($time, S=%b, A=%b, B=%b,Y=%d, S, A, B,Y);endmodule3-12 3-12 利用利用casecase语句设计一个加、减、乘、除语句设计一个加、减、乘、除4 4功能算术逻辑单元功能算术逻辑单元ALUALU,输入的,输入的两个操用数都是两个操用数都是4 4位进制数;输入的操作码是两位二进制数;输出结果是位进制数;输入的操作码是两位二进
52、制数;输出结果是8 8位位二进制数。为了便于记忆和调试,建议把操作码用二进制数。为了便于记忆和调试,建议把操作码用parameterparameter定义为参数。定义为参数。 习习 题题 3-13 3-13 在在VerilogVerilog设计中,给时序电路清零(复位)有两种不同方法,它们设计中,给时序电路清零(复位)有两种不同方法,它们是什么,如何实现?是什么,如何实现?答:同步清零、异步清零,在过程语句敏感信号表中的逻辑表述答:同步清零、异步清零,在过程语句敏感信号表中的逻辑表述posedge CLKposedge CLK用用于指明正向跳变,或于指明正向跳变,或negedgenegedge
53、用于指明负向跳变实现用于指明负向跳变实现 3-14 3-14 哪一种复位方法必须将复位信号放在敏感信号表中?给出这两种电路的哪一种复位方法必须将复位信号放在敏感信号表中?给出这两种电路的VerilogVerilog描述。描述。答:异步复位必须将复位信号放在敏感信号表中。答:异步复位必须将复位信号放在敏感信号表中。同步清零:同步清零:同步清零:同步清零:always (posedge CLK) always (posedge CLK) /CLK/CLK上升沿启动上升沿启动 Q=D; Q=D; /当当CLKCLK有升沿时有升沿时D D被锁入被锁入Q Q异步清零:异步清零:异步清零:异步清零:alw
54、ays (posedge CLK or always (posedge CLK or negedge RSTnegedge RST) begin ) begin /块开始块开始 if(!RST)Q=0; if(!RST)Q=0; /如果如果RST=0RST=0条件成立,条件成立,Q Q被清被清0 0else if(EN) Q=D;else if(EN) Q=D;/在在CLKCLK上升沿处,上升沿处,EN=1EN=1,则执行赋值语句,则执行赋值语句endend /块结束块结束 3-15 举例说明,为什么使用条件叙述不完整的条件句能导致产生时序模块的综合结果?举例说明,为什么使用条件叙述不完整的条
55、件句能导致产生时序模块的综合结果?答:答: 当CLK发生了电平变化,但是从1变到0。这时无论D是否变化,都将启动过程去执行if语句;但此时CLK=0,无法执行if语句,从而无法执行赋值语句Q=D,于是Q只能保持原值不变(这就意味着需要在设计模块中引入存储元件)。 当CLK没有发生任何变化,且CLK一直为0,而敏感信号D发生了变化。这时也能启动过程,但由于CLK=0,无法执行if语句,从而也就无法执行赋值语句Q=D,导致Q只能保持原值(这也意味着需要在设计模块中引入存储元件)。 在以上两种情况中,由于if语句不满足条件,于是将跳过赋值表达式Q=D,不执行此赋值表达式而结束if语句和过程对于这种语
56、言现象,Velilog综合器解释为,对于不满足条件,跳过赋值语句Q=D不予执行,即意味着保持Q的原值不变(保持前一次满足if条件时Q被更新的值)。对于数字电路来说,当输入改变后试图保持一个值不变,就意味着使用具有存储功能的元件,就是必须引进时序元件来保存Q中的原值,直到满足if语句的判断条件后才能更新Q中的值,于是便产生了时序元件。 module LATCH1 (CLK, D, Q); output Q; input CLK, D; reg Q; always (D or CLK) if(CLK)Q=D; /当CLK=1时D被锁入Qendmodule 3-16 3-16 把例把例3-113-1
57、1中的中的RSTRST和和CLKCLK在敏感信号中具有同样的地位,在敏感信号中具有同样的地位,从语句上解答,为什么综合的结果是从语句上解答,为什么综合的结果是CLKCLK成为边沿触发时钟信号,成为边沿触发时钟信号,而而RSTRST成为电平控制信号?成为电平控制信号?module DFF2 (CLK, D, Q,RST,EN); /含异步清含异步清0和时钟同步使能的和时钟同步使能的D触发器触发器 output Q; input CLK, D,RST,EN; reg Q; always (posedge CLK or negedge RST) begin /块开始块开始 if(!RST)Q=0;
58、/如果如果RST=0条件成立,条件成立,Q被清被清0 else if(EN) Q=D; /在在CLK上升沿处,上升沿处,EN=1,则执行赋值语句,则执行赋值语句 end /块结束块结束endmodule【例【例3-11】 这里所谓的“异步异步异步异步”并非时序的异步,而是指独立于时钟控制的复位控制端,即在任何时刻,只要RST=0或1 (“(“(“(“时钟时钟时钟时钟异异异异步步步步”)”)”)”) ,此D触发器的输出端即刻被清0,与时钟的状态无关。而时钟使能EN的功能是,只有当当当当ED=1ED=1ED=1ED=1时,时钟上升沿才有效时,时钟上升沿才有效时,时钟上升沿才有效时,时钟上升沿才有效
59、。(“时钟时钟时钟时钟同步同步同步同步”) 例3-11程序执行过程是这样的,无论CLK是否有跳变,只要RST有一个下降沿动作,即刻启动过程执行if语句,即执行语句Q=0,对Q清0,然后跳出if语句。此后如果RST一直保存为0,则无论是否有CLK的边沿跳变信号,Q恒输出0,这就是RST的异步清0功能。如果RST一直为1,且CLK有一次上升沿,则必定执行赋值操作Q=D,从而更新Q值,否则将保持Q值不变(条件是RST=1)。 always (posedge CLK or negedge RST) begin /块开始块开始 if(!RST)Q=0; /如果如果RST=0条件成立,条件成立,Q被清被清
60、0else if(EN) Q=D;3-17 把例把例3-17改成一异步清改成一异步清0,同步时钟使能和异步数据加载型,同步时钟使能和异步数据加载型8位二进制位二进制加法计数器。加法计数器。【例3-17】含有异步清0同步时钟使能和同步数据加载功能的十进制计数器module CNT10(CLK, RST, EN,LOAD,COUT,DOUT,DATA);input CLK, RST, EN,LOAD; /时钟,时钟使能,复位,数据加载控制信号输入口input 3:0DATA; /4位并行加载数据输入口output 3:0 DOUT; /计数数据输出信号口output COUT; /计数进位输出re
61、g COUT; reg3:0 Q1;assign DOUT=Q1; /将内部寄存器的计数结果输出至DOUTalways (posedge CLK or negedge RST or negedge LOADor negedge LOADor negedge LOADor negedge LOAD) /时序过程 beginif(!RST)Q1=0; /RST=0时,对内部寄存器单元异步清0 else if(!LOAD)Q1=DATA;else if(!LOAD)Q1=DATA;else if(!LOAD)Q1=DATA;else if(!LOAD)Q1=DATA; /当LOAD=0,异步向内部寄
62、存器加载数据 else if(EN)beginelse if(EN)beginelse if(EN)beginelse if(EN)begin /同步使能EN=1,则允许加载或计数 if(Q19)Q1=Q1+1;if(Q19)Q1=Q1+1;if(Q19)Q1=Q1+1;if(Q19)Q1=Q1+1; /当Q1小于9时,允许累加 else Q1=4b0000;else Q1=4b0000;else Q1=4b0000;else Q1=4b0000; /否则一个时钟后清0返回初值end endalways (Q1) /组合电路之过程if(Q1=4h9)COUT=1b1; /当Q1=1001时,C
63、OUT输出进位标志1else COUT=1b0; /否则,输出进位标志0endmodule 3-18 把例把例3-17改成一个改成一个16位二进制加法计数器,将其进位输出位二进制加法计数器,将其进位输出COUT与异步数与异步数据加载控制据加载控制LOAD连在一起,构成一个自动加载型连在一起,构成一个自动加载型16位二进制加法计数器,也即位二进制加法计数器,也即一个一个16位可控的分频器,给出其位可控的分频器,给出其Verilog表述,并说明工作原理。设输入频率表述,并说明工作原理。设输入频率fi=4MHz,输出频率输出频率fo=516.5Hz(允许误差允许误差0.1Hz),16位加载数值位加载
64、数值=?module CNT10(CLK, RST, EN,LOAD,COUT,DOUT,DATA);module CNT10(CLK, RST, EN,LOAD,COUT,DOUT,DATA);input CLK, RST, EN,LOAD; input CLK, RST, EN,LOAD; /时钟,时钟使能,复位,数据加载控制信号输入口时钟,时钟使能,复位,数据加载控制信号输入口input input 15:015:0DATA; DATA; /4/4位并行加载数据输入口位并行加载数据输入口output output 15:015:0 DOUT; DOUT; /计数数据输出信号口计数数据输出
65、信号口output COUT; output COUT; /计数进位输出计数进位输出regreg15:0 Q1; Q1;reg COUT; reg COUT; assign DOUT=Q1; assign DOUT=Q1; /将内部寄存器的计数结果输出至将内部寄存器的计数结果输出至DOUTDOUTalways (posedge CLK or negedge RST) begin always (posedge CLK or negedge RST) begin /时序过程时序过程if(!RST)Q1=0; if(!RST)Q1=0; /RST=0/RST=0时,对内部寄存器单元异步清时,对内部
66、寄存器单元异步清0 0else if(EN)begin else if(EN)begin /同步使能同步使能EN=1EN=1,则允许加载或计数,则允许加载或计数if(!LOAD)Q1=DATA; if(!LOAD)Q1=DATA; /当当LOAD=1LOAD=1,向内部寄存器加载数据,向内部寄存器加载数据else if(Q1else if(Q116hFFFFFFFF)Q1=Q1+1; )Q1=Q1+1; /当当Q1Q1小于小于9 9时,允许累加时,允许累加else Q1=else Q1=1616h h0000; 0000; /否则一个时钟后清否则一个时钟后清0 0返回初值返回初值endende
67、ndendalways (Q1) always (Q1) /组合电路之过程组合电路之过程if(Q1=if(Q1=1616h hFFFFFFFF)COUT=1b1; )COUT=1b1; /当当Q1=1001Q1=1001时,时,COUTCOUT输出进位标志输出进位标志1 1else COUT=1b0; else COUT=1b0; /否则,输出进位标志否则,输出进位标志0 0endmoduleendmodule【例【例3-17】/含有异步清含有异步清0同步时钟使能和同步数据加载功能的十进制计数同步时钟使能和同步数据加载功能的十进制计数(FFFF-7744=E1BF)(FFFF-7744=E1B
68、F)(FFFF-7744=E1BF)(FFFF-7744=E1BF)module CNT10(CLK, RST, EN,COUT,DOUT);/module CNT10(CLK, RST, EN,COUT,DOUT);/LOAD,LOAD,DATALOAD,LOAD,DATALOAD,LOAD,DATALOAD,LOAD,DATAinput CLK, RST, EN;/input CLK, RST, EN;/时钟,时钟使能,复位,数据加载控制信号输入口时钟,时钟使能,复位,数据加载控制信号输入口/input 3:0DATA; /4/input 3:0DATA; /4位并行加载数据输入口位并行加
69、载数据输入口output 3:0 DOUT;/output 3:0 DOUT;/计数数据输出信号口计数数据输出信号口output COUT;/output COUT;/计数进位输出计数进位输出reg COUT;reg COUT;reg3:0 Q1;reg3:0 Q1;parameter DATA=5parameter DATA=5; ;assign DOUT=Q1;/assign DOUT=Q1;/将内部寄存器的计数结果输出至将内部寄存器的计数结果输出至DOUTDOUTassign LOAD=COUT;assign LOAD=COUT;always (posedge CLK or negedg
70、e RST) begin/always (posedge CLK or negedge RST) begin/时序过程时序过程if(!RST)Q1=0;/RST=0if(!RST)Q1=0;/RST=0时,对内部寄存器单元异步清时,对内部寄存器单元异步清0 0else if(EN)begin/else if(EN)begin/同步使能同步使能EN=1EN=1,则允许加载或计数,则允许加载或计数if(!LOAD)Q1=DATA;/if(!LOAD)Q1=DATA;/当当LOAD=1LOAD=1,向内部寄存器加载数据,向内部寄存器加载数据else if(Q14hf)Q1=Q1+1;/else if
71、(Q14hf)Q1=Q1+1;/当当Q1Q1小于小于9 9时,允许累加时,允许累加else Q1=4b0000;/else Q1=4b0000;/否则一个时钟后清否则一个时钟后清0 0返回初值返回初值endendendendalways (Q1)/always (Q1)/组合电路之过程组合电路之过程if(DOUT=4hf) COUT=1b1;/if(DOUT=4hf) COUT=1b1;/当当Q1=1001Q1=1001时,时,COUTCOUT输出进位标志输出进位标志1 1else COUT=1b0;/else COUT=1b0;/否则,输出进位标志否则,输出进位标志0 0endmodule
72、endmodule 3-19 3-19 分别给出图分别给出图3-273-27图图3-303-30的的VerilogVerilog描述,注意其中的描述,注意其中的D D触发器和锁存器的表述。对于图触发器和锁存器的表述。对于图3-293-29的电路,分别使用的电路,分别使用ifif语句和条件操作语句完成表述。语句和条件操作语句完成表述。图图3-27 RTL图图1图图3-28 RTL图图2图图3-29 RTL图图3图图3-30 RTL图图4图图3-27 RTL图图1module RTL5(D,EN,CLK,RST, Q1,Q); output Q1,Q;input D,EN,CLK,RST;reg
73、Q1,Q;always (posedge CLK or negedge RST ) begin if(!RST)Q=0;else if(EN) Q=D; Q1=(D&EN)|RST; end endmoduleCyclone IICyclone IICyclone IICyclone II系列可以,系列可以,系列可以,系列可以,M7000SM7000SM7000SM7000S不可以不可以不可以不可以3-19 3-19 分别给出图分别给出图3-273-27图图3-303-30的的VerilogVerilog描述,注意其中的描述,注意其中的D D触发器和锁存器的表述。对于图触发器和锁存器的表述。对
74、于图3-293-29的电路,分别使用的电路,分别使用ifif语句和条件操作语句完成表述。语句和条件操作语句完成表述。图图3-28 RTL图图2module RTL2(A, B, C, D,Y); output Y; input A, B, C, D; wire TP1,TP2; reg Y; /or(TP1,A,B); /*用门级电路可以*/ /and(TP2,C,D); assign TP1=A|B; /*用assign连续赋值语句也可以*/ assign TP2=C&D; always (TP1,TP2,A) begin if(TP1=1)Y=TP1TP2; else Y=A; end e
75、ndmoduleCyclone IICyclone IICyclone IICyclone II系列可以,系列可以,系列可以,系列可以,M7000SM7000SM7000SM7000S也可以也可以也可以也可以3-19 分别给出图3-27图3-30的Verilog描述,注意其中的D触发器和锁存器的表述。对于图3-29的电路,分别使用if语句和条件操作语句完成表述。 3-19 3-19 分别给出图分别给出图3-273-27图图3-303-30的的VerilogVerilog描述,注意其中的描述,注意其中的D D触发器和锁存器的表述。对于图触发器和锁存器的表述。对于图3-293-29的电路,分别使用
76、的电路,分别使用ifif语句和条件操作语句完成表述。语句和条件操作语句完成表述。3-29 RTL图图3module RTL6(CLK, D, Q,DOUT,RST); output Q,DOUT;input CLK, D,RST;reg Q,DOUT;always (posedge CLK) beginif(!RST)begin Q=D;end else Q=0;DOUT=DQDOUT=DQDOUT=DQDOUT=DQ; end endmoduleCyclone IICyclone IICyclone IICyclone II系列可以,系列可以,系列可以,系列可以,M7000SM7000SM7
77、000SM7000S也可以也可以也可以也可以图图3-30 RTL3-30 RTL图图4 4? ?module RTL4(D,EN,CLK,SET,RESET,Q); output Q; input D,EN,CLK,SET,RESET; reg Q; always (posedge CLK or posedge RESET or posedge SET) begin if(RESET=1) Q=0; else if(SET=1)Q=1; else if(EN=1)Q=D; else Q=Q; endendmoduleCyclone IICyclone IICyclone IICyclone II系列可以,系列可以,系列可以,系列可以,M7000SM7000SM7000SM7000S不可以不可以不可以不可以3-19 分别给出图3-27图3-30的Verilog描述,注意其中的D触发器和锁存器的表述。对于图3-29的电路,分别使用if语句和条件操作语句完成表述。 3-20 分别用任务和函数描述一个4选1多路选择器,以及全加器。3-21 用任务和循环语句设计一个8位移位相加的乘法器。