版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 XXXXXXXX大学大学XXXXXX学院学院第第9章章 Verilog数字电路设计实践数字电路设计实践 主要内容主要内容基本组合电路的设计基本组合电路的设计1 1ABFCD门级结构描述门级结构描述 module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); /调用门元件调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule数据流描述数据流描述module gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D);/
2、assign持续赋值持续赋值endmodule行为描述行为描述module gate3(F,A,B,C,D);input A,B,C,D;output F;reg F;always (A or B or C or D)/过程赋值过程赋值beginF=(A&B)|(B&C&D);endendmodule基本组合电路的设计基本组合电路的设计2 2用用bufif1关键字描述的三态门关键字描述的三态门 module tri_1 (in, en, out);input in, en;output out;tri out;bufif1 b1(out, in, en);/注意三态门端
3、口的排列顺序注意三态门端口的排列顺序endmodule用用assign语句描述三态门语句描述三态门 用用MAX+PLUS II进行编译,生成上图所示的模块符号。进行编译,生成上图所示的模块符号。基本组合电路的设计基本组合电路的设计 33-to-8 decodermodule decoder_38(out, in);output7:0 out;input2:0 in;reg7:0 out;always (in) begin case(in) 3d0: out=8b11111110; 3d1: out=8b11111101; 3d2: out=8b11111011; 3d3: out=8b1111
4、0111; 3d4: out=8b11101111; 3d5: out=8b11011111; 3d6: out=8b10111111; 3d7: out=8b01111111; endcase endendmodule28-3的优先编码器的优先编码器 作为条件语句,作为条件语句,if-else语句的分支是有优先顺序的。利用语句的分支是有优先顺序的。利用if-else语语句的特点,可以很方便地实现优先编码器。句的特点,可以很方便地实现优先编码器。 下面的例子是一个下面的例子是一个8-3优先编码器,该编码器输人为优先编码器,该编码器输人为a、b、c、d、e、f、g和和h,输人信号高电平有效,输人
5、信号高电平有效,h的优先级最高。的优先级最高。续续符号符号 用用QuartusII软件对上面的代码综合后,生成一个模块符号,再加上输入输出软件对上面的代码综合后,生成一个模块符号,再加上输入输出端口,即构成了如下图所示的优先编码器电路。端口,即构成了如下图所示的优先编码器电路。对该编码器进行仿真,得到如下图所示的波形对该编码器进行仿真,得到如下图所示的波形基本组合电路的设计基本组合电路的设计 4奇偶校验位产生器奇偶校验位产生器 module parity(even_bit, odd_bit, input_bus);output even_bit, odd_bit;input7:0 input_
6、bus;assign odd_bit = input_bus;/产生奇校验位产生奇校验位assign even_bit = odd_bit;/产生偶校验位产生偶校验位endmodule基本组合电路的设计基本组合电路的设计 5用用if-else语句描述的语句描述的4选选1 MUXmodule mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input1:0 sel;reg out;always (in0 or in1 or in2 or in3 or sel) beginif(sel=2b00) out=in0;e
7、lse if(sel=2b01) out=in1;else if(sel=2b10) out=in2;else out=in3; endendmodule7段段LED数码管译码电路数码管译码电路输出信号的输出信号的7位分别接如下图数码管的位分别接如下图数码管的7个段,高位在左,低个段,高位在左,低位在右。位在右。例如当输出为例如当输出为“1101101”时,数码管的时,数码管的7个段:个段:g、f、e、d、c、b、a分别接分别接1、1、0、1、1、0、1;接有高电平的段发亮,于;接有高电平的段发亮,于是数码管显示是数码管显示“5”。共阴数码管及其电路共阴数码管及其电路源程序源程序组合逻辑设计要
8、点组合逻辑设计要点 组合逻辑设计要点组合逻辑设计要点 结论结论组合电路的输入一旦有变化,输出马上跟着变化组合电路的输入一旦有变化,输出马上跟着变化组合电路一般都用组合电路一般都用assign语句语句当用当用always描述纯组合电路时,括号内的敏感列描述纯组合电路时,括号内的敏感列表要把表要把所有的输入所有的输入列出来列出来基本时序电路的设计基本时序电路的设计 1 D-FF designs(基本基本D触发器触发器)module DFF(Q, D, CLK);output Q;input D, CLK;reg Q;always (posedge CLK)beginQ = D;endendmodu
9、le基本时序电路的设计基本时序电路的设计 2 带异步清带异步清0、异步置、异步置1的的D触发器触发器module DFF1(q, qn, d, clk, set, reset);input d, clk, set, reset;output q, qn;reg q, qn;always (posedge clk or negedge set or negedge reset) beginif (!reset) beginq = 0;/异步清异步清0,低电平有效,低电平有效qn = 1;end else if (!set) beginq = 1;/异步置异步置1,低电平有效,低电平有效qn =
10、0;end else beginq = d;qn = d;end endendmodule基本时序电路的设计基本时序电路的设计 3 带同步清带同步清0、同步置、同步置1的的D触发器触发器module DFF2(q, qn, d, clk, set, reset);input d, clk, set, reset;output q, qn;reg q, qn;always (posedge clk) beginif (reset) begin q=0;qn=1; end /同步清同步清0,高电平有效,高电平有效else if (set) begin q =1;qn =0; end /同步置同步置
11、1,高电平有效,高电平有效else begin q=d; qn=d;end endendmodule数据锁存器数据锁存器1.数据锁存器数据锁存器a 下面用下面用assign语句描述了一个电平敏感(触发)的数据锁存器,该锁存语句描述了一个电平敏感(触发)的数据锁存器,该锁存器只能锁存一位数据器只能锁存一位数据always (clk or d) begin if(clk) q=d; endassign用always置换:2. 数据锁存器数据锁存器b下面代码描述的是一个带置位和复位端的电平敏感型的下面代码描述的是一个带置位和复位端的电平敏感型的1位数据锁存器。位数据锁存器。always (clk o
12、r reset or set or d) begin if(reset) q=0; else if(set) q=1; else if(clk) q=d; end assign用always置换:基本时序电路的设计基本时序电路的设计 4 8位数据锁存器位数据锁存器module latch_8(qout,data,clk);output7:0 qout;input7:0 data;input clk;reg7:0 qout;always (clk or data) beginif(clk) qout=data; endendmodule数据寄存器数据寄存器数据锁存器和数据寄存器的区别:数据锁存器
13、和数据寄存器的区别:从寄存数据的角度看,锁存器和寄存器的功能是相从寄存数据的角度看,锁存器和寄存器的功能是相同的同的锁存器一般是由电平信号来控制(电平触发),属锁存器一般是由电平信号来控制(电平触发),属于电平敏感型于电平敏感型寄存器一般由同步时钟信号控制(边沿触发)寄存器一般由同步时钟信号控制(边沿触发)基本时序电路的设计基本时序电路的设计5 58位数据寄存器位数据寄存器module reg8(out_data,in_data,clk,clr);output7:0 out_data;input7:0 in_data;input clk,clr;reg7:0 out_data;always (
14、posedge clk or posedge clr) beginif(clr) out_data =0;else out_data = in_data; endendmodule移位寄存器移位寄存器设计了一个设计了一个8位移位寄存器。该寄存器有位移位寄存器。该寄存器有1个时钟输个时钟输入端、入端、1个同步清个同步清0端。信号串行输入,端。信号串行输入,8位并行输位并行输出,每个时钟周期内输出信号左移出,每个时钟周期内输出信号左移1位,同时将串位,同时将串行输入的行输入的1位补充到输出信号的最低位。位补充到输出信号的最低位。续续基本时序电路的设计基本时序电路的设计6 6 可变模加法可变模加法/
15、减法计数器减法计数器module updown_count(d, clk, clear, load, up_down, qd);input7:0 d;input clk,clear,load,up_down;output7:0 qd;reg7:0 cnt;assign qd=cnt;always (posedge clk) beginif(!clear) cnt=8h00;/同步清同步清0,低电平有效,低电平有效else if(load) cnt=d;/同步预置同步预置else if(up_down) cnt=cnt+1;/加法计数加法计数else cnt=cnt-1;/减法计数减法计数 en
16、dendmodule结论结论时序电路的输出是由时钟控制的(电平控制时序电路的输出是由时钟控制的(电平控制、边沿控制)、边沿控制)边沿控制的时序电路一定要用边沿控制的时序电路一定要用always语句描语句描述述结论结论1组合电路的输入一旦有变化,输出马上跟着变化组合电路的输入一旦有变化,输出马上跟着变化组合电路一般都用组合电路一般都用assign语句语句当用当用always描述纯组合电路时,括号内的敏感列表里要把描述纯组合电路时,括号内的敏感列表里要把所有的输入列出来所有的输入列出来结论结论2时序电路的输出是由时钟控制的(电平控制、边沿控时序电路的输出是由时钟控制的(电平控制、边沿控制)制)边沿
17、控制方式一定要用边沿控制方式一定要用always语句描述语句描述电平控制可以使用电平控制可以使用assign语句,也可以使用语句,也可以使用always语语句。但使用句。但使用always语句是要注意在敏感列表里要把语句是要注意在敏感列表里要把时时钟信号钟信号和所有的输入信号都列出来。和所有的输入信号都列出来。6.3 多层次结构电路的设计多层次结构电路的设计本节将介绍怎样进行这种多层次结构电路的设计。本节将介绍怎样进行这种多层次结构电路的设计。多层次结构电路的描述既可以采用纯文本方式,也多层次结构电路的描述既可以采用纯文本方式,也可以用图形和文本输入相结合的方式。可以用图形和文本输入相结合的方
18、式。这里用这里用2个例子来说明这两种设计方式。个例子来说明这两种设计方式。简单的 Verilog HDL 模块例:module trist1(out,in,enable); output out; input in, enable; mytri tri_inst(out,in,enable); endmodule module mytri(out,in,enable); output out; input in, enable; assign out = enable? In : bz; endmodule简单的 Verilog HDL 模块上述程序例子通过另一种方法描述了一个三态门。上述程序
19、例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块:模块在这个例子中存在着两个模块:模块trist1 trist1 调用模块调用模块 mytrimytri 的实例元的实例元件件 tri_insttri_inst。模块模块 trist1 trist1 是上层模块。模块是上层模块。模块 mytrimytri 则被称为子模块。则被称为子模块。通过这种结构性模块构造可构成特大型模块。通过这种结构性模块构造可构成特大型模块。6.3.1 图形与文本混合设计图形与文本混合设计 设计一个设计一个8位累加器位累加器ACC,用于对输入的用于对输入的8位数据位数据进行累加。进行累加。首先进行层次设计。可
20、以把累加器分为两个模块,首先进行层次设计。可以把累加器分为两个模块,一个是一个是8位全加器,一个是位全加器,一个是8位寄存器。位寄存器。全加器负责对不断输入的数据和进位进行累加,寄全加器负责对不断输入的数据和进位进行累加,寄存器负责暂存累加和,并把累加和输出并反馈到累存器负责暂存累加和,并把累加和输出并反馈到累加器输入端,以进行下一次的累加。加器输入端,以进行下一次的累加。在划分好模块后,再把每个模块的端口和连接关系在划分好模块后,再把每个模块的端口和连接关系设计好,就可以分别设计各个功能模块。设计好,就可以分别设计各个功能模块。1、 8位全加器位全加器2、8位寄存器位寄存器3顶层连接顶层连接
21、对对8 8位全加器和位全加器和8 8位寄存器分别进行编译,生成两个位寄存器分别进行编译,生成两个模块符号,再把这两个模块进行连接,加上编人端模块符号,再把这两个模块进行连接,加上编人端和输出端,就构成了完整的累加器电路。如下图所和输出端,就构成了完整的累加器电路。如下图所示。示。累加器顶层电路累加器顶层电路accout6.3.2 纯文本描述纯文本描述 该文本描述与上图电路连接的效果是完全相同的。该文本描述与上图电路连接的效果是完全相同的。需注意是在调用需注意是在调用add8和和reg8这两个模块时,要注意模这两个模块时,要注意模块端口信号的一一对应。块端口信号的一一对应。6.5 数字跑表(以下
22、内容自学)数字跑表(以下内容自学)以数字跑表的设计为例,介绍利用以数字跑表的设计为例,介绍利用Verilog HDL设计数字电路的完整设计数字电路的完整过程。过程。结构与功能结构与功能设计一个数字跑表,该跑表具有复位、暂停、秒表计设计一个数字跑表,该跑表具有复位、暂停、秒表计时等功能。时等功能。按照自上而下的设计思路,首先对数字跑表进行结构按照自上而下的设计思路,首先对数字跑表进行结构和功能的划分。和功能的划分。下图是数字跑表的结构示意图。下图是数字跑表的结构示意图。 该跑表有该跑表有3 3个输入端,分别为时钟输入个输入端,分别为时钟输入(CLK)(CLK)、复位复位(CLR)(CLR)和和启
23、动暂停启动暂停(PAUSE)(PAUSE)。 复位信号高电平有效,可对整个系统异步清复位信号高电平有效,可对整个系统异步清0 0;当启动暂当启动暂停键为低电平时跑表开始计时,为高电平时暂停,变低后在停键为低电平时跑表开始计时,为高电平时暂停,变低后在原来的数值基础上再计数。这两个控制信号的作用如表原来的数值基础上再计数。这两个控制信号的作用如表7.17.1所示。所示。为了便于显示,百分秒、秒和分钟信号皆采用为了便于显示,百分秒、秒和分钟信号皆采用BCDBCD码计数方码计数方式,并直接输出到式,并直接输出到6 6个数码管显示出来。个数码管显示出来。源程序源程序仿真及波形图仿真及波形图下载及验证下
24、载及验证6.6 八位数字频率计八位数字频率计6.6.1 功能要求功能要求 设计一个设计一个8位频率计,可以测量从位频率计,可以测量从1Hz到到 99 999 999Hz的信号频率,并将被测信号的频率的信号频率,并将被测信号的频率在在8个数码管上显示出来。个数码管上显示出来。6.6.2 工作原理工作原理 采用一个标准的基准时钟,在单位时间采用一个标准的基准时钟,在单位时间(如如1s)里对里对被测信号的脉冲数进行计数,即为信号的频率。被测信号的脉冲数进行计数,即为信号的频率。 测频原理测频原理 f = N/t f = N/t 其中:其中:NN脉冲计数值脉冲计数值 t t 计数时间计数时间 由上式得
25、知:由上式得知:频率是在单位时间(频率是在单位时间(1 1秒)内所产生的脉冲个数。秒)内所产生的脉冲个数。频率在数学表达式中用频率在数学表达式中用“f”f”表示,其相应的单位有:表示,其相应的单位有: HzHz(赫)、赫)、kHzkHz(千赫)、千赫)、MHzMHz(兆赫)、兆赫)、 GHzGHz(吉赫)吉赫)其中其中 1GHz=1000MHz1GHz=1000MHz,1MHz=1000kHz1MHz=1000kHz,1kHz=1000Hz1kHz=1000Hz频率计至少包括:频率计至少包括:计数模块(计数电路)计数模块(计数电路)计数时间限定模块(控制电路)计数时间限定模块(控制电路)显示模
26、块(电路)显示模块(电路)8位数字频率计的顶层框图如图721所示,整个系统可分为三个模块:控制模块、计数测量模块和锁存器模块。频率计原理框图频率计原理框图1Hz B C D码七段数码管译码器 控制模块的几个控制信号的时序关系如图控制模块的几个控制信号的时序关系如图7.22所示。从所示。从图中可看出,计数使能信号图中可看出,计数使能信号COUNT_EN在在1s的高电平的高电平后,利用其反相值的上跳沿产生一个锁存信号后,利用其反相值的上跳沿产生一个锁存信号LOAD,随后产生清随后产生清0信号上跳沿信号上跳沿COUNT_CLR 。6.6.3 设计实现设计实现控制模块计数模块32位锁存器被测输入信号基
27、准时钟频率值(输出到数码管显示)1. Fre_ctrl控制模块控制模块 module fre_ctrl(clk,rst,count_en,count_clr,load); output count_en,count_clr,load; input clk,rst; reg count_en,load; always (posedge clk) begin if(rst) begin count_en = 0; load = 1; end else begin count_en = count_en; load = count_en; /load信号的产生信号的产生 end end assign
28、 count_clr = clk&load; / count_clr信号的产生信号的产生 endmodule fre_ctrl控制模块的作用前面已经讲过,它用于产生3个控制信号。此模块用Verilog描述见下例。注意:注意:使用阻塞赋值使用阻塞赋值仿真图仿真图阻塞赋值结果阻塞赋值结果非阻塞赋值结果非阻塞赋值结果2. Count10计数模块计数模块encount_en clrcount_clrclk signal(低四位)clkcout(其余) module count10(out,cout,en,clr,clk); output3:0 out; output cout; input e
29、n,clr,clk; reg3:0 out; always (posedge clk or posedge clr)begin if(clr) out = 0; else if(en) begin if(out = =9) out = 0; else out = out+1; end end assign cout= (out=9)&en)?1:0;/进位信号进位信号 endmodule count10是一个带有计数使能输入端(EN)和异步清0端(CLR)的模为10的计数模块。当EN为高电平时开始计数,为低电平时停止计数。CLR为异步消0端,当它为高电平时,计数器输出为0。3. 32位
30、锁存器模块位锁存器模块latch_32din32位out module latch_32(qo,din,load); output31:0 qo; input31:0 din; input load; reg load; reg31:0 qo; always (posedge load) begin qo = din; end endmodule6.6.4 仿真与下载仿真与下载 将上面将上面8位数字频率计的顶层原理图用位数字频率计的顶层原理图用QuartusII进行编译,并进行功能仿真,如图进行编译,并进行功能仿真,如图7.24所所示是其仿真波形的一部分。从仿真波形图可以看出,改变输入信号的频
31、率,频率计都能准示是其仿真波形的一部分。从仿真波形图可以看出,改变输入信号的频率,频率计都能准确地测出其频率,如图中所示,分别为确地测出其频率,如图中所示,分别为20Hz、17Hz和和8Hz。下载下载 也可将该设计下载到实验板中进行实际验证。器件选择也可将该设计下载到实验板中进行实际验证。器件选择EPF10K10器件,管脚锁定如下:器件,管脚锁定如下: CLK接接clock1,待测的信号待测的信号SIGNAL接接clock0,QOL31.0接接PI047PIO16(即数码管即数码管8、7、6、5、4、3、2、1)。 然后进行编译,生成可下裁的然后进行编译,生成可下裁的.sof文件,将该文件下载
32、到芯片中,文件,将该文件下载到芯片中,实验板模式选择实验板模式选择NO.0,可实际验证该设计。不断变换输入信号可实际验证该设计。不断变换输入信号SIGNAL的频率观察数码管显示的数值与实验板上的频率标称值的频率观察数码管显示的数值与实验板上的频率标称值是否相符。是否相符。 选择数据类型时常犯的错误 在过程块中对变量赋值时,忘了把它定义为寄存器 类型(reg)或已把它定义为连接类型了(wire) 把实例的输出连接出去时,把它定义为寄存器reg类型了 把模块的输入信号定义为寄存器reg类型了。这是经常犯的三个错误!小结小结只有两种主要的信号类型: - 寄存器类型: reg 在always 块中被赋
33、值的信号,往往代表 触发器,但不一定是触发器。 - 连线类型: wire 用 assign 关键词指定的组合逻辑的信号 或连线(也可以是组(也可以是组合逻辑信号)合逻辑信号)aout2BUFFbINVout1dout2AND2i1clkout1D QDFFvariable型变量与nets型变量的根本区别是: variable型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。variable型变量必须通过过程赋值语句赋值!不能通过assign语句赋值!在过程块内被赋值的每个信号必须定义成variable型!注意区分注意区分reg n-1:0 a; /a为为n位寄存器位寄存器reg a n-
34、1:0 ; /a为为n个一位寄存器的存储器个一位寄存器的存储器0n-10n-1n-2地址标量、矢量标量、矢量 标量标量线宽为线宽为1的连线类,或位宽为的连线类,或位宽为1的寄存器类。的寄存器类。如:如:wire a,b; reg c,d,f; 矢量矢量线宽大于线宽大于1的连线类,或位宽大于的连线类,或位宽大于1的寄存器类。的寄存器类。如:如: wire 4:0 a,b; wire 0:3 a; reg 6:0 c,d,f;规定左边为最高位,右边为最低位。规定左边为最高位,右边为最低位。Verilog 与 C 的主要不同点 Verilog 有许多语法规则与 C 语言一致。 但与 C 语言有根本的
35、区别:- 并行性- 块的含义: initial 块 和 always块- 两种赋值语句: 阻塞 赋值 “ = ” 非阻塞赋值 “= ” 注1:“always” 块语句常用于描述时序逻辑,也可描述组合逻辑。 注2:“always” 块可用多种手段来表达逻辑关系,如用if-else语句或case语句。 注3: “always” 块语句与assign语句是并发执行的, assign语句一定要放在“always” 块语句之外!不同抽象级别不同抽象级别的的VerilogVerilog HDL HDL模型模型采用的描述采用的描述级别级别越越高高,设计设计越越容易容易,程序,程序代码代码越越简单简单;但耗用
36、器件资源更多。对特定综合器,可能无法将某但耗用器件资源更多。对特定综合器,可能无法将某些抽象级别高的描述转化为电路!些抽象级别高的描述转化为电路!基于门级描述的硬件模型不仅可以仿真,而且可综合,基于门级描述的硬件模型不仅可以仿真,而且可综合,且系统且系统速度快速度快。所有所有VerilogVerilog HDL HDL编译软件只是支持该语言的一个编译软件只是支持该语言的一个子集子集。尽量采用编译软件支持的语句来描述设计;或多个软尽量采用编译软件支持的语句来描述设计;或多个软件配合使用。件配合使用。一般用一般用算法级算法级(写出逻辑表达式)或(写出逻辑表达式)或RTLRTL级级来描述逻来描述逻辑
37、功能,尽量避免用门级描述,除非对系统速度要求辑功能,尽量避免用门级描述,除非对系统速度要求比较高的场合才采用门级描述。比较高的场合才采用门级描述。 不同抽象级别不同抽象级别的的VerilogVerilog HDL HDL模型模型(1 1)采用什么描述级别更合适?)采用什么描述级别更合适?系统级描述太抽象,有时无法综合成具体的物理系统级描述太抽象,有时无法综合成具体的物理电路;门级描述要求根据逻辑功能画出逻辑电路电路;门级描述要求根据逻辑功能画出逻辑电路图,对于复杂的数字系统很难做到;图,对于复杂的数字系统很难做到;而算法级和而算法级和RTLRTL级描述级别适中,代码不是很复级描述级别适中,代码
38、不是很复杂,且一般容易综合成具体的物理电路,故建议杂,且一般容易综合成具体的物理电路,故建议尽量采用算法级和尽量采用算法级和RTLRTL级级来描述。来描述。(2 2)怎样减少器件逻辑资源的耗用?)怎样减少器件逻辑资源的耗用?当器件容量有限时,为减少器件逻辑资源的耗用,当器件容量有限时,为减少器件逻辑资源的耗用,建议少用建议少用if-elseif-else语句和语句和casecase语句,尽量直接使用逻语句,尽量直接使用逻辑表达式来描述系统的逻辑功能;辑表达式来描述系统的逻辑功能;或者用或者用casecase语句取代语句取代if-elseif-else语句。语句。设计技巧设计技巧建议:建议:(1
39、 1)在进行设计前,一定要仔细分析并熟悉所)在进行设计前,一定要仔细分析并熟悉所需设计电路或系统的整个工作过程;合理划分需设计电路或系统的整个工作过程;合理划分功能模块;并弄清每个模块输入和输出间的逻功能模块;并弄清每个模块输入和输出间的逻辑关系!辑关系!(2 2)在调试过程中,仔细阅读并理解错误信息)在调试过程中,仔细阅读并理解错误信息,随时查阅教材和课件上有关语法,纠正语法,随时查阅教材和课件上有关语法,纠正语法错误。错误。设计技巧设计技巧1 1一个变量不能在多个一个变量不能在多个alwaysalways块中被赋值!块中被赋值! 这个问题一定要注意!否则编译不能通过。这个问题一定要注意!否
40、则编译不能通过。例例 带异步清零、异步置位的D触发器注注:当某个变量有多个触发:当某个变量有多个触发条件时,最好将它们放在一条件时,最好将它们放在一个个alwaysalways块中,并用块中,并用if-elseif-else语句描述在不同触发条件下语句描述在不同触发条件下应执行的操作!应执行的操作!正确正确的写法的写法设计技巧设计技巧错误错误的写法的写法注注:这里:这里q q和和qnqn在两个在两个alwaysalways块中都被赋值!块中都被赋值!因为因为alwaysalways块之间是并块之间是并行操作,造成某些语句行操作,造成某些语句可能是互相矛盾的,所可能是互相矛盾的,所以编译器无所适
41、从,只以编译器无所适从,只能报错!能报错!设计技巧设计技巧2 2在在alwaysalways块语句中,当敏感信号为两个以上的时钟边沿触发块语句中,当敏感信号为两个以上的时钟边沿触发信号时,应注意不要使用多个信号时,应注意不要使用多个if if语句!以免因逻辑关系描述不语句!以免因逻辑关系描述不清晰而导致编译错误。清晰而导致编译错误。 例例 在数码管扫描显示电路中,设计一个中间变量,将脉冲信号start转变为电平信号enable 。always(posedge start or posedge reset) if (reset) enable =0; if (start) enable=1; 编
42、译后出现了多条警告信息,指明在语句编译后出现了多条警告信息,指明在语句always (posedge start or posedge reset)中,变量中,变量enable不能不能被分配新的值!被分配新的值!错误错误的写法的写法设计技巧设计技巧其仿真波形如下:其仿真波形如下: 注注:由于在最初一段,:由于在最初一段,startstart和和resetreset均为均为0 0,导,导致致enableenable为不定态,则为不定态,则scan_datascan_data开始加开始加1 1计数计数(正确情况应是在按下(正确情况应是在按下startstart时时scan_datascan_dat
43、a才开才开始 加始 加 1 1计 数,因为此时计 数,因为此时 re s e t = 0re s e t = 0 , 导 致, 导 致enable=1enable=1。当。当startstart和和resetreset同时为同时为1 1时,时, enable为为0。)设计技巧设计技巧 语句语句“else enable=1;”隐含了隐含了reset无效、且无效、且start有效的意思,有效的意思,因此与因此与else if(start) enable=1;效果一样!效果一样! 正确的仿真波形如下:正确的仿真波形如下: always(posedge start or posedge reset)
44、if (reset) enable =0; else enable=1;注注:可见在最初一段,当可见在最初一段,当start和和reset均为均为0时,时,enable被认为初值为被认为初值为0,则,则scan_data不计数,保持初值为不计数,保持初值为0;一旦;一旦start有效时,则有效时,则scan_data才开始加才开始加1计数。当计数。当start和和reset同时为同时为1时,先执行的是时,先执行的是“if (reset) enable =0; ” ”,故,故enable仍为仍为0,则,则scan_data保持原值保持原值0。 正确正确的写法的写法设计技巧设计技巧3 3当输出信号
45、为总线信号时,一定要在当输出信号为总线信号时,一定要在I/OI/O说明中指明其位宽!否则说明中指明其位宽!否则在生成逻辑符号时,输出信号被误认为是单个信号,而没有标明位在生成逻辑符号时,输出信号被误认为是单个信号,而没有标明位宽,就不会当成总线信号。宽,就不会当成总线信号。 例例 声明一个位宽为5的输出信号run_cnt,其类型为reg型变量。错误错误的写法的写法output run_cnt;reg4:0run_cnt;正确正确的写法的写法output4:0 run_cnt; /这里一定要指明位宽!这里一定要指明位宽! reg4:0run_cnt;3.13 3.13 设计技巧设计技巧4 4当要
46、用到计数器时,一定要根据计数最大值事先当要用到计数器时,一定要根据计数最大值事先计算好所需的位宽!若位宽不够,则计数器不能计计算好所需的位宽!若位宽不够,则计数器不能计到你设定的最大值,当该计数器用作分频时,则输到你设定的最大值,当该计数器用作分频时,则输出时钟始终为出时钟始终为0 0,所设计电路将不能按预定功能正,所设计电路将不能按预定功能正常工作!常工作! 例例如某同学在做乐曲演奏电路实验时,对乐曲演奏子模块的仿真完全正确,high3:0、mid3:0、low3:0都有输出,但下载时音名显示数码管始终为000。这主要是因为他在分频子模块中clk_4Hz的分频用计数器count_4位宽设置不
47、够,则clk_4Hz输出为0,故音名显示计数器high3:0、mid3:0、low3:0输出始终为0,电路不能正常工作。 设计技巧设计技巧module f20MHz_to_6MHz_4Hz(clkin,clr,clk_6M,clk_4); input clkin,clr; outputclk_6M,clk_4; regclk_6M,clk_4; reg2:0count_6M; reg15:0count_4; parametercount_6M_width=3; parametercount_4_width=5000000; always(posedge clkin or posedge clr
48、) beginif(clr) begin count_4=0;clk_4=0; endelse begin if(count_4=count_4_width-1) /此条件不可能满足!此条件不可能满足! begin count_4=0; clk_4=1; end else begin count_4=count_4+1; clk_4=0; end end endendmodule223=8388608,故计数器位宽故计数器位宽应为应为23,应写为,应写为22:0 。若写。若写成成15:0,216=65536,则则clk_4一直为一直为0,则下载后数码管显,则下载后数码管显示一直为示一直为0,扬
49、声器一直是一,扬声器一直是一个音调个音调错误错误的写法的写法设计技巧设计技巧5 5注意程序书写规范:语句应注意缩进注意程序书写规范:语句应注意缩进,if-elseif-else语句注意对齐,应添加必要的语句注意对齐,应添加必要的注释!注释!6 6注意区分阻塞赋值和非阻塞赋值的区注意区分阻塞赋值和非阻塞赋值的区别。别。在一个源程序中,要么都采用阻塞赋值在一个源程序中,要么都采用阻塞赋值语句,要么都采用非阻塞赋值语句,最语句,要么都采用非阻塞赋值语句,最好不要混合使用,否则可能逻辑关系出好不要混合使用,否则可能逻辑关系出错!错!为易于综合,建议均采用非阻塞赋值语为易于综合,建议均采用非阻塞赋值语句
50、!句!作业作业实实 验验 实验五(一)实验五(一) 7段段BCD码译码器设计码译码器设计(1)实验目的:)实验目的:通过设计通过设计7 7段段BCDBCD码译码器学习码译码器学习组合组合电路的设电路的设计方法。计方法。(2)实验原理:)实验原理:7段数码是纯组合电路,通常的小规模专用段数码是纯组合电路,通常的小规模专用IC,如,如74或或4000系列的器件只能作十进制系列的器件只能作十进制BCD码译码,然而数码译码,然而数字系统中的数据处理和运算都是字系统中的数据处理和运算都是2进制的,所以输出表达都是进制的,所以输出表达都是16进制的,为了满足进制的,为了满足16进制数的译码显示,最方便的方
51、法就是利进制数的译码显示,最方便的方法就是利用译码程序在用译码程序在FPGA/CPLD中来实现。下面作为中来实现。下面作为7段段BCD码译码码译码器,输出信号器,输出信号LED7S的的7位分别接如图位分别接如图6-21数码管的数码管的7个段,高个段,高位在左,低位在右。例如当位在左,低位在右。例如当LED7S输出为输出为“1101101”时,数码时,数码管的管的7个段:个段:g、f、e、d、c、b、a分别接分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示;接有高电平的段发亮,于是数码管显示“5”。实实 验验 实验五(一)实验五(一) 7段数码显示译码器设计段数码显示译码器设
52、计图图6-21 共阴数码管及其电路共阴数码管及其电路(3)实验内容)实验内容1:说明下面的代码中各语句的含义,以及该例的整体功能。说明下面的代码中各语句的含义,以及该例的整体功能。在在QuartusII上对下例进行编辑、编译、综合、适配、仿真,给出其所有信号上对下例进行编辑、编译、综合、适配、仿真,给出其所有信号的时序仿真波形(提示:用输入总线的方式给出输入信号仿真数据)。的时序仿真波形(提示:用输入总线的方式给出输入信号仿真数据)。 实验内容实验内容2:把程序改成显示十六进制后重复上述过程。把程序改成显示十六进制后重复上述过程。代码代码(十进制显示十进制显示) module decode(a
53、,b,c,d,e,f,g,D3,D2,D1,D0);module decode(a,b,c,d,e,f,g,D3,D2,D1,D0); output a,b,c,d,e,f,g;output a,b,c,d,e,f,g; input D3,D2,D1,D0;input D3,D2,D1,D0; regreg a,b,c,d,e,f,g; a,b,c,d,e,f,g; always (D3,D2,D1,D0) always (D3,D2,D1,D0) begin begin case(D3,D2,D1,D0) case(D3,D2,D1,D0) 4d0:g,f,e,d,c,b,a=7b0111111; 4d0:g,f,e,d,c,b,a=7b0111111; 4d1:g,f,e,d,c,b,a=7b0000110; 4d1:g,f,e,d,c,b,a=7b0000110; 4d2:g,f,e,d,c,b,a=7b1011011; 4d2:g,f,e,d,c,b,a=7b1011011; 4d3:g,f,e,d,c,b,a=7b1001111; 4d3:g,f,e,d,c,b,a=7b1001111; 4d4:g,f,e,d,c,b,a=7b1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年浙江省舟山市初中历史九年级期末上册提升难点突破题(附答案)
- PCN生产变更通知考核试题(含详细答案解析)
- 烧烤店炭火使用安全及防中毒方案
- 2026年麻醉科麻醉并发症处理流程规范考核试题及答案解析
- PCDS(持续性躯体症状障碍)专项试题及详细答案解析
- OTG技术实操考核试题(含详细答案)
- OpenGL程序设计期末试题(含详细答案)
- 检查井砌块砌筑及井盖安装方案
- 婴幼儿生理特点与卫生保健试题及答案
- 江苏省扬州市江都实验中学2027届数学七上期末达标检测模拟试题含解析
- 购买救护车合同范本
- 关于进一步完善中小学岗位设置管理的指导意见
- 康复运动疗法技术
- 医院培训课件:《急性胸痛早期识别处置转运》
- 特种作业操作证(低压电工)
- 义务教育地理课程标准(2011-年版)
- 吉林大学《大学英语BI》2021-2022学年第一学期期末试卷
- 秋冬季老年人防病保健
- 加油站消防安全检查总结
- 履带吊安拆施工方案交底
- TSG+23-2021气瓶安全技术规程
评论
0/150
提交评论