EDA课后习题答案-课件_第1页
EDA课后习题答案-课件_第2页
EDA课后习题答案-课件_第3页
EDA课后习题答案-课件_第4页
EDA课后习题答案-课件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章

EDA技术概述1PPT课件1-1EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?答:EDA技术进行电子系统设计的最后目标,是完成专用集成电路(ASIC)的设计和实现,FPGA是实现这一途径的主流器件,它们的特点是直接面向用户、具有极大的灵活性和通用性、使用方便、硬件测试和实现快捷、开发效率高、成本低、上市时间短、技术维护简单、工作可靠性好等。FPGA的应用是EDA技术有机融合软硬件电子设计技术、ASIC设计,以及对自动设计与自动实现最典型的诠释。

1-2与软件描述语言相比,Verilog有什么特点?答:Verilog语言的特点:(1)按照设计目的,Verilog程序可以划分为面向仿真和面向综合两类,而可综合的Verilog程序能分别面向FPGA和ASIC开发两个领域。(2)能在多个层次上对所设计的系统加以描述,从开关级、门级、寄存器传输级(RTL)至行为级都可以加以描述。(3)灵活多样的电路描述风格。2PPT课件1-3什么是综合?有哪些类型?综合在电子设计自动化中的地位是什么?答:综合(Synthesis),就其字面含义应该是:把抽象的实体结合成单个或统一的实体。在电子设计领域,综合的概念可以表述为:将用行为和功能层次表达的电子系统转换为低层次的、便于具体实现的模块组合装配的过程。(1)从自然语言转换到Verilog语言算法表述,即自然语言综合。

(2)从算法表述转换到寄存器传输级(RegisterTransportLevel,RTL)表述,即从行为域到结构域的综合,也称行为综合。(3)从RTL级表述转换到逻辑门(包括触发器)的表述,即逻辑综合。(4)从逻辑门表述转换到版图级表述(如ASIC设计),或转换到FPGA的配置网表文件,可称为版图综合或结构综合。综合器就是能够将一种设计表述形式自动向另一种设计表述形式转换的计算机程序,或协助进行手工转换的程序。它可以将高层次的表述转化为低层次的表述,可以将行为域转化为结构域,可以将高一级抽象的电路描述(如算法级)转化为低一级的电路描述(如门级),并可以用某种特定的“技术”(如CMOS)实现。

3PPT课件1-4IP在EDA技术的应用和发展中的意义是什么?答:IP就是知识产权核或知识产权模块的意思,在EDA技术和开发中具有十分重要的地位。美国著名的Dataquest咨询公司将半导体产业的IP定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”。IP分软IP、固IP和硬IP。

软IP是用HDL等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。

固IP是完成了综合的功能块。它有较大的设计深度,以网表文件的形式提交客户使用。

硬IP提供设计的最终阶段产品——掩模。随着设计深度的提高,后续工序所需要做的事情就越少;当然,灵活性也就越小。不同的客户可以根据自己的需要订购不同的IP产品。4PPT课件1-5叙述EDA的FPGA/CPLD设计流程,以及涉及的EDA工具及其在整个流程中的作用。答:完整地了解利用EDA技术进行设计开发的流程对于正确地选择和使用EDA软件、优化设计项目、提高设计效率十分有益。一个完整的、典型的EDA设计流程既是自顶向下设计方法的具体实施途径,也是EDA工具软件本身的组成结构。

基于EDA的FPGA/CPLD开发流程

5PPT课件1-6OLMC有何功能?说明GAL是怎样实现可编程组合电路与时序电路的。答:输出逻辑宏单元(OutputLogicMacroCell,OLMC),此结构使得PLD器件在组合逻辑和时序逻辑中的可编程或可重构性能都成为可能。GAL16V8型号的器件,它包含了8个逻辑宏单元OLMC,每一个OLMC可实现时序电路可编程,而其左侧的电路结构是与阵列可编程的组合逻辑可编程结构。

