基于CPLD的汽车尾灯控制器设计报告.docx
- 文档编号:9262463
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:21
- 大小:31.08KB
基于CPLD的汽车尾灯控制器设计报告.docx
《基于CPLD的汽车尾灯控制器设计报告.docx》由会员分享,可在线阅读,更多相关《基于CPLD的汽车尾灯控制器设计报告.docx(21页珍藏版)》请在冰豆网上搜索。
基于CPLD的汽车尾灯控制器设计报告
实验一应用QartusII完成点亮LED设计
一、实验目的
通过此实验让用户逐步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法及VerilogHDL的编程方法。
本实验力求以详细的步骤和讲解让读者以最快的方式了解EDA技术开发以及软件的使用,从而快速入门并激起读者对EDA技术的兴趣。
二、实验内容
本实验的内容是建立可用于控制LED亮/灭的简单硬件电路,要求点亮SmartSOPC实验箱上的4个发光二极管(LED1、LED3、LED5和LED7)。
具体包括:
1)使用QuartusII建立工程;
2)QuartusII工程设计;
3)设置编译选项并编译硬件系统;
4)下载硬件设计到目标FPGA;
5)观察LED的状态。
三、实验原理
FPGA器件同单片机一样,为用户提供了许多灵活独立的输入/输出I/O(单元)。
FPGA每个I/O口可以配置为输入、输出、双向I/O、集电极开路和三态门等各种组态。
做为输出口时,FPGA的I/O口可以吸收最大为24mA的电流,可以直接驱动发光二极管LED等器件。
所以只要正确分配并锁定引脚后,在相应的引脚上输出低电平“0”,就可实现点亮该发光二极管的功能。
四、实验步骤
1)使用Quartus
建立工程
(1)打开Quartus
软件并建立工程
从File→NewProjectWizard…来建立新的工程。
工程向导对话框主要包括:
a.指定项目目录、名称和顶层实体。
b.指定项目设计文件。
c.指定该设计的Altera器件系列(本次实验涉及芯片为Cyclone系列的EP1C6Q240C8)。
d.指定用于该项目的其他EDA工具。
e.项目信息报告。
(2)建立图形设计文件
从File→New…打开新建文件对话框,选择Block/SchematicFile单击OK建立空的图形设计文件并保存为led_test.bdf。
(3)建立文本编辑文件
从File→New…打开新建文件对话框,选择VerilogHDLFile单击OK建立空的图形设计文件并保存为led.v。
2)Quartus
工程设计
(1)在VerilogHDL文件中编写源程序
a.在ProjectNavigator窗口的File标签中的led.v文件单击鼠标右键,在弹出的对话框中单击SetasTop-levelEntiy选项。
将led.v设置为顶层实体。
b.选择Processing→Start→StartAnalysis&Synthesis进行综合编译,也可使用工具栏的综合编译按钮启动编译。
c.若在编译过程中发现错误,则找出并改正错误,直到编译成功。
(2)从设计文件创建模块
a.在ProjectNavigator窗口的File标签中的.bdf文件单击鼠标右键,在弹出的对话框中单击SetasTop-levelEntiy选项。
将.bdf设置为顶层实体。
b.在File→Create/Updata项选择CreateSymbolFileforCurrentfile,单击确定。
生成led.bsf文件。
(3)添加led.bsf模块到Quartus
顶层模块
(4)添加引脚和其它基本单元
(5)根据表3.1分配FPGA管脚
(6)器件和管脚的其它设置
将没有用到的管脚设置为三态输入。
3)设置编译选项并编译硬件系统
(1)设置编译选项
(2)编译硬件系统
在ProjectNavigator窗口的File标签中的led_test.bdf文件单击鼠标右键,在弹出的对话框中单击SetasTop-levelEntiy选项。
将led_test.bdf设置为顶层实体。
选择Processing→StartCompilation进行全程编译,并改正出现的错误。
出现的警告信息忽略不计。
(3)查看编译报告
4)下载硬件设计到目标FPGA
使用下载电缆连接实验箱的JTAG口与主计算机,接通实验箱电源。
下载生成的led_test.sof文件。
5)观察LED的状态
五、实验程序
moduleled(led);
output[7:
0]led;
assignled=8'b10101010;
endmodule
六、结果分析
观察LED的状态,LED1,LED3,LED5,LED7,四个发光二极管亮。
由于实验箱上发光二极管共阳级,所以当相应引脚输出为低电平时,发光二极管亮。
可以修改程序中的assign语句中的led的取值,实现将不同位置的led灯的点亮。
实验二流水灯实验
一、实验目的
通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VerilogHDL的编程方法。
学习简单时序电路的设计和硬件测试。
二、实验内容
本实验的内容是建立可用于控制LED流水灯的简单硬件电路,要求在SmartSOPC实验箱上实现LED1-LED8发光二级管流水灯显示。
三、实验原理
(1)在LED1-LED8引脚上周期性的输出流水数据,如原来输出的数据是11111100则表示点亮LED1、LED2,流水一次后,输出的数据应该为11111000,而此时则应点亮LED1-LED3三个LED发光二级管。
就可以实现LED流水灯。
为了观察方便,流水速率最好在2Hz左右。
(2)int_div分频模块说明:
int_div模块是一个占空比为50%的任意整数分频器。
输入时钟为clock,输入时钟为clk_out。
更改F_DIV和F_DIV_WIDTH的参数值即可实现不同的分频系数。
(3)系统框图如下:
四、实验步骤
1)启动QuartusII建立一个空白工程,然后命名为led_water.qpf(具体步骤参见实验一)。
2)新建VerilogHDL源程序文件ledwater.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3)从设计文件创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。
4)将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录文件夹中。
5)新建图形设计文件命名为led_water.bdf并保存。
6)选择目标器件并对相应的引脚进行锁定。
7)将led_water.bdf设置为顶层实体。
对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
8)最后拿出跳线短接帽跳接到SmartSOPC实验箱上JP6的LED0-LED7,使LED1-LED8分别与FPGA引脚50、53-55、176和47-49相连。
拿出AlteraByteBlasterII下载电缆,并将此电缆的两端分别接到PC机的打印机并口和QuickSOPC核芯板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中,此时,即可在SmartSOPC实验箱上看到流水灯。
9)更改分频模块(int_div)的分频系数,并重新编译下载,观察流水灯的变化。
五、实验程序
moduleledwater(led,clk);
output[7:
0]led;
inputclk;
reg[8:
0]led_r;
assignled=led_r[7:
0];
always@(posedgeclk)
begin
led_r<=led_r<<1;
if(led_r==9'd0)
led_r<=9'b111111111;
end
endmodule
自己写的分频模块:
modulefenpin_48MHz(sclk,clkout);
inputsclk;
outputclkout;
reg[15:
0]Q;
always@(posedgesclk)
begin
if(Q>=16'd4800000)Q<=16'd0;
Q<=Q+1'b1;
end
assignclkout=(Q==16'd2400000)?
1'b1:
1'b0;
endmodule
六、结果分析
观察实验箱上的led灯按照led1~led8的顺序依次点亮无限循环,从左向右依次点亮。
更改分频系数,修改F_DIV和F_DIV_WIDTH的值,如F_DIV=48000000,F_DIV_WIDT=26,则led灯点亮速度较之前有所减慢。
若将程序中led_r<=led_r<<1;改为led_r<=led_r>>1;则即可实现流水方向的改变。
除了使用图形文件的顶层文件格式也可使用文本文件。
示例程序如下:
moduletopled(clock,led);
inputclock;
output[7:
0]led;
wirep;
int_divu1(.clock(clock),.clk_out(p));
ledwateru2(.clk(p),.led(led));
endmodule
实验三键盘、LED发光实验
一、实验目的
通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VerilogHDL的编程方法,熟悉以VerilogHDL文件为顶层模块的设计。
学习和体会分支条件语句case的使用方法及FPGAI/O口的输出控制。
二、实验内容
本实验的内容是要求在SmartSOPC实验箱上完成对8个键盘KEY1-KEY8进行监控,一旦有键输入判断其键值,并点亮相应个发光二级管,如若KEY3按下,则点亮LED1-LED3发光管。
三、实验原理
FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的,一旦该I/O口被设置为输入口使用时(如定义key0为输入引脚:
inputkey0;),该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚即可用作专用输入引脚。
只要正确分配并锁定引脚后,一旦在KEY1-KEY8中有键输入,在检测到键盘输入的情况下,继续判断其键盘值并作出相应的处理。
四、实验步骤
1)启动QuartusII建立一个空白工程,然后命名为keyled.qpf(具体步骤参见实验一)。
2)新建VerilogHDL源程序文件keyled.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3)选择目标器件并对相应的引脚进行锁定。
4)对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
5)最后拿出跳线短接帽跳接到JP6的LED0-LED7、KEY1-KEY8使LED1-LED8和KEY1-KEY8和芯片对应的引脚相连。
拿出下载电缆,并将此电缆的两端分别接到PC机的并口和QuickSOPC核芯板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中,观察发光管LED1-LED8的亮灭状态,按下KEY1-KEY8的任一键,再次观察发光管的状态。
五、实验程序
modulekeyled(key,led);
input[7:
0]key;
output[7:
0]led;
reg[7:
0]led_r;
reg[7:
0]buffer_r;
assignled=led_r;
always@(key)
begin
buffer_r=key;
case(buffer_r)
8'b11111110:
led_r=8'b11111110;
8'b11111101:
led_r=8'b11111100;
8'b11111011:
led_r=8'b11111000;
8'b11110111:
led_r=8'b11110000;
8'b11101111:
led_r=8'b11100000;
8'b11011111:
led_r=8'b11000000;
8'b10111111:
led_r=8'b10000000;
8'b01111111:
led_r=8'b00000000;
default:
led_r=8'b11111111;
endcase
end
endmodule
六、结果分析
程序下载后管擦发光管led1到led8处于不亮状态,按下key1,led1亮,按下key2,led1和led2亮按下key3则led1到led3亮;按下key4则led1到led4都亮实现键盘控制led亮灯。
由于核心板只有4个按键所以只能测试key1-key4的功能。
实验四静态数码管显示实验
一、实验目的
学习7段数码管显示译码器的设计,进一步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法及VerilogHDL的编程方法,学习LPM兆功能模块的调用。
二、实验内容
本实验的内容是建立7段译码显示模块,用于控制LED数码管的静态显示。
要求在SmartSOPC实验箱上的数码管依次显示0-9和A-F的16个字符。
三、实验原理
(1)常见的数码管有共阴和共阳2中,共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,共阳级数码管是将8个发光二极管的阳极连接在一起最为公共端。
公共端常被称作位码,而将其他的8位作段码。
(2)本实验通过分频模块int_div分频得到1Hz的频率信号,加载于4位计数器的时钟输入端,计数循环输出0-9、A-F16个数。
最后通过七段译码模块译码后在数码管上显示出来。
(3)系统框图如下:
四、实验步骤
1)启动QuartusII建立一个空白工程,然后命名为sled.qpf(具体步骤参见实验一)。
2)新建VerilogHDL源程序文件decl7s.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3)从设计文件创建模块,由decl7s.v生成名为decl7s.bsf的模块符号文件。
4)将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。
5)添加4位计数器兆功能模块。
从Tools→MegaWizardPlug-InManager…打开添加兆功能模块向导,新建兆功能模块。
6)新建图形设计文件命名为sled.bdf并保存。
7)选择目标器件并对相应的引脚进行锁定。
8)将sled.bdf设置为顶层实体。
对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
9)硬件连接、下载程序。
五、实验程序
moduledecl7s(d,seg);
input[3:
0]d;
output[7:
0]seg;
reg[7:
0]seg_r;
assignseg=seg_r;
always@(d)
begin
case(d)
4'h0:
seg_r=8'hc0;
4'h1:
seg_r=8'hf9;
4'h2:
seg_r=8'ha4;
4'h3:
seg_r=8'hb0;
4'h4:
seg_r=8'h99;
4'h5:
seg_r=8'h92;
4'h6:
seg_r=8'h82;
4'h7:
seg_r=8'hf8;
4'h8:
seg_r=8'h80;
4'h9:
seg_r=8'h90;
4'ha:
seg_r=8'h88;
4'hb:
seg_r=8'h83;
4'hc:
seg_r=8'hc6;
4'hd:
seg_r=8'ha1;
4'he:
seg_r=8'h86;
4'hf:
seg_r=8'h8e;
endcase
end
endmodule
六、结果分析
下载后,观察数码管,8个数码管循环显示00000000~FFFFFFFF,本实验用共阳极数码管,某个段输出低电平‘0’,则相应段就亮。
可修改程序中4’h0:
seg_r等式右边数值,显示其他字母符号,如seg_r=8’h89则输出HHHHHHHH
实验五动态数码管显示实验
一、实验目的
学习动态扫描显示的原理及电路的设计。
二、实验内容
本实验的内容是建立数码管动态扫描显示模块,具体内容如下:
1)在实验箱上完成LED数码管的动态显示“1-8”8个数字。
2)放慢扫描速度演示动态显示的原理过程。
三、实验原理
8个数码管,其中每个数码管的8个段:
a、b、c、d、e、f、g、h都分别连到seg0-seg7,8个数码管分别由8个连通信号dig0-dig7来选择。
被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号dig0-dig7分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数据管上显示的数据,于是随着选通信号的扫描就能实现扫描显示的目的。
虽然每次只有一个LED显示,但只要扫描显示速率够快,由于人的视觉余辉效应,使我们仍然会感觉所有的数码管都在同时显示。
四、实验步骤
1)启动QuartusII建立一个空白工程,然后命名为dled.qpf(具体步骤参见实验一)。
2)新建VerilogHDL源程序文件scan_led.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3)从设计文件创建模块,由scan_led.v生成名为scan_led.bsf的模块符号文件。
4)将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。
5)添加常量兆功能模块。
6)新建图形设计文件命名为dled.bdf并保存。
7)选择目标器件并对相应的引脚进行锁定。
将dled.bdf设置为顶层实体。
对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
硬件连接、下载程序。
8)观察LED数码管上的数字是否为“12345678”,然后把分频模块的参数改为F_DIV_WIDTH:
25,再重新编译下载,观察这次LED数码管上的显示数据,可以看到数据“12345678”动起来了,这正是动态扫描的方法和过程。
五、实验程序
modulescan_led(clk_1k,d,dig,seg);
inputclk_1k;
input[31:
0]d;
output[7:
0]dig;
output[7:
0]seg;
reg[7:
0]seg_r;
reg[7:
0]dig_r;
reg[3:
0]disp_dat;
reg[2:
0]count;
assigndig=dig_r;
assignseg=seg_r;
always@(posedgeclk_1k)
begin
count<=count+1'b1;
end
always@(posedgeclk_1k)
begin
case(count)
3'd0:
disp_dat=d[31:
28];
3'd1:
disp_dat=d[27:
24];
3'd2:
disp_dat=d[23:
20];
3'd3:
disp_dat=d[19:
16];
3'd4:
disp_dat=d[15:
12];
3'd5:
disp_dat=d[11:
8];
3'd6:
disp_dat=d[7:
4];
3'd7:
disp_dat=d[3:
0];
endcase
case(count)
3'd0:
dig_r=8'b01111111;
3'd1:
dig_r=8'b10111111;
3'd2:
dig_r=8'b11011111;
3'd3:
dig_r=8'b11101111;
3'd4:
dig_r=8'b11110111;
3'd5:
dig_r=8'b11111011;
3'd6:
dig_r=8'b11111101;
3'd7:
dig_r=8'b11111110;
endcase
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:
seg_r=8'hc0;
4'h1:
seg_r=8'hf9;
4'h2:
seg_r=8'ha4;
4'h3:
seg_r=8'hb0;
4'h4:
seg_r=8'h99;
4'h5:
seg_r=8'h92;
4'h6:
seg_r=8'h82;
4'h7:
seg_r=8'hf8;
4'h8:
seg_r=8'h80;
4'h9:
seg_r=8'h90;
4'ha:
seg_r=8'h88;
4'hb:
seg_r=8'h83;
4'hc:
seg_r=8'hc6;
4'hd:
seg_r=8'ha1;
4'he:
seg_r=8'h86;
4'hf:
seg_r=8'h8e;
endcase
end
endmodule
六、结果分析
程序下载后观察数码管现实的数字为12345678,一直显示无变化,无变动实际上1~8个数在依次显示且不断循环,因为频率高扫描速度快,人眼感觉不到,感觉所有数码管都在同时显示。
修改分频模块的参数F_DIV:
48000000,F_DIV_WIDTH:
26,重新编译下载观察数码管,则可以看到“12345678”,八个数字依次轮流显示每次值有1个数码管显示其余不显示。
可以看到当分频达到1KHz左右时人眼就感觉不到数码管的闪烁,给人一种静态显示的错觉,“眼见未必是真”。
实验十数控分频器的设计
一、实验目的
学习数控分频器的设计,分析和测试方法。
二、实验内容
在实验箱上实现数控分频器的设计,在clk输入64khz的频率信号(由int_div模块分频得到)或更高;输出Fout接蜂鸣器,由KEY1/KEY2控制8位预置数并在数码管1-2上显示。
三、实验原理
数控分频器的功能就是当输入端输入不同的数据时,产生不同的分频比,从而产生不同的频率值,本例是用计数值可并行预置的加法计数器设计完成,方法是将计数溢出位与预置数加载输入信号相接即可。
四、实验步骤
1)启动QuartusII建立一个空白工程,然后命名为dvf.qpf。
2)将pulse.v、key_led.v、int_div.v文件加入工程。
3)新建VerilogHDL源程序文件dvf.v,设置dvf.v为顶层文件,并保存。
4)分配引脚,将未使用的管教设置为三态输入。
5)对该工程文件进行全程编译处理。
6)下载程序到FP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 CPLD 汽车 尾灯 控制器 设计 报告