版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目1原理图法实现典型逻辑电路的设计思考与练习一、填空题1.目前国际上较大的FPGA器件制造公司有英特尔(Intel)和赛灵思(Xilinx)。2.FPGA的内部结构一般由6部分组成,分别是:可编程输入/输出单元、可编程逻辑单元、底层嵌入功能单元、嵌入式块RAM、布线资源和内嵌专用硬核。3.目前较为流行的HDL有VerilogHDL、VHDL等。4.QuartusPrime的仿真分为功能仿真(或RTL行为级仿真)和门级仿真(或时序仿真)两种。二、简答题1.说明LUT基本工作原理。答:LUT即查找表(LookUpTable,LUT),FPGA内部的组合逻辑功能是基于LUT方式实现的,查找表的本质是一种存储器,其物理结构是静态随机存储器(SRAM),逻辑电路的输出状态存储在SRAM中,每个存储单元都有唯一的地址编码,逻辑电路的输入信号作为SRAM的地址线,当输入信号变化时(即存储器的输入地址发生变化),存储器根据输入的地址编码将对应位置存储的数据送给输出。2.简要论述QuartusPrime的设计输入方式。答:QuartusPrime的设计输入主要有:VerilogHDL/VHDL硬件描述语言设计输入方式、AHDL输入方式、模块/原理图输入方式(BlockDiagram/SchematicFiles)、使用MegaWizardPlug-InManeger产生IP核/宏功能块等方式。原理图输入方式有什么特点?答:原理图输入方式是FPGA/CPLD设计的基本方法之一,几乎所有的设计环境都集成有原理图输入方法。这种设计方法直观、易用,支撑它的是一个功能强大、分门别类的器件库。由于器件库器件通用性差,导致其移植性差,如更换设计实现的芯片型号或厂商不同时,整个原理图需要做很大修改甚至是全部重新设计。因此,原理图设计方式主要是一种辅助设计方式,更多地应用于混合设计中的个别模块设计。什么是RTL行为级仿真?答:RTL行为级仿真,也被绝大多数设计者也称为功能仿真,这种仿真不考虑器件的延时特性。功能仿真针对设计的语法和基本功能进行验证,主要是为了在设计的初始阶段发现问题。实战演练1.采用原理图输入方式设计一个三位二进制全加器并进行测试。答:三位二进制全加器原理图如答案图1-1所示,三位二进制全加器功能仿真结果见答案图1-2所示。具体设计见附带习题工程文件夹“FPGA_U1_3fulladder”。答案图1-1三位二进制全加器原理图答案图1-2三位二进制全加器功能仿真结果2.设计一个5~9循环计数器。答:5~9循环计数器原理图如答案图1-3所示,5~9循环计数器功能仿真结果见答案图1-4所示。具体设计见附带习题工程文件夹“FPGA_U1_cnt5_9”。答案图1-35~9循环计数器原理图答案图1-45~9循环计数器功能仿真结果3.按照十进制计数器方案1的结构图完成电路设计。答:十进制计数器方案1原理图如答案图1-5所示,十进制计数器方案1功能仿真结果见答案图1-6所示。具体设计见附带习题工程文件夹“FPGA_U1_cnt0_9”。答案图1-5十进制计数器方案1原理图答案图1-6十进制计数器方案1功能仿真结果
项目2典型逻辑电路的VerilogHDL设计思考与练习一、简答题1.模块module由几个部分组成?答:VerilogHDL模块结构位于module和endmodule关键字之间,每个VerilogHDL程序包括4个主要部分:模块声明(包含“module模块名称;”与“endmodule”)、端口定义、数据/信号类型声明和逻辑功能定义。常见的端口方向分为几种?答:端口是模块与外界连接和通信的信号线,有3种常用端口方向,分别是input、output以及inout。模块中的逻辑功能定义可以由哪几类语句或语句块组成?它们出现的顺序会不会影响功能的描述?答:VerilogHDL逻辑功能定义是模块中最核心的部分,归类方式较多,以下是一种归类方式,通常可以使用4种不同的方式描述模块实现的逻辑功能。分别是:结构化描述方式、数据流描述方式、行为级描述方式、混合描述方式。以上四种描述方式出现的顺序一般不影响功能的描述。最基本的VerilogHDL变量有几种类型?答:VerilogHDL中有3种常用数据类型,分别是net(线网)、register(寄存器)和parameter(参数)。reg型和wire型变量/信号的差别是什么?答:行为级描述中的被赋值的变量/信号一般需要定义为reg型,结构化描述方式和数据流描述方式中被赋值变量/信号一般需要定义为wire型。wire型字面含义是“线网”,而reg型字面含义是“寄存器”,但是被定义为reg型不一定是寄存器电路,而寄存器电路一般均是reg型。被连续赋值语句(assign)赋值的变量/信号能否是reg类型?答:不能。简要说明阻塞赋值与非阻塞赋值的区别。答:阻塞赋值用“=”符号表示,非阻塞赋值用“<=”符号表示。从语法角度看,阻塞赋值是在上升沿来临前,计算always内部右侧所有的赋值语句,若某个赋值语句中左侧值变化了,则将变化的左侧值再代入其他赋值语句,等上升沿来临后更新;而非阻塞赋值则可以理解为,上升沿来临前always内部右侧所有的赋值语句仅计算一次,等上升沿来临后更新。对于同一个设计任务,无论阻塞赋值还是非阻塞赋值均可以达到同样的目的,但代码表面的区别可能较大,只是设计习惯的区别。“使用阻塞赋值语句设计组合逻辑电路,使用非阻塞赋值语句设计时序逻辑电路”这一方式足以应对几乎所有的设计,这也是绝大多数工程师的一种通用习惯。在always模块中被赋值的变量能否是wire型?如果不能是wire型,那么一般应该是什么类型?它们表示的一定是实际的寄存器电路吗?答:不能,一般是reg型。always中被赋值的变量或信号表示的不一定是实际的寄存器,例如使用always结合case语句设计的译码器组合逻辑电路,或者使用always结合if语句设计的选择器及其衍生的组合逻辑电路。四位十进制计数器和四位十六进制计数器分别需要几个LUT和D触发器来实现?答:四位十进制计数器和四位十六进制计数器基本结构是4输入4输出的组合逻辑电路和四位D触发器。不同FPGA的LUT输入端口数不同,以CycloneIV系列的FPGA为例,其内部的LUT是4输出1输出的LUT,需要4个LUT来实现四位十进制计数器和四位十六进制计数器的组合逻辑部分,同时均需要4个D触发器。总结:实现四位十进制计数器和四位十六进制计数器需要4个LUT和4个D触发器来实现,即需要4个LE来实现。实战演练1.使用VerilogHDl语言设计如图2-53所示的电路。答:为了更为清晰的依据电路图设计程序,对电路图中的内部信号进行命名,如答案图2-1所示,名称分别为S0_N、S1_N、T0、T1、T2、T3。答案图2-1内部信号命名依据答案图2-1设计程序,参考代码如下,功能仿真结果如答案图2-2所示,由仿真结果可见,这是一个四选一数据选择器。具体设计见附带习题工程文件夹“U2_No1”。//项目2,实战演练第1题moduleU2_No1( inputwireS0, inputwireS1, inputwireD0, inputwireD1, inputwireD2, inputwireD3, outputwireY);wireS0_N,S1_N,T0,T1,T2,T3; assignS0_N=!S0; assignS1_N=!S1; assignT0=S0_N&S1_N&D0; assignT1=S0&S1_N&D1; assignT2=S0_N&S1&D2; assignT3=S0&S1&D3; assignY=T0|T1|T2|T3;endmodule答案图2-2实战演练第1题功能仿真结果2.编写VerilogHDL代码设计一个3人表决器,实现功能2人及以上同意,表决通过,输出“1”,否则输出“0”。答:3人表决器,使用case语句便于实现,参考代码如下。具体设计见附带习题工程文件夹“U2_No2”。//项目2,实战演练第2题,3人表决器moduleFPGA_Vote( inputwire[2:0]A, outputregVote);always@(*)begin case(A) 3'b000:Vote=1'b0; 3'b001:Vote=1'b0; 3'b010:Vote=1'b0; 3'b011:Vote=1'b1; 3'b100:Vote=1'b0; 3'b101:Vote=1'b1; 3'b110:Vote=1'b1; 3'b111:Vote=1'b1; default:; endcaseendendmodule3.VerilogHDL描述一个带进位输入、进位输出的8位全加器。端口:A、B为加数,Ci为进位输入,S为加法和,Co为进位输出。答:8位全加器,使用算数运算符便于实现,输出的加法和S和进位输出Co使用位拼接符进行整合,参考代码如下。具体设计见附带习题工程文件夹“U2_No3”。//项目2,实战演练第3题,8位全加器moduleFPGA_8fulladder( inputwireCi, inputwire[7:0]A, inputwire[7:0]B, outputwire[7:0]S, outputwireCo);assign{Co,S}=A+B+Ci;endmodule4.设计四选一数据选择器,并给该电路后加一级D触发器。答:四选一数据选择器可以使用if语句或者case语句进行实现,任取一种即可,考虑到选择分支有4个,case语句实现效果更佳,包含D触发器的四选一数据选择器的参考代码如下。具体设计见附带习题工程文件夹“U2_No4”。//项目2,实战演练第4题,包含D触发器的四选一数据选择器moduleFPGA_Mux41(inputwireclk,inputwirerst_n,inputwireEn,inputwire[1:0]S,inputwireA,inputwireB,inputwireC,inputwireD,outputregY);always@(posedgeclkornegedgerst_n)if(rst_n==1'b0)//复位 Y<=1'b0;elsebegin if(En==1'b1)//不复位但使能,在上升沿更新 case(S) 2'b00:Y=A; 2'b01:Y=B; 2'b10:Y=C; 2'b11:Y=D; default:; endcase else//不复位也不使能,即保持 Y<=1'b0;endendmodule5.设计表2-9所示寄存顺序的环形计数器,异步复位,复位时计数器中的值为4'b0001。答:表2-9所示的环形计数器输出共4位二进制,有7种数字。可以使用项目2介绍的方法先实现1个0~7计数器,然后再使用case语句进行转换实现表2-9所示的环形计数器,最后再环形计数器后添加一级D触发器,参考代码如下。具体设计见附带习题工程文件夹“U2_No5”。//项目2,实战演练第5题,环形计数器moduleFPGA_RingCnt( inputwireclk, inputwirerst_n, inputwireEn, outputreg[3:0]Cnt_Ring);reg[2:0]cnt0_6;always@(posedgeclkornegedgerst_n)begin if(!rst_n) cnt0_6<=3'd0; elsebegin if(En==1'b1)/**********组合逻辑开始***********/ cnt0_6<=(cnt0_6<3'd6)?(cnt0_6+3'd1):3'd0;/**//**********组合逻辑结束***********/ else cnt0_6<=cnt0_6; endendalways@(posedgeclkornegedgerst_n)begin if(!rst_n) Cnt_Ring<=4'b0001; elsebegin if(En==1'b1) case(cnt0_6) 3'd0:Cnt_Ring=4'b0001; 3'd1:Cnt_Ring=4'b0010; 3'd2:Cnt_Ring=4'b0100; 3'd3:Cnt_Ring=4'b1000; 3'd4:Cnt_Ring=4'b0100; 3'd5:Cnt_Ring=4'b0010; 3'd6:Cnt_Ring=4'b0001; default:Cnt_Ring=4'b0000; endcase else Cnt_Ring<=Cnt_Ring; endendendmodule
项目3分频计数显示综合系统思考与练习简答题1.使用ModelSim对一个现成的组合逻辑电路进行仿真,需要进行哪些操作?答:在设计好组合逻辑电路后,通过一下操作可以完成仿真。(1)在QuartusPrime下设置仿真软件:在QuartusPrime中将仿真方式设置为联合仿真模式ModelSim-Altera,以便QuartusPrime明确是调用自带仿真工具还是第三方仿真软件。(2)在QuartusPrime下指定ModelSim路径:设定ModelSim的安装路径,以便QuartusPrime可以访问ModelSim。(3)在QuartusPrime下设计测试激励.vt文件:在QuartusPrime中自动生成测试激励模板.vt文件,并修改内容和文件名称。(4)在QuartusPrime下指定仿真所需测试激励.vt文件:在QuartusPrime中指定所采用的测试激励.vt文件名称及其所在路径。(5)在QuartusPrime下启动ModelSim仿真:根据设计需要或流程启动功能仿真或时序仿真。启动后,设计者根据实际情况,在ModelSim添加内部信号、调整信号显示格式等进行仿真分析。2.时序仿真和功能仿真的区别有哪些?各有什么优缺点?答:FPGA设计流程中的验证包括电路仿真和测试,而仿真分为功能仿真和时序仿真。仿真是指使用设计软件包对已实现的设计进行完整的测试,并模拟电路在实际物理环境下的工作情况,以确保HDL描述的电路能够满足设计者的最初意图。功能仿真是指仅对逻辑功能进行模拟测试,以明确其实现的功能是否满足原设计的要求,仿真过程没有加入时序信息,不涉及具体器件的硬件特性,如延时特性等,因此又称为前仿真,是一种理想状态下的仿真。时序仿真则是在HDL可以满足设计者功能要求的基础上,在布局布线后,提取有关的器件延时、连线延时等时序参数信息,并在此基础上进行的仿真,也称为后仿真,是接近于器件真实工作状态的一种仿真。3.时序约束的作用是什么?时序约束主要用于规范设计的时序行为,表达设计者期望满足的时序条件,指导综合和布局布线阶段的优化算法等。时序约束至少有以下作用。(1)提高设计电路的工作频率。(2)获得正确的时序分析报告。(3)指定FPGA/CPLD引脚位置与电气标准。4.某FPGA内部的是4输入1输出LUT,分析实现一位半加器需要几个LUT?实现本项目中的数码管译码器的组合逻辑部分需要几个LUT?答:一位半加器是一种2输入1输出的组合逻辑电路,显然使用1个4输入1输出LUT即可实现。项目3中的数码管译码器的组合逻辑部分是4输入8输出的组合逻辑电路,可以看做8个4输入1输出的组合逻辑电路,每个4输入1输出的组合逻辑电路需要1个LUT实现。因此,实现数码管译码器的组合逻辑部分这种4输入8输出的组合逻辑电路,总共需要8个4输入1输出LUT。(注:因为项目3中的数码管译码器的组合逻辑部分输出信号中有一位恒定是逻辑0,因此实际7个4输入1输出LUT即可实现。)实战演练1.使用ModelSim对项目2的一位半加器组合逻辑电路进行功能仿真和时序仿真。答:按照3.1.2节介绍的内容,对项目2的一位半加器工程进行设置,使用的测试激励文件代码如下,进行功能仿真和时序仿真。一位半加器ModelSim功能仿真结果如答案图3-1所示,一位半加器ModelSim时序仿真结果如答案图3-2所示(进行时序仿真建议分配引脚)。具体设计见附带习题工程文件夹“U3_No1”。//项目3,实战演练第1题,一位半加器测试激励文件`timescale1ns/1psmoduleFPGA_U2_halfadder_V2_tb();regA;regB;wireCo;wireSo;FPGA_U2_halfadder_V2i1( .A(A), .B(B), .Co(Co), .So(So));initialbegin A<=1'b0; B<=1'b0;endalwaysbegin#20A<=~A;endalwaysbegin#10B<=~B;endendmodule答案图3-1一位半加器ModelSim功能仿真结果答案图3-2一位半加器ModelSim时序仿真结果2.使用ModelSim对项目2的二选一数据选择器组合逻辑电路进行功能仿真和时序仿真。答:按照3.1.2节介绍的内容,对项目2的二选一数据选择器工程进行设置,使用的测试激励文件代码如下,进行功能仿真和时序仿真。二选一数据选择器ModelSim功能仿真结果如答案图3-3所示,二选一数据选择器ModelSim时序仿真结果如答案图3-4所示(进行时序仿真建议分配引脚)。具体设计见附带习题工程文件夹“U3_No2”。//项目3,实战演练第2题,二选一数据选择器测试激励文件`timescale1ns/1psmoduleFPGA_U2_1mux21_V1_tb();regDataA_in;regDataB_in;regS;wireY_out;FPGA_U2_1mux21_V1i1( .DataA_in(DataA_in), .DataB_in(DataB_in), .S(S), .Y_out(Y_out));initialbegin S<=1'b0; DataA_in<=1'b0; DataB_in<=1'b0;endalwaysbegin#40S<=~S;endalwaysbegin#20DataA_in<=~DataA_in;endalwaysbegin#10DataB_in<=~DataB_in;endendmodule答案图3-3二选一数据选择器ModelSim功能仿真结果答案图3-4二选一数据选择器ModelSim时序仿真结果3.使用ModelSim完成数码管译码器电路的功能仿真与时序仿真。答:按照3.1.2节介绍的内容,对(项目2)数码管译码器工程进行设置,数码管译码器设计电路如下。具体设计见附带习题工程文件夹“U3_No3”。//项目3,实战演练第3题,数码管译码器电路设计文件moduleled8s(inputwire clk_in,inputwire rst_n,inputwire[3:0]num_i,outputreg[7:0]LED8S_o);//verilog数码管译码器电路描述always@(posedgeclk_inornegedgerst_n)if(!rst_n) LED8S_o<=8'b0000_0000;elsebegin case(num_i)/*共阴极数码管-abcdefgdp*/ 4'h0:beginLED8S_o<=8'b1111_1100;end 4'h1:beginLED8S_o<=8'b0110_0000;end 4'h2:beginLED8S_o<=8'b1101_1010;end 4'h3:beginLED8S_o<=8'b1111_0010;end 4'h4:beginLED8S_o<=8'b0110_0110;end 4'h5:beginLED8S_o<=8'b1011_0110;end 4'h6:beginLED8S_o<=8'b1011_1110;end 4'h7:beginLED8S_o<=8'b1110_0000;end 4'h8:beginLED8S_o<=8'b1111_1110;end 4'h9:beginLED8S_o<=8'b1111_0110;end 4'ha:beginLED8S_o<=8'b1110_1110;end 4'hb:beginLED8S_o<=8'b0011_1110;end 4'hc:beginLED8S_o<=8'b1001_1100;end 4'hd:beginLED8S_o<=8'b0111_1010;end 4'he:beginLED8S_o<=8'b1001_1110;end 4'hf:beginLED8S_o<=8'b1000_1110;end endcaseendendmodule使用的测试激励文件代码如下,进行功能仿真和时序仿真。数码管译码器ModelSim功能仿真结果如答案图3-5所示,数码管译码器ModelSim时序仿真结果如答案图3-6所示(进行时序仿真建议分配引脚)。具体设计见附带习题工程文件夹“U3_No3”。//项目3,实战演练第3题,数码管译码器测试激励文件`timescale1ns/1psmoduleled8s_tb();regclk_in;reg[3:0]num_i;regrst_n;wire[7:0]LED8S_o;led8si1( .LED8S_o(LED8S_o), .clk_in(clk_in), .num_i(num_i), .rst_n(rst_n));initialbeginclk_in<=1'b0;rst_n<=1'b0; num_i<=4'd0;#100rst_n<=1'b1;endalwaysbegin#5clk_in<=~clk_in; #15num_i<=num_i+4'd1;endendmodule答案图3-5数码管译码器ModelSim功能仿真结果答案图3-6数码管译码器ModelSim时序仿真结果4.使用QuartusPrime的TimeQuestTimingAnalyzer工具分析3.1.2节cnt_modelsim电路的最高工作频率。答:参考3.4.2节的时序约束的操作方法1——界面设置方法,对3.1.2节cnt_modelsim电路进行时序约束,答案图3-7所示的CreateClock”对话框是一种示例的参数设置方法。答案图3-8所示的“Slow1200mV85CModel”内嵌对话框可以看出,cnt_modelsim电路受限于FPGA引脚的最高切换频率,因此其最高工作频率为250MHz。具体设计见附带习题工程文件夹“U3_No4”。答案图3-7“CreateClock”对话框答案图3-8“Slow1200mV85CModel”内嵌对话框5.参考分频计数显示综合系统的设计,完成4个LED的流水灯设计,要求每0.5s切换一次花型,从左至右依次亮一个。读者也可自行设计LED的个数和花型。提示:修改数码管译码器电路的case语句及相关信号位宽即可。答:在3.3.1节的“二、综合电路单文件设计流程”部分介绍的分频计数显示综合系统的电路工程中直接进行修改,代码如下。具体设计见附带习题工程文件夹“U3_No5”。//项目3,实战演练第5题,4个LED的流水灯设计文件moduleU3_3_1_Disp0to9_top(inputwire sys_clk,inputwire sys_rst_n,outputreg[3:0]LED4S_o);//NO1:分频器电路:50MHz--->2Hz,时序逻辑电路regclk_1Hz;reg[24:0]cnt_div_r;always@(posedgesys_clkornegedgesys_rst_n)if(!sys_rst_n)begin cnt_div_r<=0; clk_1Hz<=0;endelsebegin if(cnt_div_r==25'd49_999)begin cnt_div_r<=cnt_div_r+1; clk_1Hz<=~clk_1Hz; end elseif(cnt_div_r==25'd24_999_999)begin cnt_div_r<=0; clk_1Hz<=~clk_1Hz; end elsebegin cnt_div_r<=cnt_div_r+1; clk_1Hz<=clk_1Hz; endend//NO2:任意计数器reg[3:0]cnt_0to9;always@(posedgeclk_1Hzornegedgesys_rst_n)if(!sys_rst_n)begin cnt_0to9<=2'd0;endelsebegin if(cnt_0to9==2'd3) cnt_0to9<=2'd0; else cnt_0to9<=cnt_0to9+2'd1;end//NO3:流水灯电路always@(posedgeclk_1Hzornegedgesys_rst_n)if(!sys_rst_n) LED4S_o<=8'b0000_0000;elsebegin case(cnt_0to9) 2'd0:beginLED4S_o<=4'b0001;end 2'd1:beginLED4S_o<=4'b0010;end 2'd2:beginLED4S_o<=4'b0100;end 2'd3:beginLED4S_o<=4'b1000;end endcaseendendmodule
项目4高速信号发生器思考与练习一、填空题1.10位DAC器件可以产生1024种幅度的电压或电流。2.一个线性度理想的12位DAC器件,输入全0和输入全1对应的输出电压值分为5V和-5V,输入的12位二进制数字值每增加1,对应输出电压值变化0.009765625V。3.图4-11中,假设输入时钟频率为50MHz,产生的正弦波频率是312500Hz。若将计数器的计数范围从0~31修改为0~49,对应的相位-幅度查找表电路也进行相应的修改,输出正弦波频率是200000Hz。二、简答题简述IP核中软核、硬核、固核的区别。答:IP核分为3类:软核、硬核、固核。IP软核(HDL)一般指的是用硬件描述语言描述的功能块,它并不涉及用什么具体电路元器件实现这些功能,软核的代码直接参与设计的编译流程,就像设计者编写的HDL代码一样。IP硬核(版图形式)是指已经经过验证的设计版图,在EDA设计领域中具有特殊的含义。IP硬核的优点是具有可预见性、针对特定工艺、功耗和尺寸进行了优化、易于实现IP核保护。IP固核(网表形式)是软核与硬核的一个折中,它只对描述功能中一些比较关键的路径进行预先的布局布线,而其他部分仍然可以任由编译器进行相关优化处理。实战演练1.图4-11的设计是将一个正弦波相位0~2π进行了32等分,若将0~2π进行128等分,绘制和图4-11类似的电路框架,并设计、仿真电路。提示:绘制电路框架应特别注意端口和信号位宽。答:修相位累加器后的正弦波信号发生器电路框架如答案图4-1所示,修相位累加器后的正弦波信号发生器电路时序仿真结果如答案图4-2所示。具体设计见附带习题工程文件夹“U4_No1”。答案图4-1修相位累加器后的正弦波信号发生器电路框架答案图4-2修相位累加器后的正弦波信号发生器电路时序仿真结果2.使用PLLIP核设计一个输入为50MHz、输出为25.175MHz的分频电路,并进行时序仿真。答:直接在4.2.2节介绍的“一、PLLIP核配置与使用”工程上进行参数修改,首先参照答案图4-3所示的clk_c0设置,将输出频率修改为25.175,单位保持MHz;然后参照答案图4-4所示的clk_c1设置,取消“USEthisclock”;最后完成按照提示完成IP核设置。因为取消了clk_c1,因此设置完IP核后对代码进行修改,修改后的代码如下。答案图4-5所示为PLLIP核时序仿真结果。具体设计见附带习题工程文件夹“U4_No2”。//项目4,实战演练第2题,PLLIP核设计文件//原版是PLLIP核配置与使用-独立的PLLIP核例化modulePLL_125MHz(inputwiresys_clk,//输送给PLLIP核的输入时钟inputwiresys_rst_n,//复位,低有效outputwirepclk_125M,//PLLIP核输出的一路时钟outputwirepclk_125M_N,//PLLIP核输出的另一路时钟outputwireprst_n//由PLLIP核构造的真正复位信号);wirelocked_w;assignprst_n=locked_w&sys_rst_n;ip_pll pll_ip_inst( .areset(~sys_rst_n), .inclk0(sys_clk), .c0(pclk_125M), //.c1(pclk_125M_N), .locked(locked_w) );endmodule答案图4-3clk_c0设置答案图4-4clk_c1设置答案图4-5PLLIP核时序仿真结果3.参考图4-38,将PLLIP核配置为100MHz,相位累加器范围修改为0~127,对应的ROMIP核深度修改为128,输出幅度位宽修改为10,绘制和图4-38类似的电路框架,并设计、仿真电路。提示:绘制电路框架应特别注意端口和信号位宽。答:修相后的基于ROMIP核的信号发生器框架如答案图4-6所示。因为输出幅度位宽由8位改为了10位,因此测试激励文件对应的位宽也要修改为10位。修改后的基于ROMIP核的信号发生器时序仿真结果如答案图4-7所示。在4.2.3节“sin_top_pll_rom”工程基础上进行修改,具体设计见附带习题工程文件夹“U4_No3”。答案图4-6修改后的基于ROMIP核的信号发生器框架答案图4-7修改后的基于ROMIP核的信号发生器时序仿真结果4.按4.2.3节所述设计电路,不考虑正弦波显示效果,要求产生频率约1kHz的正弦波。答:因为要求的正弦波频率为1kHz,而相位累加器计数范围为0~31,因此PLLIP核输出频率应该是32kHz,在4.2.3节“sin_top_pll_rom”工程基础上进行修改,只需将PLLIP核的输出频率修改为32kHz即可,频率约1kHz的正弦波时序仿真结果如图4-8所示。具体设计见附带习题工程文件夹“U4_No4”。答案图4-8频率约1kHz的正弦波时序仿真结果
项目5信号幅值测量显示仪思考与练习一、填空题1.10位ADC最多可以输出1024种二进制值数字。2.一个线性度理想的14位线性电压型ADC模块,其输入电压输出值分别为5V和−5V时,对应的输出的转换值为0和16383。当输入电压变化1V时,对应的转换结果变化的数值是1638。3.参考图5-40,驱动8位7段数码管需要15个FPGA端口。二、设计题参考任务5.3的设计,请设计一个8位8段动态数码管显示电路。答:参考5.3.2节“二、动态数码管电路设计”的“module
LED8S_V1”电路设计,以下给出8位8段数码管显示电路,代码如下。具体设计见附带习题工程文件夹“U5_No0”。//项目5,设计题:设计一个8位8段动态数码管显示电路//8位数码管驱动;共阳数码管,因此段选0亮1不亮;位选和FPGA之间有三极管取反,故位选0亮1不亮;//时钟支持20MHz~100MHz,复位低有效;////支持显示熄灭功能,EnDisp_i=1亮;=0全部熄灭;//显示数据只支持非负整数,十进制0~99999999;//支持显示负数符号“−”,Sign_i,但此处的“−”仅是显示,不代表正负;//支持小数点显示,DotPos,但此处的“.”仅是显示,不代表整数或小数;//wei_0[0]接数码管个位,依此类推;//dual_o[0]接小数点,依此类推。moduleLED8S_V1(inputwireclk_in,//时钟支持20MHz~50MHzinputwirerst_n,//低复位,复位后亮“8.8.8.8.8.8.8.8.”inputwireEnDisp_i,//显示使能,若为0,所有数码管熄灭inputwireSign_i,//正负,0正1负“-”,固定显示在最左边一位inputwire[7:0]DotPos,//小数点位置,例若为8'b00000100,显示“XXXXXX.XX”inputwire[26:0]Num2Disp_i,//输入数据值,二进制,最大为十进制99999999outputreg[7:0]dual_o,//连接数码管的段选(共阳极),位选三极管取反,因此,0亮1不亮outputreg[7:0]wei_o//连接数码管的位选(共阳极),段选直接接FPGA,因此,0亮1不亮);//程序包含//assign1——个、十、百、千、万、十万、百万、千万位的分离,直接用assign组合逻辑;//always1——分频器:为系统全局同步时钟//always2——00000001-10000000核心计数器,根据计数值决定显示的位和段//always3——位选六选一数据选择器+触发器(触发器仅为和段选链路延时配平)//always4——使能控制,当不使能时,wei_o输出8'b11111111//always5——八选一段选数据选择器(个、十、百~百千或4’ha)+二选一(百千位还是“−”)+触发器//always6——小数点拼接//always7——数码管译码器+触发器/***************************建议不采取取余取商方案****************************///此处的个、十、百、千、万、十万、百万、千万位的分离强烈不建议这样写//此版本是一个反例,最后通过综合后的逻辑资源数,证明这种写法极为浪费资源//建议参考后续章节的除法器复用替代方案及“大四加三”替代方案 wire[3:0]unit_w; wire[3:0]tens_w; wire[3:0]hundred_w;//hundred wire[3:0]kilo_w; wire[3:0]tens_kilo_w; wire[3:0]hund_kilo_w; wire[3:0]mill_w; wire[3:0]tens_mill_w; assignunit_w=Num2Disp_i%10'd1000%4'd10; assigntens_w=Num2Disp_i%10'd1000/4'd10%4'd10; assignhundred_w=Num2Disp_i%10'd1000/7'd100; assignkilo_w=Num2Disp_i/10'd1000%4'd10; assigntens_kilo_w=Num2Disp_i/10'd1000/4'd10%4'd10; assignhund_kilo_w=Num2Disp_i/10'd1000/7'd100%4'd10; assignmill_w=Num2Disp_i/10'd1000/10'd1000%4'd10; assigntens_mill_w=Num2Disp_i/10'd1000/10'd1000/4'd10;/***************************建议不采取取余取商方案*********************************///always1——分频器:支持输入20MHz~200MHz,固定分频系数65535,输出300Hz~3kHz左右 reg[15:0]cnt_div;regclk_div; always@(posedgeclk_inornegedgerst_n) if(!rst_n)begin cnt_div<=16'd0; clk_div<=1'b0; end elsebegin if(cnt_div==16'd65535)begin cnt_div<=16'd0; clk_div<=1'b0; end elseif(cnt_div==16'd65535/2-1)begin cnt_div<=cnt_div+16'd1; clk_div<=1'b1; end elsebegin cnt_div<=cnt_div+16'd1; clk_div<=clk_div; end end //always2——0~7核心计数器,根据计数值决定位和段等其他电路 reg[7:0]cnt_core_r; always@(posedgeclk_divornegedgerst_n) if(!rst_n) cnt_core_r<=8'b00000001; elsebegin//修改为0~7计数器也可以 cnt_core_r<={cnt_core_r[6:0],cnt_core_r[7]}; end//always3——位选八选一数据选择器+触发器(触发器仅为和段选链路延时配平) reg[7:0]wei_temp_r; always@(posedgeclk_divornegedgerst_n) if(!rst_n) wei_temp_r<=8'b0000_0000; elsebegin wei_temp_r<=~cnt_core_r; end//always4——使能控制,当不使能时,wei_o输出8'b11111111 always@(posedgeclk_divornegedgerst_n) if(!rst_n) wei_o<=8'b0000_0000;//复位全亮 elsebegin if(EnDisp_i==1'b0)//不使能全灭 wei_o=8'b1111_1111; else wei_o<=wei_temp_r; end //always5——六选一段选数据选择器(个、十、百~百千或4’ha)+二选一(百千位还是“−”)+触发器 reg[3:0]NumSel_r; always@(posedgeclk_divornegedgerst_n) if(!rst_n) NumSel_r<=4'd0; elsebegin case(cnt_core_r) 8'b00000001:NumSel_r<=unit_w; 8'b00000010:NumSel_r<=tens_w; 8'b00000100:NumSel_r<=hundred_w; 8'b00001000:NumSel_r<=kilo_w; 8'b00010000:NumSel_r<=tens_kilo_w; 8'b00100000:NumSel_r<=hund_kilo_w; 8'b01000000:NumSel_r<=mill_w; //如果显示整数,则正常显示,如果是负数,选中4'ha,4'ha仅是个标记而已 //在后文的查找表会译码成“−”段选符号 8'b10000000:NumSel_r<=(Sign_i==1'b0)?tens_mill_w:4'ha; //保证语法完整,4'hb仅是个标记而已,查找表译码成“E",寓意error default:NumSel_r<=4'hb; endcase end//always6——小数点拼接 regDotDisp_r; always@(posedgeclk_divornegedgerst_n) if(!rst_n) DotDisp_r<=1'b0;//此处赋值0,是为了按复位按键时,可以测试数码管是否完好 elsebegin if(cnt_core_r==DotPos) DotDisp_r<=1'b0;//小数点0亮1不亮 else DotDisp_r<=1'b1;//小数点0亮1不亮 end//always7——数码管译码器+触发器 always@(posedgeclk_divornegedgerst_n) if(!rst_n) dual_o<=8'b0000_0000;//复位全亮 elsebegin case(NumSel_r) //abc_defg 4'h0:begindual_o<={7'b000_0001,DotDisp_r};end 4'h1:begindual_o<={7'b100_1111,DotDisp_r};end 4'h2:begindual_o<={7'b001_0010,DotDisp_r};end 4'h3:begindual_o<={7'b000_0110,DotDisp_r};end 4'h4:begindual_o<={7'b100_1100,DotDisp_r};end 4'h5:begindual_o<={7'b010_0100,DotDisp_r};end 4'h6:begindual_o<={7'b010_0000,DotDisp_r};end 4'h7:begindual_o<={7'b000_1111,DotDisp_r};end 4'h8:begindual_o<={7'b000_0000,DotDisp_r};end 4'h9:begindual_o<={7'b000_0100,DotDisp_r};end 4'ha:begindual_o<={7'b111_1110,DotDisp_r};end//符号位“-” 4'hb:begindual_o<={7'b010_1000,DotDisp_r};end//“E”,寓意error备用default:begindual_o<={7'b011_0000,DotDisp_r};end//“E”,寓意error备用 endcase endendmodule测试激励文件代码如下。//项目5,设计题:设计一个8位8段动态数码管显示电路测试激励文件`timescale1ns/1psmoduleLED8S_V1_tb();reg[7:0]DotPos;regEnDisp_i;reg[26:0]Num2Disp_i;regSign_i;regclk_in;regrst_n;//wireswire[7:0]dual_o;wire[7:0]wei_o;//assignstatements(ifany)LED8S_V1i1(//portmap-connectionbetweenmasterportsandsignals/registers .DotPos(DotPos), .EnDisp_i(EnDisp_i), .Num2Disp_i(Num2Disp_i), .Sign_i(Sign_i), .clk_in(clk_in), .dual_o(dual_o), .rst_n(rst_n), .wei_o(wei_o));initialbeginclk_in<=1'b0;rst_n<=1'b0;#100rst_n<=1'b1;Sign_i<=1'b1;//显示负号EnDisp_i<=1'b1;//显示开DotPos<=8'b000100;//显示小数点Num2Disp_i<=27'd19970701;endalwaysbegin#10clk_in<=~clk_in;endendmodule实战演练1.使用SignalTap工具对任务3.1中的cnt_modelsim电路的端口进行测试。答:在3.1节cnt_modelsim电路工程基础上修改。第一步:打开SignalTap窗口,并参照答案图5-1进行设置;第二步:参照答案图5-2将.stp文件添加到工程;第三步:对工程进行全编译;第四步:打开SignalTap窗口进行采集,答案图5-3所示为cnt_modelsim电路的SignalTap采集结果。具体设计见附带习题工程文件夹“U5_No1”。答案图5-1cnt_modelsim电路的SignalTap窗口设置答案图5-2添加.stp文件示意答案图5-3cnt_modelsim电路的SignalTap采集结果2.使用SignalTap工具对3.2.2节的并行赋值风格通用分频器电路的端口信号和内部信号cnt_r进行观测,要求将分频系数改为100。答:在3.2.2节并行赋值风格通用分频器电路工程基础上修改。第一步:对代码中的分频系数相关参数进行修改,然后进行全编译;第二步:参照答案图5-4所示的并行赋值风格通用分频器电路的SignalTap窗口设置进行设置;第三步:设置完之后保存,并将.stp文件添加到工程中,进行全编译;第四步:打开SignalTap窗口进行采集,答案图5-5所示为并行赋值风格通用分频器电路的SignalTap采集结果。具体设计见附带习题工程文件夹“U5_No2”。答案图5-4并行赋值风格通用分频器电路的SignalTap窗口设置答案图5-5并行赋值风格通用分频器电路的SignalTap采集结果3.在FPGA芯片外围搭建单个数码管电路与FPGA引脚连接,并使用ISSP工具的源驱动3.3.2节多文件设计方法中的“moduleled8s”电路。答:本题旨在考验学生对本章数码管电路的理解以及相关的动手能力。第一步:按照答案图5-6所示的三极管驱动单个共阳极数码管(或者单个共阴极数码管),在FPGA芯片或者开发板外围搭建单个数码管电路(以共阳极为例),并通过FPGA引脚连接;第二步:创建文件夹和工程“led8s_source_and_probe”,参照5.3.2节介绍的内容,按答案图5-7所示的驱动单个数码管ISSPIP核创建与配置进行设置;第三步:对“moduleled8s”和ISSPIP核进行例化,示例代码如下;第四步:全编译后,参照答案图5-8所示的“In-SystemSourcesandProbesEidtor”对话框进行下载和测试。具体设计见附带习题工程文件夹“U5_No3”。//项目5,实战演练第3题//ISSP工具的源驱动3.3.2节多文件设计方法中的“moduleled8s”电路moduleled8s_source_and_probe( inputwire clk_in, inputwire rst_n, outputwire[7:0]LED8S_o);wire[3:0]num_w;ip_source_numu0( .source(num_w));led8su1(.clk_in(clk_in),.rst_n(rst_n),.num_i(num_w),.LED8S_o(LED8S_o));endmodule答案图5-6三极管驱动单个共阳极数码管答案图5-7驱动单个数码管ISSPIP核创建与配置答案图5-8“In-SystemSourcesandProbesEidtor”对话框
项目6信号频率测量显示仪思考与练习一、填空题1.不考虑亚稳态问题,本地时钟频率为50MHz,使用周期测频法测量频率为1kHz脉冲信号的绝对误差最大值的绝对值是0.02Hz,相对误差最大值的绝对值是0.002%。2.不考虑亚稳态问题,将闸门宽度设置为100ms,使用直接测频法测量频率为1kHz脉冲信号的绝对误差最大值的绝对值是10Hz,相对误差最大值的绝对值是1%。二、简答题1.简述周期测频法、直接测频法、等精度测频法的适用场景(主要从待测信号频率范围和精度的角度回答)。答:周期测频法、直接测频法、等精度测频法特点如下。周期测频法:当本地时钟clk的频率固定时,待测信号频率越低,对应Ns或N越大,绝对误差和相对误差越小。因此,周期测频法适合测量频率较低信号,且本地时钟频率越高,误差越小。直接测频法:直接测频法适合测量频率较高的待测信号,且闸门宽度应尽可能长。等精度测频法:等精度测频法的频率测量值相对误差仅和闸门宽度以及本地时钟频率相关,和待测信号频率无关,因此,等精度测频法是一种具有宽频率范围和高精度特点的测频方法。周期测频法可以测量占空比,而直接测频法和等精度测频法不能直接测量占空比。2.亚稳态问题对电路的危害较大,请回答亚稳态问题产生的本质是什么?异步电路亚稳态应如何避免?因两级D触发器之间的组合逻辑电路延时较大导致的亚稳态的避免思路?答:如果D触发器的输入D值在D触发器的Tsu和Th之间(即在D触发器输入时钟上升沿前后极短时间内)发生变化,那么D触发器输出Q端就会出现亚稳态现象。对于FPGA外部输入的异步信号,严格地说亚稳态不可消除,只能尽量避免或规避其对系统的危害。答案图6-1所示为一种常用的两级D触发器避免亚稳态电路,两级D触发器避免亚稳态是一种硬件消耗和效果权衡后的最佳选择。因组合逻辑延时过大出现的亚稳态现象可以通过优化组合逻辑、使用多级D触发器拆解组合逻辑、降低时钟频率等手段来主动避免。答案图6-1一种常用的两级D触发器避免亚稳态电路实战演练1.参考项目5中SignalTap工具的介绍,对6.1.2节周期测频法电路进行测试。答:直接在6.1.2节介绍的“module
FreMeasure_T”工程上添加SignalTap,第一步:为clk_in、rst_n、fx_i分配引脚,然后进行一次全编译;第二步:参照答案图6-2所示的周期测频法电路的SignalTap窗口设置,在工程中添加、设置SignalTap,完成之后保存.stp文件,再次完成全编译;第三步:在SignalTap窗口进行.sof文件的下载,答案图6-3所示为周期测频法电路的SignalTap采集结果。具体设计见附带习题工程文件夹“U6_No1”。答案图6-2周期测频法电路的SignalTap窗口设置答案图6-3周期测频法电路的SignalTap采集结果2.参考项目5中SignalTap工具的介绍,对6.1.2节直接测频法电路进行测试。答:直接在6.1.2节介绍的“module
FreMeasure_Direct(见教材配套资源)”工程上添加SignalTap,第一步:为clk_in、rst_n、fx_i分配引脚,然后进行一次全编译;第二步:参照答案图6-4所示的直接测频法电路的SignalTap窗口设置,在工程中添加、设置SignalTap,完成之后保存.stp文件,再次完成全编译;第三步:在SignalTap窗口进行.sof文件的下载,答案图6-5所示为直接测频法电路的SignalTap采集结果。具体设计见附带习题工程文件夹“U6_No2”。答案图6-4直接测频法电路的SignalTap窗口设置答案图6-5直接测频法电路的SignalTap采集结果3.电路设计题。如图6-34所示,fx_i是FPGA引脚的输入信号,当fx_i上升沿或下降沿来临一次时,计数器cnt加值1。并参考项目5中SignalTap工具的介绍,将fx_i的上升沿和下降沿边沿变化均作为采集触发条件。图6-34习题3答:首先,因为fx_i是FPGA的外部信号,显然相对于FPGA的时钟clk_in是异步信号,因此需要使用两级D触发器对其进行同步得到clk_in的同步信号fx_cur_r;然后,对fx_cur_r再延缓一拍得到fx_last_r,“!fx_last_r&&fx_cur_r”相当于fx_i同步信号的上升沿判定的条件,“fx_last_r&&!fx_cur_r”相当于fx_i同步信号的下降沿的判定条件;依据上升沿和下降沿判定条件对cnt_o进行累加。具体操作步骤如下:第一步:创建工程“U6_No3”,至少为为clk_in、rst_n、fx_i分配引脚,然后进行一次全编译。第二步:参照答案图6-6所示的fx_i检测电路的SignalTap窗口设置,在工程中添加、设置SignalTap,完成之后保存.stp文件,再次完成全编译;第三步:在SignalTap窗口进行.sof文件的下载,答案图6-7所示为fx_i检测电路的SignalTap采集结果。注:将函数信号发生器波形设置为方波(square)或脉冲(pulse)模式;根据FPGA电路板的设计,以IO端口为3.3V的电压为例,设置函数信号发生器电压峰峰值为3.3V,直流偏置为1.65V;并将函数信号发生器的输出(或者按键)接入到此工程的fx_i引脚,调整信号频率实时观察数码管显示结果。具体设计见附带习题工程文件夹“U6_No3”。//项目6,实战演练第3题,电路设计题,对fx_i进行检测moduleU6_No3(inputwireclk_in,//输入时钟inputwirerst_n,//复位inputwirefx_i,//待测信号outputreg[25:0]cnt_o//fx_i边沿累加值);//NO1-两级触发器同步信号,以避免亚稳态regfx_sync_r;//两级亚稳态避免竞争冒险--第1级regfx_cur_r;//两级亚稳态避免竞争冒险--第2级regfx_last_r;//两级亚稳态避免竞争冒险--再缓冲一拍always@(posedgeclk_inornegedgerst_n)if(!rst_n)begin fx_sync_r<=1'b0; fx_cur_r<=1'b0; fx_last_r<=1'b0;endelsebegin fx_sync_r<=fx_i; fx_cur_r<=fx_sync_r; fx_last_r<=fx_cur_r;end//NO2-当fx_i上升沿或下降沿来临一次时,计数器cnt加值1 //!fx_last_r&&fx_cur_r等价于检测fx_i的同步信号fx_last上升沿 //fx_last_r&&!fx_cur_r等价于检测fx_i的同步信号fx_last下降沿always@(posedgeclk_inornegedgerst_n)if(!rst_n)begin cnt<=26'd0;endelsebegin if((!fx_last_r&&fx_cur_r)||(fx_last_r&&!fx_cur_r))begin cnt<=cnt_o+26'd1; end elsebegin cnt<=cnt; endendendmodule答案图6-6fx_i检测电路的SignalTap窗口设置答案图6-7fx_i检测电路的SignalTap采集结果
项目7基于VGA的液晶显示屏示波器思考与练习填空题1.VGA显示模式中的1024×768@75,其时钟频率是78.8MHz,记时钟周期为T,一个完整的行扫描周期时间长度是16.650us,一个完整的场扫描周期时间长度是13.320ms。2.VGA接口共15个接口(针或孔)。3.以M9K资源实现宽度为8,深度为32的双口RAMIP核,共消耗256bit的M9K存储器资源。实战演练1.参考VGA彩条显示,将LCD屏幕上下和左右划分为四个相等的区域,在其左上角显示红色、右上角显示绿色、左下角显示蓝色、右下角显示白色。答:在7.1.2节“VGA_ColourBar_top”工程基础上进行修改,被例化的“VGA_Driver.v”电路无需改动,只需将“VGA_ColourBar_top.v”中的“信号vga_rgb_o”赋值部分进行修改即可,修改部分的代码如下。习题图7-1所示为四个相等的区域VGA显示结果拍照。具体设计见附带习题工程文件夹“U7_No1”。 always@(posedgepclkornegedgeprst_n) if(!prst_n) vga_rgb_o<=16'd0; elsebegin if(VS_EN_w==1'b1&&HS_EN_w==1'b1)begin if(X_POS_w<11'd320&&Y_POS_w<11'd240) vga_rgb_o<=RED; elseif(X_POS_w>=11'd320&&Y_POS_w<11'd240) vga_rgb_o<=GREEN; elseif(X_POS_w<11'd320&&Y_POS_w>=11'd240) vga_rgb_o<=BLUE; el
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产后康复与正常情绪
- 康复医学演讲比赛
- 2026下半年小学教师资格证考试政治真题汇编试卷及解析
- 【新教材】统编版(2024)|七年级上册道德与法治11.2《树立正确的人生目标》教学设计
- 国际教育职业规划指南
- 校园消防安全术语解析
- 人工智能高层学科建设
- 2026及未来5年中国圆形竹篮数据监测研究报告
- 健康课件制作技巧
- 2026事业单位工勤技能-江苏-江苏不动产测绘员五级(初级工)历年参考题库含答案详解3套试卷
- 2025年桦甸市产业发展有限公司招聘模拟试卷及答案详解(新)
- 听神经瘤的诊治及护理
- 市政管道清淤施工合同范本
- 燃气安全操作教育培训课件
- 化工车间食品安全培训课件
- 抗压能力测试题目及答案
- 矿山物资管理办法
- 新课标学习培训课件
- 安利公司薪酬管理制度
- JG/T 526-2017建筑电气用可弯曲金属导管
- T/CECS 10384-2024纳米反射膜自粘型热塑性聚烯烃(TPO)复合防水卷材
评论
0/150
提交评论