GAL的OLMC单元设有多种组态,可配置成专用组合输出、专用输入、组合输出双向口、寄存器输出、寄存器输出双向口等,为逻辑电路设计提供了极大的灵活性。

GAL的输出逻辑宏单元OLMC中含有4个多路选择器,通过不同的选择方式可以产生多种输出结构,分别属于3种模式,一旦确定了某种模式,所有的OLMC都将工作在同一种模式下。图1-14即为其中一种输出模式对应的结构。图1-14寄存器输出结构6PPT课件1-7什么是基于乘积项的可编程逻辑结构?什么是基于查找表的可编程逻辑结构?答:基于乘积项的可编程结构,即由可编程的“与”阵列和固定的“或”阵列组成。

可编程的查找表(LookUpTable,LUT)结构,LUT是可编程的最小逻辑构成单元。大部分FPGA采用基于SRAM(静态随机存储器)的查找表逻辑形成结构,即用SRAM来构成逻辑函数发生器。一个N输入LUT可以实现N个输入变量的任何逻辑功能,如N输入“与”、N输入“异或”等。1-8就逻辑宏单元而言,GAL中的OLMC、CPLD中的LC、FPGA中的LUT和LE的含义和结构特点是什么?它们都有何异同点?答:输出逻辑宏单元(OutputLogicMacroCell,OLMC),此结构使得PLD器件在组合逻辑和时序逻辑中的可编程或可重构性能都成为可能。

MAX7000S系列器件包含32~256个逻辑宏单元(LogicCell,LC),其单个逻辑宏单元结构如图1-15所示。

LUT即可编程的查找表(LookUpTable,LUT)结构,是可编程的最小逻辑构成单元。大部分FPGA采用基于SRAM(静态随机存储器)的查找表逻辑形成结构,即用SRAM来构成逻辑函数发生器。一个N输入LUT可以实现N个输入变量的任何逻辑功能,如N输入“与”、N输入“异或”等。

LE是CycloneIIIFPGA器件的最基本的可编程单元,LE主要由一个4输入的查找表LUT、进位链逻辑、寄存器链逻辑和一个可编程的寄存器构成。

7PPT课件1-9为什么说用逻辑门作为衡量逻辑资源大小的最小单元不准确。答:专业习惯是将OLMC及左侧的可编程与阵列合称一个逻辑宏单元,即标志PLD器件逻辑资源的最小单元,由此可以认为GAL16V8器件的逻辑资源是8个逻辑宏单元,而目前最大的FPGA的逻辑资源达数十万个逻辑宏单元。也有将逻辑门的数量作为衡量逻辑器件资源的最小单元,如某CPLD的资源约2000门等,但此类划分方法误差较大。

1-10标志FPGA/CPLD逻辑资源的逻辑宏单元包含哪些结构?答:CPLD(MAX7000S)系列中的

逻辑宏单元由3个功能块组成:逻辑阵列、乘积项选择矩阵和可编程寄存器,它们可以被单独地配置为时序逻辑和组合逻辑工作方式。其中逻辑阵列实现组合逻辑,可以给每个逻辑宏单元提供5个乘积项。“乘积项选择矩阵”分配这些乘积项作为到“或门”和“异或门”的主要逻辑输入,以实现组合逻辑函数;或者把这些乘积项作为宏单元中寄存器的辅助输入:清零(Clear)、置位(Preset)、时钟(Clock)和时钟使能控制(ClockEnable)。FPGA(CycloneIII)器件的可编程资源主要来自逻辑阵列块LAB,而每个LAB都由多个逻辑宏单元(LogicElement,LE)构成。LE是CycloneIIIFPGA器件的最基本的可编程单元,LE主要由一个4输入的查找表LUT、进位链逻辑、寄存器链逻辑和一个可编程的寄存器构成。

8PPT课件1-11解释编程与配置这两个概念。答:基于电可擦除存储单元的EEPROM或Flash技术。CPLD一般使用此技术进行编程(Progam)。CPLD被编程后改变了电可擦除存储单元中的信息,掉电后可保持。

