FPGA原理与应用 课件 第六章 FPGA应用实例_第1页
FPGA原理与应用 课件 第六章 FPGA应用实例_第2页
FPGA原理与应用 课件 第六章 FPGA应用实例_第3页
FPGA原理与应用 课件 第六章 FPGA应用实例_第4页
FPGA原理与应用 课件 第六章 FPGA应用实例_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

第六章:FPGA应用实例

目录6.1分路器

6.5PWM发生器

6.3数字滤波器

6.4有限状态机

6.6数字分频器

6.8BCD与二进制转换

6.2加法器

6.7多路选择器

6.9数码管显示

6.10VGA驱动Part6.1分路器6.1.1模块简介分路器分路器可以将无线通信系统中线路上输入的多种频段信号分离为单一的频段输出到不同的通信线路中。在通信领域中,分路器是用来使电话通道与数据通道分离的装置。6.1.2原理图分路器图6-1分路器原理图6.1.3仿真图分路器图6-2分路器仿真图6.1.4模块代码分路器模块代码moduledemux1to4(inputwire[1:0]sel,//选择信号inputwirein,//输入信号outputreg[3:0]out//4路输出信号);//在每个时钟周期,根据选择信号sel选择输出路always@(*)begincase(sel)2'b00:out=4'b0001;//sel为00时,out[0]为输入信号2'b01:out=4'b0010;//sel为01时,out[1]为输入信号2'b10:out=4'b0100;//sel为10时,out[2]为输入信号2'b11:out=4'b1000;//sel为11时,out[3]为输入信号default:out=4'b0000;//默认输出为0endcase//将输入信号in赋值给选中的输出信号out=out&{4{in}};endendmodule6.1.5仿真代码分路器仿真代码//施加测试向量#10in=1'b1;sel=2'b00;//输入信号1,选择0#10in=1'b1;sel=2'b01;//输入信号1,选择1#10in=1'b1;sel=2'b10;//输入信号1,选择2#10in=1'b1;sel=2'b11;//输入信号1,选择3#10in=1'b0;sel=2'b00;//输入信号0,选择0#10in=1'b0;sel=2'b01;//输入信号0,选择1#10in=1'b0;sel=2'b10;//输入信号0,选择2#10in=1'b0;sel=2'b11;//输入信号0,选择3#10$finish;//仿真结束endendmodule//分路器模块仿真测试`timescale1ns/1psmoduledemux1to4_tb;//信号声明reg[1:0]sel;regin;wire[3:0]out;//实例化被测试模块demux1to4uut(.sel(sel),.in(in),.out(out));//初始化信号initialbegin//初始化输入信号sel=2'b00;in=1'b0;6.1.6结果分析仿真波形观察(1)时钟信号(clk):本仿真中无时钟信号,但所有输入信号和选择信号在每个10ns周期改变一次。(2)选择信号(sel):选择信号sel依次为00、01、10、11,确保每路输出都被选择一次。(3)输入信号(in):输入信号依次为1、0,以验证输入信号在不同选择信号下的输出效果。(4)输出信号(out):输出信号根据选择信号sel和输入信号in进行变化。Part6.2加法器6.2.1模块简介加法器加法器是一种常见的电子数字逻辑电路,用于对数字信号进行加法运算。它可以将两个或多个数字信号相加,并输出它们的和。在计算机和其他数字系统中,加法器是一种基本的逻辑单元,其工作原理对于理解数字电路和计算机原理至关重要。加法器的基本原理是利用逻辑门来实现数字信号的加法运算。在数字电路中,最常用的加法器是全加器,它可以对两个输入信号进行加法运算,并输出它们的和以及进位信号。全加器通常由XOR门、AND门和OR门组成,通过这些逻辑门的组合,可以实现数字信号的加法运算。6.2.2原理图加法器图6-3加法器原理图6.2.3仿真图加法器图6-4加法器仿真图6.2.4模块代码加法器模块代码moduleadder_4bit(inputwire[3:0]A,//4位输入Ainputwire[3:0]B,//4位输入BinputwireCin,//进位输入outputwire[3:0]Sum,//4位和outputwireCout//进位输出);assign{Cout,Sum}=A+B+Cin;//加法操作endmodule6.2.5仿真代码加法器仿真代码Vivado对加法器模块进行仿真的代码如下:`timescale1ns/1psmoduleadder_4bit_tb;//信号声明reg[3:0]A;reg[3:0]B;regCin;wire[3:0]Sum;wireCout;//实例化被测试模块adder_4bituut(.A(A),.B(B),.Cin(Cin),.Sum(Sum),.Cout(Cout));//初始化信号initialbegin//初始化输入信号A=4'b0000;B=4'b0000;Cin=1'b0;//施加测试向量#10A=4'b0001;B=4'b0010;Cin=1'b0;//1+2+0=3#10A=4'b0101;B=4'b0011;Cin=1'b1;//5+3+1=9#10A=4'b1111;B=4'b0001;Cin=1'b1;//15+1+1=17(withcarry)#10A=4'b1000;B=4'b0111;Cin=1'b0;//8+7+0=15#10A=4'b0110;B=4'b0010;Cin=1'b1;//6+2+1=9#10A=4'b1010;B=4'b1100;Cin=1'b0;//10+12+0=22(withcarry)#10$finish;//仿真结束endendmodule6.2.6结果分析仿真波形观察(1)输入信号(A、B、Cin):在不同的时间点,施加了不同的输入信号组合。(2)输出信号(Sum、Cout):输出信号根据输入信号的和及进位计算得出。Part6.3数字滤波器6.3.1模块简介数字滤波器数字滤波器是一个离散时间系统,通常按照预定的算法,将输入的离散时间信号或数字信号转化为所要求的离散时间或数值信号,相对于模拟滤波器而言,数字滤波器具有精度高、可靠性高、灵活性好、可程序控制调试的优点。根据冲激响应的时域特性,数字滤波器可分为无限长冲激响应滤波器(IIR)和有限长冲激响应滤波器(FIR)。IIR滤波器全称是InfiniteImpulseRespondFilter,中文全称是无限脉冲响应滤波器,它也叫做递归型滤波器。FIR滤波器的全称是FiniteImpulseRespondFilter,中文全称是有限脉冲响应滤波器,它也叫做非递归型滤波器。6.3.2原理图数字滤波器图6-5数字滤波器原理图6.3.3仿真图数字滤波器图6-6数字滤波器仿真图6.3.4模块代码数字滤波器模块代码//移动延时线的值delay_line[4]<=delay_line[3];delay_line[3]<=delay_line[2];delay_line[2]<=delay_line[1];delay_line[1]<=delay_line[0];delay_line[0]<=in;out<=(delay_line[0]*COEFF0+delay_line[1]*COEFF1+delay_line[2]*COEFF2+delay_line[3]*COEFF3+delay_line[4]*COEFF4)>>>16;endendendmoduleFIR滤波器模块VerilogHDL代码如下:modulefir_filter(inputclk,//时钟信号inputrst_n,//复位信号,低电平有效inputsigned[15:0]in,//输入信号outputregsigned[15:0]out//输出信号);//系数定义parametersigned[15:0]COEFF0=16'h0A3D;//系数0parametersigned[15:0]COEFF1=16'h1C72;//系数1parametersigned[15:0]COEFF2=16'h2D93;//系数2parametersigned[15:0]COEFF3=16'h1C72;//系数3parametersigned[15:0]COEFF4=16'h0A3D;//系数4//寄存器定义,用于存储输入信号的历史值regsigned[15:0]delay_line[0:4];//延时线//FIR滤波器的实现always@(posedgeclkornegedgerst_n)beginif(!rst_n)begin//复位时,延时线的所有值都清零delay_line[0]<=16'b0;delay_line[1]<=16'b0;delay_line[2]<=16'b0;delay_line[3]<=16'b0;delay_line[4]<=16'b0;out<=16'b0;endelsebegin6.3.5仿真代码数字滤波器仿真代码QuartusPrime仿真代码如下:`timescale1ns/1psmodulefir_filter_tb;regclk;//时钟信号regrst_n;//复位信号,低电平有效regsigned[15:0]in;//输入信号wiresigned[15:0]out;//输出信号//实例化FIR滤波器模块fir_filteruut(.clk(clk),.rst_n(rst_n),.in(in),.out(out));//时钟生成initialbeginclk=0;forever#5clk=~clk;//时钟周期为10ns,每5ns翻转一次end//测试输入initialbegin//初始化rst_n=0;//复位信号低电平,触发复位in=0;//输入信号低电平#15;//等待15nsrst_n=1;//复位信号高电平,取消复位

//输入测试信号#10in=16'h1000;//输入信号#20in=16'h2000;//输入信号#20in=16'h3000;//输入信号#20in=16'h4000;//输入信号#20in=16'h5000;//输入信号#20in=16'h0000;//输入信号//结束仿真#100$stop;//在结束时停止仿真endendmodule6.3.6结果分析仿真波形观察1.时钟信号(clk):时钟信号应按周期翻转,周期为10ns,每5ns翻转一次。2.复位信号(rst_n):初始状态为低电平,保持15ns后变为高电平。当复位信号为低时,所有寄存器和输出应该被清零。3.输入信号(in):输入信号依次为0x1000、0x2000、0x3000、0x4000、0x5000。输入信号的变化间隔为20ns。4.输出信号(out):输出信号根据FIR滤波器的系数和输入信号的历史值进行计算。Part6.4有限状态机6.4.1模块简介有限状态机有限状态机(FSM,FiniteStateMachine)又称有限自动状态机,是一种用于设计逻辑电路的数学模型,广泛应用于硬件设计、软件开发和控制系统中。它拥有有限数量的状态,每个状态可以切换到零至多个状态,每个状态代表不同的意义。有限状态机可以表示为一个有向图,包括一组状态、一组输入和一组输出,以及状态之间的转换规则。FSM的核心思想是系统在任意时间点只能处于一种状态,根据输入信号和当前状态决定下一个状态和输出。6.4.2原理图有限状态机图6-7有限状态机原理图6.4.3仿真图有限状态机图6-8有限状态机仿真图6.4.4模块代码有限状态机模块代码有限状态机(FSM)模块VerilogHDL代码如下:modulefsm_example(inputclk,//时钟信号inputrst_n,//复位信号,低电平有效inputin,//输入信号outputregout//输出信号);//状态定义localparamSTATE_IDLE=2'b00;//空闲状态localparamSTATE_ACTIVE=2'b01;//活动状态//当前状态和下一个状态reg[1:0]current_state,next_state;//状态转换逻辑always@(posedgeclkornegedgerst_n)beginif(!rst_n)current_state<=STATE_IDLE;//复位到初始状态elsecurrent_state<=next_state;//更新当前状态end//状态转换和输出逻辑always@(*)begin//默认输出和状态next_state=current_state;out=1'b0;case(current_state)STATE_IDLE:beginif(in)next_state=STATE_ACTIVE;//输入高电平时,切换到活动状态endSTATE_ACTIVE:beginout=1'b1;//在活动状态时,输出高电平if(!in)next_state=STATE_IDLE;//输入低电平时,切换回空闲状态enddefault:beginnext_state=STATE_IDLE;//默认状态为空闲状态endendcaseendendmodule6.4.5仿真代码有限状态机仿真代码QuartusPrime仿真代码如下:`timescale1ns/1psmodulefsm_example_tb;regclk;//时钟信号regrst_n;//复位信号,低电平有效regin;//输入信号wireout;//输出信号//实例化FSM模块fsm_exampleuut(.clk(clk),.rst_n(rst_n),.in(in),.out(out));//时钟生成initialbeginclk=0;forever#5clk=~clk;//时钟周期为10nsend//测试输入initialbegin//初始化rst_n=0;//复位信号低电平in=0;//输入信号低电平#15;rst_n=1;//复位信号高电平//测试输入序列#10in=1;//输入信号高电平,切换到活动状态#20in=0;//输入信号低电平,切换回空闲状态#30in=1;//输入信号高电平,切换到活动状态#40in=0;//输入信号低电平,切换回空闲状态//结束仿真#50$stop;endendmodule6.4.6结果分析仿真波形观察1.初始复位阶段:在rst_n为低电平时,FSM初始化到STATE_IDLE状态,输出out为低电平。复位信号rst_n在15ns时变为高电平,FSM开始根据输入信号进行状态转换。2.状态转换:在20ns时,输入信号in变为高电平,FSM从STATE_IDLE转换到STATE_ACTIVE,输出out变为高电平。在40ns时,输入信号in变为低电平,FSM从STATE_ACTIVE转换回STATE_IDLE,输出out变为低电平。在70ns时,输入信号in再次变为高电平,FSM从STATE_IDLE转换到STATE_ACTIVE,输出out变为高电平。在100ns时,输入信号in再次变为低电平,FSM从STATE_ACTIVE转换回STATE_IDLE,输出out变为低电平。Part6.5PWM发生器6.5.1模块简介PWM发生器PWM(PulseWidthModulation)控制—脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。原理基础是面积等效原理。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。6.5.2原理图PWM发生器图6-9PWM原理图6.5.3仿真图PWM发生器图6-10PWM仿真图6.5.4模块代码PWM发生器模块代码PWM生成器模块VerilogHDL代码如下://PWM发生器模块modulepwm_generator#(parameterWIDTH=8//占空比位宽)(inputclk,//时钟信号inputrst_n,//复位信号,低电平有效input[WIDTH-1:0]duty_cycle,//占空比,范围0到255outputpwm_out//PWM输出信号);//计数器寄存器reg[WIDTH-1:0]counter;always@(posedgeclkornegedgerst_n)beginif(!rst_n)counter<=0;//复位计数器elsecounter<=counter+1;//计数器加1end//生成PWM信号assignpwm_out=(counter<duty_cycle)?1'b1:1'b0;endmodule6.5.5仿真代码PWM发生器仿真代码QuartusPrime仿真代码如下:`timescale1ns/1psmodulepwm_generator_tb;regclk;regrst_n;reg[7:0]duty_cycle;wirepwm_out;//实例化PWM发生器模块pwm_generator#(.WIDTH(8))uut(.clk(clk),.rst_n(rst_n),.duty_cycle(duty_cycle),.pwm_out(pwm_out));//时钟生成initialbeginclk=0;forever#5clk=~clk;//时钟周期为10nsend//测试输入initialbegin//初始化rst_n=0;duty_cycle=0;#15;rst_n=1;//应用测试占空比#10duty_cycle=8'd64;//25%占空比#100duty_cycle=8'd128;//50%占空比#100duty_cycle=8'd192;//75%占空比#100duty_cycle=8'd255;//100%占空比//等待一段时间以观察输出#200;//结束仿真$stop;endendmodule6.5.6结果分析仿真波形观察1.初始复位阶段:复位信号rst_n在开始时为低电平,PWM输出信号pwm_out应该为0。复位信号rst_n在15ns时变为高电平,计数器counter开始计数。2.通过仿真波形可以验证PWM发生器的功能:在不同占空比设置下,pwm_out信号的高低电平时长与期望一致。占空比从0%到100%之间变化时,输出波形发生相应变化,验证了PWM信号生成的正确性。Part6.6数字分频器6.6.1模块简介数字分频器数字分频器就是将给定的某个频率的输入信号进行分频,最后得到需要的信号频率。利用计数的方法可以达到分频目的,具体做法是将输入周期信号作为计数脉冲,通过循环计数的方法控制输出信号的周期,从而达到分频的目的。6.6.2原理图数字分频器图6-11数字分频器原理图6.6.3仿真图数字分频器图6-12数字分频器仿真图(HW=3LW=2)图6-13数字分频器仿真图(HW=2LW=3)6.6.4模块代码数字分频器模块代码数字分频器模块VerilogHDL代码如下:modulediv_clk( clk, rst, clk_out );

parameterHW=3;//分频输出时钟高电平宽度为3个输入时钟周期parameterLW=2; //分频输出时钟低电平宽度为2个输入时钟周

inputclk,rst; //输入时钟,复位信号outputregclk_out; //分频输出时钟reg[31:0]count; //分频控制计数器regstate; //状态寄存器always@(posedgeclkornegedgerst)begin if(!rst) //异步复位 begin clk_out<=1'b0; count<=0; state<=0; endelse case(state) 0:if(count<LW-1) //时钟低电平宽度控制 begin count<=count+1; state<=0; end elsebegin //当计数值等于LW时状态转移,同时输出反转count<=0;clk_out<=1;state<=1; end1:if(count<HW-1) //时钟高电平宽度控制 begin count<=count+1; state<=1; end else begin //当计数值等于HW时状态转移,同时输出反转 count<=0; clk_out<=0; state<=0; end default:state<=0;

endcaseendendmodule6.6.5仿真代码数字分频器仿真代码QuartusPrime仿真代码如下:`timescale1ns/1psmodulediv_clk_tb;regclk; //时钟激励信号regrst; //复位激励信号wireclk_out; //分频时钟输出initialbegin //初始化激励信号 clk=0; rst=0; #50rst=1; endalways#10clk=~clk; //产生50MHz时钟信号,每过10ns电平反div_clki1(.clk(clk),//将激励信号与分频器模块端口相连(实例化).rst(rst),.clk_out(clk_out));

endmodule6.6.6结果分析仿真波形观察由图6-12可知,参数HW=3,LW=2的分频器符合设计要求。为了进一步验证,将模块代码中parameterHW改为2,LW改为3。模块参数值修改即可,测试平台代码保持不变。修改后模块仿真结果如图6-13所示。Part6.7多路选择器6.7.1模块简介多路选择器多路选择器是一种数据选择器,在多路信号传输过程中可以通过多路选择器选择出某几路需要传输的信号。以4选1多路选择器为例,其结构如下图所示,通过地址选择端口A1、A2,选择输入D0、D1、D2、D3四路信号中的一路作为输出信号Y。6.7.2原理图四选一数据选择器图6-14四选一数据选择器原理图6.7.3仿真图四选一数据选择器图6-15四选一数据选择器仿真图6.7.4模块代码多路选择器模块代码四选一数据选择器模块VerilogHDL代码如下:modulemultiplexer( data_a, data_b, data_c, data_d, out_addr, data_out );input[3:0]data_a,data_b,data_c,data_d;//定义输入端口为input类型且数据位宽为4位input[1:0]out_addr; //定义地址选择端口为input类型且数据位宽为2位outputreg[3:0]data_out; //定义输出端口为outputreg类型且数据位宽为4位always@(*) //当输入数据改变时,总是执行always块中语句。begin case(out_addr)//判断out_addr的值,选择对应的输入端口作为输出。

2'b00:data_out=data_a; 2'b01:data_out=data_b; 2'b10:data_out=data_c; 2'b11:data_out=data_d; endcaseendendmodule6.7.5仿真代码多路选择器仿真代码四选一数据选择器模块的仿真测试代码如下:`timescale

1ns/1ps

//

仿真时间单位为ns,

精度为psmodule

multiplexer_tb;

//

测试模块名reg

[3:0]

data_a,

data_b,

data_c,

data_d;

//

仿真激励数据,4位数据输入信号reg

[1:0]

out_addr;

//

仿真激励数据,2位地址选择信号wire

[3:0]

data_out;

//

仿真输出initial

begin

//

对激励信号进行初始化赋值

data_a

=

4'b0000;

//

初始输入数据端口信号均为0000

data_b

=

4'b0000;

data_c

=

4'b0000;

data_d

=

4'b0000;

out_addr

=

2'bxx;

//

初始化为未定义状态(可以是

00

或其他你期望的状态)

#50

//

延迟50ns后

四路输入数据信号改变

data_a

=

4'b0001;

data_b

=

4'b0010;

data_c

=

4'b0100;

data_d

=

4'b1000;

#50

out_addr

=

2'b00;

//

延迟50ns后

地址选择信号变为00

#100

out_addr

=

2'b01;

//

延迟100ns后

地址选择信号变为01

#50

//

延迟50ns后

四路输入数据信号改变data_a

=

4'b1110;

data_b

=

4'b1101;

data_c

=

4'b1011;

data_d

=

4'b0111;

#50

out_addr

=

2'b10;

//

延迟50ns后

地址选择信号变为10

#100

out_addr

=

2'b11;

//

延迟100ns后

地址选择信号变为11

#200

$stop;

//

延迟200ns后

停止仿真end//

将模块端口与测试平台实例化multiplexer

i1(

.data_a(data_a),

.data_b(data_b),

.data_c(data_c),

.data_d(data_d),

.out_addr(out_addr),

.data_out(data_out));endmodule6.7.6结果分析仿真波形观察由图6-15可知,当地址选择信号out_addr为00时,模块输出数据为data_out=data_a;当地址选择信号out_addr为01时,模块输出数据为data_out=data_b;当地址选择信号out_addr为10时,模块输出数据为data_out=data_c;当地址选择信号out_addr为11时,模块输出数据为data_out=data_d。同时,无论地址选择信号还是输入数据信号发生改变,都会刷新输出数据信号。仿真波形表明,该四选一数据选择器模块能够满足设计要求。Part6.8BCD与二进制转换6.8.1模块简介BCD与二进制转换二进制转BCD:以十进制数123为例说明,其二进制表示为‘1111011’,而BCD码需要12位(3×4位)。将二进制转换为BCD形式,可以按照由高位向低位逐位转换,最高位为百位,而百位数字可以通过除以100取整得到,即123/100取整得1;十位数字可以通过除以10取整后除以10求余得到,即(123/10)取整为12,12%10得2;个位数字可以直接除以10求余得到,即123%10得3。BCD转二进制:BCD转二进制上述过程的逆过程,123的BCD表示形式为‘000100100011’,123=1*100+2*10+3,这样123的二进制形式可以直接表示为Bin=4’b0001*100+4’b0010*10+4’b0011,Bin=1100100+10100+11,Bin最后为1111011。6.8.2原理图BCD与二进制转换图6-16二进制转BCD原理图图6-17BCD转二进制原理图6.8.3仿真图BCD与二进制转换图6-18二进制转BCD仿真图图6-19BCD转二进制仿真图6.8.4模块代码BCD与二进制转换模块代码二进制转BCD模块代码:moduleBIN2BCD(BIN_IN,BCD_OUT);input[15:0]BIN_IN; //输入为16位二进制数output[15:0]BCD_OUT; //输出为16位BCD码

assignBCD_OUT[15:12]=BIN_IN/1000; //千位assignBCD_OUT[11:8]=(BIN_IN/100)%10; //百位assignBCD_OUT[7:4]=(BIN_IN/10)%10; //十位assignBCD_OUT[3:0]=BIN_IN%10; //个位endmoduleBCD转二进制模块代码:moduleBCD2BIN(BCD_IN1,BCD_IN2,BIN_OUT1,BIN_OUT2);input[15:0]BCD_IN1,BCD_IN2; //定义两个16位BCD输入端口output[15:0]BIN_OUT1,BIN_OUT2; //对应的两个16位二进制数输出端口assignBIN_OUT1[15:0]=BCD_IN1[15:12]*1000+BCD_IN1[11:8]*100+BCD_IN1[7:4]*10+BCD_IN1[3:0];assignBIN_OUT2[15:0]=BCD_IN2[15:12]*1000+BCD_IN2[11:8]*100+BCD_IN2[7:4]*10+BCD_IN2[3:0];endmodule6.8.5仿真代码BCD与二进制转换仿真代码二进制转BCD模块测试平台代码如下:`timescale1ns/1ps //时间单位1ns,精度1psmoduleBIN2BCD_tb;reg[15:0]BIN_IN; //激励信号wire[15:0]BCD_OUT; //输出initial //初始化激励begin #5 BIN_IN=16'b0000000001111011; //123 #10 BIN_IN=16'b0000010011010010; //1234 #10 BIN_IN=16'b0010011010010100; //9876 #10$finish; //仿真结束endBIN2BCDi1( //实例化端口 .BIN_IN(BIN_IN), .BCD_OUT(BCD_OUT));endmoduleBCD转二进制模块测试平台代码如下:`timescale1ns/1ps//时间单位为1ns,精度为1psmoduleBCD2BIN_tb;reg[15:0]BCD_IN1,BCD_IN2;wire[15:0]BIN_OUT1,BIN_OUT2;initialbegin#5BCD_IN1=16'h0123;//输入值为BCD码0123BCD_IN2=16'h3210;//输入值为BCD码3210#10BCD_IN1=16'h1234;//输入值为BCD码1234BCD_IN2=16'h4321;//输入值为BCD码4321#10BCD_IN1=16'h9876;//输入值为BCD码9876BCD_IN2=16'h6789;//输入值为BCD码6789#10$finish;//完成仿真endBCD2BINi1(.BCD_IN1(BCD_IN1),.BCD_IN2(BCD_IN2),.BIN_OUT1(BIN_OUT1),.BIN_OUT2(BIN_OUT2));endmodule6.8.6结果分析仿真波形观察二进制转BCD仿真结果如图6-18所示。其中BIN和BCD都采用二进制和十进制两种表示形式,由图可知123,1234,9876均从二进制形式成功转换为BCD码形式。BCD转二进制仿真结果如图6-19所示。Part6.9数码管显示6.9.1模块简介数码管显示数码管是一种常见外设,为了实现数码管的驱动和显示,首先需要了解数码管显示的原理。7段式数码管是由7个发光二极管组成,这7个发光二极管有一个公共端。公共端必须接GND或者接VCC,公共端接GND的数码管称为共阴极数码管,公共端接VCC的数码管称共阳极数码管。6.9.2原理图数码管显示图6-20数码管动态显示原理图6.9.3仿真图数码管显示图6-21数码管动态显示仿真图6.9.4模块代码数码管显示模块代码下面给出一种7段式数码管动态显示模块代码:moduleseg7(clk,rst,sel,seg,num);inputclk; //时钟信号

inputrst; //复位信号outputreg[3:0]sel; //数码管位选端口outputreg[7:0]seg; //数码管段选端口outputreg[3:0]num; //显示的数字或字母的输出端口reg[31:0]counter_5kHz; //计数器1,控制扫描频率为5kHzreg[31:0]counter_1Hz; //计数器2,控制所要显示的数据1s更新一次reg[1:0]pos; //数码管位选控制信号always@(posedgeclkornegedgerst)beginif(!rst) //复位键按下,初始化 beginseg<=8'b0000_0000;sel<=4'b1111;counter_1Hz<=0;counter_5kHz<=0;num<=0;pos<=0; endelsebeginif(counter_1Hz<5000_0000) //显示数据刷新控制 //未达到计数值,数据保持且计数器加一 begincounter_1Hz<=counter_1Hz+1; endelse //达到计数值,数据刷新且计数器清零begin num<=num+1;counter_1Hz<=0;end

case(num) //判断数据值,将对应数码管显示编码赋给段选端口6.9.4模块代码(续)数码管显示模块代码4'b0000:seg<=8'b0011_1111;4'b0001:seg<=8'b0000_0110;4'b0010:seg<=8'b0101_1011;4'b0011:seg<=8'b0100_1111;4'b0100:seg<=8'b0110_0110;4'b0101:seg<=8'b0110_1101;4'b0110:seg<=8'b0111_1101;4'b0111:seg<=8'b0000_0111;4'b1000:seg<=8'b0111_1111;4'b1001:seg<=8'b0110_1111;4'b1010:seg<=8'b0111_0111;4'b1011:seg<=8'b0111_1100;4'b1100:seg<=8'b0011_1001;4'b1101:seg<=8'b0101_1110;4'b1110:seg<=8'b0111_1001;4'b1111:seg<=8'b0111_0001;default:seg<=8'b0000_0000;endcaseif(counter_5kHz<1_0000)//数码管动态扫描,扫描频率5kHz //未达到计数值,位选控制信号保持且计数器加一begincounter_5kHz<=counter_5kHz+1;endelse //达到计数值,位选控制信号刷新且计数器清零beginpos<=pos+1;counter_5kHz<=0;endcase(pos) //判断数码管位选控制信号,将对应位选信号赋给位选端口2'b00:sel<=4'b1110;2'b01:sel<=4'b1101;2'b10:sel<=4'b1011;2'b11:sel<=4'b0111;default:sel<=8'b1111; endcaseendendendmodule6.9.5仿真代码数码管显示仿真代码`timescale1ns/1psmoduleseg7_tb;regclk; //时钟

regrst; //复位wire[3:0]sel; //位选端口wire[7:0]seg; //段选端口

wire[3:0]num; //数据输出端口initialbeginclk=0; rst=0; #20rst=1; endalways#10clk=~clk; //产生一个50MHz的时钟激励seg7i1(.clk(clk),.rst(rst),.sel(sel),.seg(seg),.num(num) );endmodule6.9.6结果分析仿真波形观察由仿真波形可以看出,每隔一个数据刷新周期,数码管段选信号和对应二进制信号同步更新。数码管位选信号按扫描频率更新,sel端口低电平表明选通与之相连的数码管,高电平则未选通。因此,该模块达到设计要求。Part6.10VGA显示驱动6.10.1模块简介VGA显示驱动VGA(VideoGraphicsArray)是IBM在1987年推出的一种视频传输标准,VGA广泛用于计算机显示,是一种显示设备制造商普遍通用的最低标准。个人电脑在加载自己的独特驱动程序之前,都必须支持VGA的标准。VGA支持在640*480像素的较高分辨率下同时显示16种色彩或256种灰度,同时在320*240像素分辨率下可以同时显示256种颜色。6.10.2原理图VGA显示驱动图6-22VGA驱动原理图6.10.3仿真图VGA显示驱动图6-23VGA驱动仿真图6.10.4模块代码VGA显示驱动模块代码VGA驱动模块代码如下:moduleVGA(clk,rst,Hs,Vs,Rl,Gl,Bl);inputclk,rst; outputregHs,Vs; //行同步信号、场同步信号outputreg[7:0]Rl,Gl,Bl; //8位R、G、B分量,24位表示一个像素值reg[9:0]Hcnt,Vcnt; //Hcnt行计数Vcnt列计数parameterA=800; //LinePeriod行扫周期parameterB=96; //Syncpulse行同步脉冲parameterC=48; //Backporch显示后沿parameterD=640; //Displayinterval显示时段parameterE=16; //Frontporch显示前沿par

温馨提示

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

评论

0/150

提交评论