Altera的FPGA器件有两类配置下载方式:主动配置方式和被动配置方式。主动配置方式由FPGA器件引导配置操作过程,它控制着外部存储器和初始化过程,而被动配置方式则由外部计算机或控制器控制配置过程。对于SRAM型FPGA,在实用中必须利用专用配置器件来存储编程信息,以便在上电后,该器件能对FPGA自动编程配置。

EPC器件中的EPC2型号的器件是采用Flash存储工艺制作的具有可多次编程特性的配置器件。

9PPT课件第2章

Verilog程序结构与数据类型10PPT课件习题

2-1wire型变量与reg型变量的什么本质区别,它们可用于什么类型语句中?答:书上P33~35《第2章Verilog程序结构与数据类型

线网(wire)表示硬件单元之间的连接。就像在真实的电路中一样,线网由其连接器件的输出端连续驱动。线网不能储存值,而且它必须受到驱动器(例如门或连续赋值语句,assign)的驱动。如果没有驱动源,则线网的值为z。

reg寄存器用来表示存储元件,它保持原有的数值,通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg类型数据的默认初始值为不定值x。定义为Net型的变量常被综合为硬件电路中的物理连接,其特点是输出的值紧跟输入值的变化而变化,因此常被用来表示以assign关键词引导的组合电路描述。

Register类型变量必须放在过程语句中,如initial、always引导的语句中,通过过程赋值语句(包括阻塞与非阻塞语句)完成赋值操作,换言之,在always和initial等过程结构内被赋值的变量必须定义成Variable类型。11PPT课件2-3以下的标符是否合法?XOR、or、74LS04、4Badder、\ASC、$SMD、A5加法器、BEGIN答:正确XOR、BEGIN、\ASC(还有一类标识符,即转义标识符(EscapedIdentifiers)。转义标识符以斜杠“\”开头,以空白符结尾,可以包含任何字符。例如,\8031、\-@Gt。)不正确74LS04、4Badder(起始为数字),A5加法器,or(关键词),$SMD(任何标识符必须以英文字母或下划线开头。)2-2下列数字的表述方式是否正确?4’b-1101、6’sb010_1101、5’d82、’bx01、6’b10x101、10’d7、’HzD、-3’b101答:正确’bx01、6’b10x101、10’d7、’HzD、-3’b101不正确4’b-1101、6’sb010_1101、5’d82(1010010)注意:关键字都是小写的。如reg是关键字,但REG不属于关键字,所以可用作普通标识符。12PPT课件2-4定义以下的变量和常数。(1)定义一个名字为Q1的8位reg总线。(reg[7:0]Q1;)(2)定义一个名字为asg的整数。(

integenasg;)(3)定义参数s1=3’b010,s2=3’b110,s3=3’b011。

parameters1=3’b010,s2=3’b110,s3=3’b011;(4)定义一个容量(深度)为128,字长为32位的存储器,存储器名是MEM32。(reg[31:0]mem[127:0]MEM32;)(5)定义一个名字为WBUS的16位wire总线。(wire[15:0]WBUS)2-5设“reg[3:0]A;reg[7:0]B;reg[15:0]C;”,(1)执行赋值语句A<=8B’11011010后,A实际获得赋值是多少?(1010)(2)执行赋值语句A<=8H’3456后,A实际获得赋值是多少?(6、0110)(3)执行赋值语句C<=9和C<=-9,C分别获得赋值是什么?什么类型?

C<=9(0000_0000_0000_1001)无符整数、C<=-9(1111_1111_1111_0111)有符整数(4)执行赋值语句B<=38后,B获得赋值是什么?(0010_0110)什么类型?无符整数13PPT课件第3章

Verilog行为语句

14PPT课件3-1讨论always和initial异同点。答:Verilog支持两种过程语句,即always和initial语句。通常情况下initial语句不可综合,主要用于仿真程序中的初始化;always语句属于可综合语句,主要引导行为描述语句,使用频度非常高。在一个Verilog程序模块(module)中,always和initial语句被使用的次数没有限制,即它们本身属于并行执行特征的语句。过程语句的基本格式如下:

always@(敏感信号及敏感信号列表或表达式)

包括块语句的各类行为语句

Verilog的过程语句除always外,还有initial过程语句。其基本格式如下:

initialbegin语句1;语句2;...end

与always结构不同,initial过程语句结构中没有敏感信号列表,即不带触发条件。initial过程中的块语句沿时间方向轴只执行一次。(always总是可以自动执行无限次)

initial语句通常用于仿真模块中对激励矢量的描述,或用于给寄存器变量赋初值,而在实际电路中,赋初值是没有意义的。因此这是面向模拟仿真的过程语句,通常不能被综合工具所接受,或在综合时被忽略,但却可以对存储器加载初始化文件,这是可综合行为。15PPT课件习题

3-2阻塞赋值和非阻塞赋值有何区别?在应用中应注意哪些问题?

答:Verilog中,用普通等号“=”作为阻塞式赋值语句的赋值符号,如y=b。

Verilog中,用普通等号“<=”作为非阻塞式赋值语句的赋值符号,如y<=b。阻塞式赋值的特点是,一旦执行完当前的赋值语句,赋值目标变量y即刻获得来自等号右侧表达式的计算值。如果在一个块语句中含有多条阻塞式赋值语句,则当执行到其中某条赋值语句时,其他语句将禁止执行,即如同被阻塞了一样。非阻塞式赋值的特点是必须在块语句执行结束时才整体完成赋值操作。非阻塞的含义可以理解为在执行当前语句时,对于块中的其他语句的执行情况一律不加限制,不加阻塞。这也可以理解为,在begin_end块中的所有赋值语句都可以并行运行。16PPT课件3-3用Verilog设计一个3-8译码器,要求分别用case语句和if_else语句。比较这两种方式。17PPT课件

3-3用Verilog设计一个3-8译码器,要求分别用case语句和if_else语句。比较这两种方式。moduledecoder3_8(G1,Y,G2,A,G3);inputG1,G2,G3;wireG1,G2,G3;input[2:0]A;wire[2:0]A;output[7:0]Y;reg[7:0]Y;regs;always@(A,G1,G2,G3)begins<=G2|G3;if(G1==0)Y<=8'b1111_1111;elseif(s)Y<=8'b1111_1111;elsecase(A)3'b000:Y=8'b11111110; 3'b001:Y=8'b11111101; 3'b010:Y=8'b11111011; 3'b011:Y=8'b11110111; 3'b100:Y=8'b11101111; 3'b101:Y=8'b11011111; 3'b110:Y=8'b10111111; 3'b111:Y=8'b01111111; default:Y=8'bxxxxxxxx;endcaseendendmodule18PPT课件

3-3用Verilog设计一个3-8译码器,要求分别用case语句和if_else语句。比较这两种方式。moduledecoder3_8(G1,Y,G2,A,G3);inputG1,G2,G3;wireG1,G2,G3;input[2:0]A;wire[2:0]A;output[7:0]Y;reg[7:0]Y;regs;always@(A,G1,G2,G3)begins<=G2|G3;if(G1==0)Y<=8'b1111_1111;elseif(s)Y<=8'b1111_1111; elsebeginif(A==3'b000)Y=8'b11111110; elseif(A==3'b001)Y=8'b11111101; elseif(A==3'b010)Y=8'b11111011; elseif(A==3'b011)Y=8'b11110111; elseif(A==3'b100)Y=8'b11101111; elseif(A==3'b101)Y=8'b11011111; elseif(A==3'b110)Y=8'b10111111; elseif(A==3'b111)Y=8'b01111111; elseY=8'bxxxxxxxx;endendendmodule19PPT课件//测试文件,??部分请根据被测试的文件修改modulestimulus;reg[2:0]A;wire[7:0]Y;regG1,G2,G3;decoder3_8DUT(G1,Y,G2,A,G3);initialbegin$monitor($time,"A=%d,G1=%b,G2=%b,G3=%b,Y=%d\n",A,G1,G2,G3,Y);endinitialbeginG1=1;G2=1;G3=1;A=0;#10G2=0;G1=0;#10G2=0;G1=1;#10G2=1;G1=0;G3=0;#10G1=0;G1=1;G3=1;#10G1=0;G1=0;G3=0;#10G1=1;G2=0;G3=0;#50A=0;#50A=1;#50A=2;#50A=3;#50A=4;#50A=5;#50A=6;#50A=7;#50$finish;endendmodule20PPT课件习题

3-4图3-26所示的是双2选1多路选择器构成的电路MUXK。对于其中MUX21A,当s=0和s=1时,分别有y=a和y=b。试在一个模块结构中用两个过程来表达此电路。答:参考实验1图3-26含2选1多路选择器的模块moduleMUXK(a1,a2,a3,s0,s1,outy);inputa1,a2,a3,s0,s1;outputouty;wireouty;wiretmp;mux21au1(.a(a2),.b(a3),.s(s0),.y(tmp));mux21au2(.a(a1),.b(tmp),.s(s1),.y(outy));endmodule21PPT课件习题3-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。moduleMUX41a(A,B,C,D,S0,S1,S2,S3,Y);outputY;//定义Y为输出信号

inputA,B,C,D;inputS0,S1,S2,S3;regY;//定义输出端口信号Y为寄存器型变量

always@(A,B,C,S0,S1,S2,S3)begin//块语句起始

if(S0==0)Y=A;//当S0==0成立,即(S0==0)=1时,Y=A;

elseif(S1==0)Y=B;//当(S1==1)为真,则Y=B;

elseif(S2==0)Y=C;//当(S2==2)为真,则Y=C;

elseif(S3==0)Y=D;//当(S3==3)为真,即Y=D;

end//块语句结束endmodule22PPT课件3-6利用if语句设计一个全加器。sum<=0;cout<=1;endelseif(ain

==0&&bin==0&&cin

==1)beginsum<=1;cout<=0;endelseif(ain

==1&&bin==0&&cin

==1)beginsum<=0;cout<=1;endelseif(ain

==0&&bin==1&&cin

==1)beginsum<=0;cout<=1;endelsebeginsum<=1;cout<=1;endendendmodule

`timescale1ns/1psmodulef_adder(ain,bin,cin,cout,sum);inputain,bin,cin;wireain,bin,cin;outputcout,sum;regcout,sum;always@(ainorbinorcin)beginif(ain

==0&&bin==0&&cin==0)beginsum<=0;cout<=0;endelseif(ain

==1&&bin==0&&cin==0)beginsum<=1;cout<=0;endelseif(ain

==0&&bin==1&&cin

==0)beginsum<=1;cout<=0;endelseif(ain

==1&&bin==1&&cin==0)begin

23PPT课件真值表为ainbincinsumcout00000001100101001101100101010111001111113-6利用if语句设计一个全加器。`timescale1ns/1psmodulef_adder(ain,bin,cin,cout,sum);inputain,bin,cin;wireain,bin,cin;outputcout,sum;regcout,sum;always@(ainorbinorcin)beginif(ain==0&&bin==0&&cin==0)beginsum<=0;cout<=0;endelseif((~ain&(bin^cin))|(ain&~bin&~cin))beginsum<=1;cout<=0;endelseif((ain&(bin^cin))|(~ain&bin&cin))beginsum<=0;cout<=1;endelsebeginsum<=1;cout<=1;endendendmodule

24PPT课件习题3-7设计一个求补码的程序,输入数据是一个有符号的8位二进制数。//设计一个求补码的程序,输入数据是一个有符号的8位二进制数moduleBinary_complement(a,b);//二进制数补码input[7:0]a;output[7:0]b;integeri;reg[7:0]d;reg[6:0]c;always@(a)beginif(a[7]==1)beginfor(i=0;i<7;i=i+1)c[i]=!a[i];d[7:0]={a[7],(c[6:0]+7'd1)};endelsed[7:0]=a[7:0];endassignb[7:0]=d[7:0];endmodule25PPT课件`timescale1ns/1ns`include"Binary_complement.v"modulestimulus;//测试模块的名字reg[7:0]a;wire[7:0]b;Binary_complementmycount(a,b);//调用测试对象initialbegin//激励信号定义

a=1;#10a=2;#10a=-8'd8;#10a=127;#10a=255;#10$finish;end//定义结果显示格式initial$monitor($time,"a=%b,b=%b\n",a,b);endmodule

3-7设计一个求补码的程序,输入数据是一个有符号的8位二进制数。26PPT课件3-8设计一个格雷码至二进制数的转换器。

格雷码二进制000000001001011010010011110100111101101110100111

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(GrayCode),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。格雷码转二进制码格雷码转换为二进制码:从左边第二位起,将每一位与左边一位解码后的值“异或”,作为该解码后的值(最左边的一位依然不变)。27PPT课件3-8设计一个格雷码至二进制数的转换器。

modulegry2bin(Gry,Bin);parameterlength=3;output[length-1:0]Bin;input[length-1:0]Gry;reg[length-1:0]Bin;integeri;always@(Gry)beginBin[length-1]=Gry[length-1];for(i=length-2;i>=0;i=i-1)Bin[i]=Bin[i+1]^Gry[i];endendmodule`timescale1ns/1ns`include"gry2bin.v"modulestimulus;reg[2:0]Gry;wire[2:0]Bin;gry2binmycount(Gry,Bin);initialbeginGry=3'b000;#10Gry=3'b001;#10Gry=3'b011;#10Gry=3'b010;#10Gry=3'b110;#10Gry=3'b111;#10Gry=3'b101;#10Gry=3'b100;#10$finish;endinitial$monitor($time,"Gry=%b,Bin=%b\n",Gry,Bin);endmodule28PPT课件习题

3-9用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制数中含1的数量。

moduleStatistics8(sum,A);output[3:0]sum;input[7:0]A;reg[3:0]sum;integeri;always@(A)beginsum=0;for(i=0;i<=8;i=i+1)//for语句

if(A[i])sum=sum+1;elsesum=sum;endendmodulemoduleStatistics8(sum,A);parameterS=4;output[3:0]sum;input[7:0]A;reg[3:0]sum;reg[2*S:1]TA;integeri;always@(A)beginTA=A;sum=0;repeat(2*S)beginif(TA[1])sum=sum+1;TA=TA>>1;endendendmodulerepeat循环语句for循环语句29PPT课件moduleStatistics8(sum,A);parameterS=8;output[3:0]sum;input[7:0]A;reg[S:1]AT;reg[3:0]sum;reg[S:0]CT;always@(A)beginAT={{S{1'b0}},A};sum=0;CT=S;while(CT>0)beginif(AT[1])sum=sum+1;elsesum=sum;beginCT=CT-1;AT=AT>>1;endendendendmodule

3-9用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制数中含1的数量。

while循环语句30PPT课件modulevoter7(pass,vote);outputpass;input[6:0]vote;reg[2:0]sum;integeri;regpass;always@(vote)beginsum=0;for(i=0;i<=6;i=i+1)//for语句

if(vote[i])sum=sum+1;if(sum[2])pass=1;//若超过4人赞成,则pass=1elsepass=0;endendmodule习题3-10用循环语句设计一个7人投票表决器。31PPT课件习题3-11Verilog设计一个4位4输入最大数值检测电路。//Verilog设计一个4位4输入最大数值检测电路moduleMaximum_value_detection(Mostlarge,a,b,c,d);//4位4输入最大数值检测电路output[3:0]Mostlarge;input[3:0]a,b,c,d;wire[3:0]sum1,sum2,sum3;assignsum1=(a>b)?a:b;assignsum2=(c>d)?c:d;assignMostlarge=(sum1>sum2)?sum1:sum2;endmodule32PPT课件3-12利用case语句设计一个加、减、乘、除4功能算术逻辑单元ALU,输入的两个操用数都是4位进制数;输入的操作码是两位二进制数;输出结果是8位二进制数。为了便于记忆和调试,建议把操作码用parameter定义为参数。moduleMUX_ALU(A,B,S,Y);output[7:0]Y;//定义Y为输出信号

input[3:0]A,B;input[1:0]S;

parameteradd=2'b00,reduce=2'b01,multiply=2'b10,Trad=2'b11;reg[7:0]Y;//定义输出端口信号Y为寄存器型变量

always@(A,B,S)begincase(S)2'b00:Y=A+B;2'b01:Y=A-B;2'b10:Y=A*B;2'b11:Y=A/B;default:Y=8'bxxxxxxxx;endcaseendendmodule33PPT课件modulestimulus;reg[3:0]A,B;reg[1:0]S;wire[7:0]Y;MUX_ALUr1(A,B,S,Y);initialbeginA=4'b0100;B=4'b0010;S=2'b00;#10S=2'b01;#10S=2'b10;#10S=2'b11;#10$finish; //????end//????initial$monitor($time,"S=%b,A=%b,B=%b,Y=%d,",S,A,B,Y);endmodule3-12利用case语句设计一个加、减、乘、除4功能算术逻辑单元ALU,输入的两个操用数都是4位进制数;输入的操作码是两位二进制数;输出结果是8位二进制数。为了便于记忆和调试,建议把操作码用parameter定义为参数。34PPT课件习题

3-13在Verilog设计中,给时序电路清零(复位)有两种不同方法,它们是什么,如何实现?答:同步清零、异步清零,在过程语句敏感信号表中的逻辑表述posedgeCLK用于指明正向跳变,或negedge用于指明负向跳变实现

3-14哪一种复位方法必须将复位信号放在敏感信号表中?给出这两种电路的Verilog描述。答:异步复位必须将复位信号放在敏感信号表中。同步清零:always@(posedgeCLK) //CLK上升沿启动

Q<=D; //当CLK有升沿时D被锁入Q异步清零:always@(posedgeCLKornegedgeRST)begin//块开始

if(!RST)Q<=0; //如果RST=0条件成立,Q被清0 elseif(EN)Q<=D; //在CLK上升沿处,EN=1,则执行赋值语句

end //块结束35PPT课件3-15举例说明,为什么使用条件叙述不完整的条件句能导致产生时序模块的综合结果?答:●当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语句和过程.对于这种语言现象,Velilog综合器解释为,对于不满足条件,跳过赋值语句Q<=D不予执行,即意味着保持Q的原值不变(保持前一次满足if条件时Q被更新的值)。对于数字电路来说,当输入改变后试图保持一个值不变,就意味着使用具有存储功能的元件,就是必须引进时序元件来保存Q中的原值,直到满足if语句的判断条件后才能更新Q中的值,于是便产生了时序元件。

moduleLATCH1(CLK,D,Q);outputQ;inputCLK,D;regQ;always@(DorCLK)if(CLK)Q<=D; //当CLK=1时D被锁入Qendmodule

36PPT课件3-16把例3-11中的RST和CLK在敏感信号中具有同样的地位,从语句上解答,为什么综合的结果是CLK成为边沿触发时钟信号,而RST成为电平控制信号?moduleDFF2(CLK,D,Q,RST,EN);//含异步清0和时钟同步使能的D触发器

outputQ;inputCLK,D,RST,EN;regQ;always@(posedgeCLKornegedgeRST)begin//块开始

if(!RST)Q<=0; //如果RST=0条件成立,Q被清0elseif(EN)Q<=D; //在CLK上升沿处,EN=1,则执行赋值语句

end //块结束endmodule【例3-11】37PPT课件

这里所谓的“异步”并非时序的异步,而是指独立于时钟控制的复位控制端,即在任何时刻,只要RST=0或1(“时钟异步”)

,此D触发器的输出端即刻被清0,与时钟的状态无关。而时钟使能EN的功能是,只有当ED=1时,时钟上升沿才有效。(“时钟同步”)

例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@(posedgeCLKornegedgeRST)begin//块开始

if(!RST)Q<=0; //如果RST=0条件成立,Q被清0 elseif(EN)Q<=D;38PPT课件3-17把例3-17改成一异步清0,同步时钟使能和异步数据加载型8位二进制加法计数器。【例3-17】含有异步清0同步时钟使能和同步数据加载功能的十进制计数器moduleCNT10(CLK,RST,EN,LOAD,COUT,DOUT,DATA);inputCLK,RST,EN,LOAD;//时钟,时钟使能,复位,数据加载控制信号输入口input[3:0]DATA;//4位并行加载数据输入口output[3:0]DOUT;//计数数据输出信号口outputCOUT;//计数进位输出regCOUT;

reg[3:0]Q1;assignDOUT=Q1;//将内部寄存器的计数结果输出至DOUTalways@(posedgeCLKornegedgeRSTornegedgeLOAD)//时序过程

begin if(!RST)Q1<=0;//RST=0时,对内部寄存器单元异步清0

elseif(!LOAD)Q1<=DATA;//当LOAD=0,异步向内部寄存器加载数据

elseif(EN)begin//同步使能EN=1,则允许加载或计数

if(Q1<9)Q1<=Q1+1;//当Q1小于9时,允许累加

elseQ1<=4'b0000;//否则一个时钟后清0返回初值 endendalways@(Q1)//组合电路之过程

if(Q1==4'h9)COUT=1'b1;//当Q1=1001时,COUT输出进位标志1 elseCOUT=1'b0;

//否则,输出进位标志0endmodule

39PPT课件3-18把例3-17改成一个16位二进制加法计数器,将其进位输出COUT与异步数据加载控制LOAD连在一起,构成一个自动加载型16位二进制加法计数器,也即一个16位可控的分频器,给出其Verilog表述,并说明工作原理。设输入频率fi=4MHz,输出频率fo=516.5±Hz(允许误差±0.1Hz),16位加载数值=?moduleCNT10(CLK,RST,EN,LOAD,COUT,DOUT,DATA);inputCLK,RST,EN,LOAD;//时钟,时钟使能,复位,数据加载控制信号输入口input[15:0]DATA;//4位并行加载数据输入口output[15:0]DOUT;//计数数据输出信号口outputCOUT;//计数进位输出reg[15:0]Q1;regCOUT;assignDOUT=Q1;//将内部寄存器的计数结果输出至DOUTalways@(posedgeCLKornegedgeRST)begin//时序过程

if(!RST)Q1<=0;//RST=0时,对内部寄存器单元异步清0 elseif(EN)begin//同步使能EN=1,则允许加载或计数

if(!LOAD)Q1<=DATA;//当LOAD=1,向内部寄存器加载数据

elseif(Q1<16'hFFFF)Q1<=Q1+1;//当Q1小于9时,允许累加

elseQ1<=16'h0000;//否则一个时钟后清0返回初值

endendalways@(Q1)//组合电路之过程

if(Q1==16'hFFFF)COUT=1'b1;//当Q1=1001时,COUT输出进位标志1 elseCOUT=1'b0;//否则,输出进位标志0endmodule【例3-17】//含有异步清0同步时钟使能和同步数据加载功能的十进制计数(FFFF-7744=E1BF)40PPT课件moduleCNT10(CLK,RST,EN,COUT,DOUT);//LOAD,,LOAD,DATAinputCLK,RST,EN;//时钟,时钟使能,复位,数据加载控制信号输入口//input[3:0]DATA;//4位并行加载数据输入口output[3:0]DOUT;//计数数据输出信号口outputCOUT;//计数进位输出regCOUT;reg[3:0]Q1;parameterDATA=5;assignDOUT=Q1;//将内部寄存器的计数结果输出至DOUTassignLOAD=~COUT;always@(pose

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论