1 绪
11 FPGA背景
目前高速集成硬件描述语言(VHDL)完成电路设计简 单综合布局快速烧录 FPGA 进行测试现代 IC 设计验证技术流编辑元件实现基逻辑门电路(ANDORXORNOT)者更复杂组合功解码器数学方程式数FPGA里面编辑元件里包含记忆元件例触发器(Flip-flop)者更加完整记忆块系统设计师根需通编辑连接FPGA部逻辑块连接起电路试验板放芯片里出厂成品FPGA逻辑块连接设计者改变FPGA完成需逻辑功
FPGA般说ASIC(专集成芯片)速度慢法完成复杂设计消耗更电优点快速成品修改改正程序中错误更便宜造价厂商会提供便宜编辑力差FPGA芯片较差编辑力设计开发普通FPGA完成然设计转移类似ASIC芯片外种方法CPLD(复杂编程逻辑器件备)
12 FPGA发展前景
FPGA技术正处高速发展时期新型芯片规模越越成越越低低端FPGA已逐步取代传统数字元件高端FPGA断争夺ASIC市场份额先进ASIC生产工艺已FPGA生产越越丰富处理器核嵌入高端FPGA芯片中基FPGA开发成项系统级设计工程着半导体制造工艺提高FPGA 集成度断提高制造成断降低作代ASIC 实现电子系统前景日趋光明
(1) 容量低电压低功耗FPGA
容量FPGA 市场发展焦点FPGA 产业中两霸:AlteraXilinx超容量FPGA展开激烈竞争2007年Altera推出65nm工艺StratixIII系列芯片容量67200L E (Logic Element逻辑单元)Xilinx推出65nm工艺VitexVI系列芯片容量33792Slices (Slices约等2L E)采深亚微米(DSM)半导体工艺器件性提高时价格逐步降低便携式应产品发展FPGA 低电压低功耗日益迫切厂家种类型产品瞄准方努力
(2) 系统级高密度FPGA
着生产规模提高产品应成降FPGA 应已仅仅适系统接口部件现场集成灵活应系统级(包括核心功芯片)设计中样背景国际FPGA 厂家系统级高密度FPGA 技术发展强调两方面:FPGA IP( Intellec2tual Property 知识产权)硬核IP软核前具IP核系统级FPGA开发体现两方面:方面FPGA 厂商IP硬核(指完成版图设计功单元模块)嵌入FPGA 器件中方面力扩充优化IP软核(指利HDL语言设计综合验证功单元模块)户直接利预定义测试验证IP 核资源效完成复杂片系统设计
(3) FPGAASIC出现相互融合
然标准逻辑ASIC 芯片尺寸功强功耗低设计复杂批量求FPGA价格较低廉现场进行编程体积力限功耗ASIC正FPGAASIC正互相融合取长补短着ASIC制造商提供具编程逻辑标准单元FPGA 制造商重新标准逻辑单元发生兴趣
(4) 动态重构FPGA
动态重构FPGA指定条件芯片仅具系统重新配置电路功特性具系统动态重构电路逻辑力数字时序逻辑系统动态重构FPGA意义时序逻辑发生通调芯片区域逻辑资源组合成通FPGA 进行局部全局芯片逻辑动态重构实现动态重构FPGA器件编程结构具专门特征部逻辑块部连线改变通读取SRAM中数直接实现样逻辑重构时间纳秒级助实现FPGA系统逻辑功动态构
13 课程设计务
课程设计中Altera公司EP2C35系列FPGA芯片利SOPCNIOSIIEP2C35开发板直流电机步进电机模块等资源实现直流电机测控仪
(1)基技掌握:
1 掌握时钟作频率控制
2 掌握十进制计数器设计
3 掌握16位锁存器设计
4 掌握显示译码功设计
(2)基功求
1 利旋转电位器实现转速控制
2 利PWM信号实现转速控制
3 利8位动态七段码显示实现转速显示
(3)扩展功选择性求
1 利4×4键盘阵列实现键盘转速控制
2 利16*16点阵显示实现转速级显示
2 设计原理
21 直流电机测控总原理
直流电机测控仪总体设计硬件图21示FPGAAltera公司EP2C35系列输入设备时钟4*4键盘霍尔器件警报控制开关时钟采1MHZ4*4键盘FPGA输入4位数组信号霍尔器件输入计数脉输出设备直流电机8位7段字符LED数码16*16点阵LED直流电机采直接旋钮控制转速者PWM控制转速8位7段字符LED数码显示分钟转速16*16点阵LED显示速度级
霍尔器件
FPGA
4*4键盘
直流电机
时钟1MHZ
16*16点阵LED
8位7段字符LED数码
图21:总体设计硬件框架图
22 直流电机霍尔器件驱动
直流电源通电刷接通电枢绕组电枢导体电流流 电磁作样电枢导体会产生磁场时产生磁场磁极磁场产生电磁力电磁力作转子转子定速度开始旋转样电机开始工作
图22:直流电机结构图
够测定出电机单位时间转子旋转少周期电机外部电路中加入开关型霍尔器件时电子转子转盘加入够霍尔原件产生输出带磁场磁钢片电机旋转时带动转盘磁钢片起旋转磁钢片旋转霍尔器件方时导致霍尔器件输出端高电变低电磁钢片转霍尔器件方霍尔器件输出端恢复高电输出样电机旋转周会霍尔器件输出端产生低脉通检测单位时间霍尔器件输出端低脉数推算出直流电机单位时间转速直流电机开关型霍尔器件电路原理图图23示:
图23:直流电机霍尔器件电路图
直流电机驱动两种方式模拟电驱动电路图43短接旋转实验箱左边旋钮调节旋钮控制速度二通PWM控制电路图65短接PWM信号高电位选通三极直流电机转动直流电机获较转速样电机左边旋钮调较位置
23 键盘驱动
键盘电位扫描确定前键没单键电路图24示键没时判断电位点获取高电位键时判断电位低电位样通判断点电位高低确定键没
图24:单键电路图
4*4键盘FPGA连接图图34示扫描键盘FPGA8控制端口确定控制行端口设置buffer模式控制列端口设置in模式扫描键盘方法先第行键盘低电余行列高电读取列电位值果没键电位判断端口获取高电位果键电位判断点电全零电位值第位零确定前行键次四行键盘扫描扫描结束输出4位数组信号告诉键
图25 4*4键盘电路图
24 8位7段数码驱动
七段数码电子开发程中常输出显示设备实验系统中两四位体阴极型七段数码单静态数码图26示高点点亮数码相应数码段
图26 :静态七段数码
图27:8位7段数码驱动
图27 8位7段数码连接七段数码公端连接GND(阴极型)数码中段输入高电相应段点亮反亮四位体七段数码单静态数码基础加入选择位数码位选信号端口八数码abcdefghdp连起8数码分位选信号控制选通数码显示数余关闭
25 16*16点LED阵列驱动
单LED电路图28示单LED电路图Rn输入高电时Cn输入低电时电路形成回路LED发光LED点阵应点点亮
图28:单LED电路图
设计完成速度级(015)点阵LED显示 16*16点阵LED扫描工作原理8位扫描数码类似显示方式结果样已16*16点阵256LED通排列组合形成16行*16列矩阵式LED阵列
图29:16*16点阵硬件图
16*16点阵LED驱动时次选通LED点阵行端口次选通端口(Cn)字符译码第N列结果列端口(Rn)输入通高速次点亮led点阵led点阵显示数字
26 PWM控制原理
PWM控制脉宽度进行调制技术通系列脉宽度进行调制等效获需波形
图210示设定值计数器设置PWM信号占空U\D1输入CLK2设定值计数值输出值增加PWM占空增加电机转速加快U\D0输入CLK2设定值计算器输出值减PWM占空减电机转速变慢CLK0作锯齿波计数器输出周期性线性增加锯齿波计数值设定值时数字较器输出低电计数值设定值时数字较器输出高电产生周期性PWM波形旋转反控制电路控制直流电动机转启停该电路两2选1路选择器组成Z\F键控制选择PWM波形正端Z进入H桥负端进入H桥控制电机旋转方START键通门控制PWM输出实现电机工作停止控制H桥电路功率晶体组成PWM波形通方控制电路送H桥功率放驱动电机转动
图210 PWM控制电路原理图
3 程序设计
31 总体程序设计思路
程序总体设计分时钟控制信号模块十进制计数模块显示模块键盘模块pwm控制模块十六位锁存模块彩色led蜂鸣器控制模块设计思路十进制计数器霍尔器件脉数计数时钟控制六秒时计数值锁存16位锁存器显示模块7段数码显示锁存器锁存值时键盘模块送出键盘键值点阵LED显示数值
32 时钟控制信号程序设计
时钟控制信号中级锁存模块提供锁存控制型号时计数模块提清零信号蜂鸣器提供1khz时钟设计中Cnttemp1MHZ升缘计数产生1HZ信号(Cnttemp<5000送出高电Cnttemp>5000送出低电)Count秒信号计数锁存控制信号第六秒结束时送出清零信号第7秒送出先产生秒脉
Clk1hz’1’
Clk1hz’1’
Cnttemp<50000
Cnttemp0
Cnttemp+1
Cnttemp前计数否99999
1M时钟
Count6较
否
Enal’0’
Clr’1’
Load’0’
Enal’0’
Clr’0’
Load’1’
Enal’1’
Clr’0’
Load’0’
等
输出
图31:时钟控制信号流程图
注:Enal输出控制计数器信号
Clr输出控制计数器清零信号
Load输出控制锁存器锁存信号
图32: 时钟控制信号模块
33 十进制计数器程序设计
设计中显示前直流电机转速4位十进制计数器转速脉计数设计中需设计位十进制计数器设计中特注意进位脉处理
设计流程:
Count1001
Clr0’ena1’
计数脉
Coun<0000
Count
否
输出计数值
输出进位脉
图33:十进制计数器程序设计流程图
注:CLR外部输入清零信号
ENA外部输入计数信号
十进制计数器计数脉计数计数值9时计数值重新零时零时输出进位脉
图34十进制计数模块
34 锁存模块程序设计
16位锁存模块设计较简单控制信号高电时锁存前输入信号值低电时保持锁存锁存输入信号
Load1’
DIN
OUT
图35 16位锁存器设计流程
注:IN16位输入信号OUT16位输出信号LOAD输入锁存信号
信号DININ信号进行保存LOAD’1’时IN信号保存DINDIN传递OUT
图36 16位锁存模块
35 PWM控制信号程序设计
PWM控制信号驱动直流电机转速信号PWM控制四输入信号控制pwm占空设计中高1516控制信号1111获低0控制信号0000获
流程
时钟1MHZ
Count0
Count16000
PWM’1’
PWM’0’
Count+1
datatcoundatain*1000
否
输出pwm控制信号
图37:PWM控制流程图
注:DATAIN输入数
COUNT时钟016000循环计数COUNT0时输出电置高电COUNT输入值*1000时输出电置低电样通外部输入控制占空控制直流电机转速
图38:PWM控制模块
36 键盘扫描显示模块程序设计
(1)键盘扫描程序设计
PWM控制直流电机通扫描键盘键控制方波占空键值越方波占空越高达1516低0键盘扫描输出4数组扫描简单行低电列获电位确定行键体流程:
时钟1MHZ输入
Count+1
Count<0
Count2
扫描第三行
Count1
扫描第二行
Count3
Count3
扫描第四行
Count0
扫描第行
否
判断键
输出相应键值
判断键
输出相应键值
图39:键盘扫描流程图
键盘模块体设计思路信号COUNT时钟03循环计数CONTN时第N列扫描判断列端电位确定前键键位输出键值
(2)显示模块程序设计
显示模块分两部分分8位7段数码led16*16点阵LED硬件连接突(7段数码7段点阵led列低8列连接FPGA统脚)两显示部分统模块驱动分时段分驱动8位7段数码led16*16点阵LED
COUNT<00000
COUNT10111显示第十六列LED点阵
COUNT01000显示第列LED点阵
COUNT00111显示第八位LED
COUNT00000显示第位LED
COUNT+1
COUNT10111
时钟1MHZ
否
图310:显示模块程序流程
显示程序中十进制计数器百十位数输入分8位7段数码第三四五位显示设计中记录六秒钟转速显示分钟转速第六位LED数码显示0数码显示横线设计中注意输入4位数组译成LED数码显示7段码(0001译码01100000)点阵LED显示需译码列译码点阵LED次点亮列高速点亮阵面显示汉字者数字
图311:键盘扫描显示模块
37警报控制彩色LED模块程序设计
模块添加设计模块考虑直流电机转速划分高中低三等次高速转速超4000RMIN低速转速低2000RMIN中速介两者间红绿蓝三彩色LED 显示前速度属速度层次设计中外5000RMIN 设警戒速度电机转速超警戒速度时会触发警报(扬声器发出间隔1 秒响声)然超警戒速度警报通警报开关关闭
图312:警报控制彩色LED模块
4 设计程介绍
41 设计程
(1)测速显示
电机旋转时带动转盘磁钢片起旋转磁钢片旋转霍尔器件方时导致霍尔器件输出端高电变低电磁钢片转霍尔器件方霍尔器件输出端恢复高电输出样电机旋转周会霍尔器件输出端产生低脉通检测单位时间霍尔器件输出端低脉数推算出直流电机单位时间转速
电机转速通常指分钟电机转速单位rpm实际测量程中减少转速刷新时间通常5~10秒刷新次果6秒钟刷新次相记录6秒钟电机转数记录数10分钟转速数数码显示出显示数够数码显示稳定数输出时加入16位锁存器锁存数送数码显示样会计数程中数变化数码显示断变化
(2)pwm产生控制
通控制占空达控制直流电机控制键先预设速度值电动机实际转速预设值较果相等调节占空达预设值
42 遇问题解决方案
问题:PWM 控制方式直流电机速度太低
解决方法:初始时发现旋律控制时直流电机速度提升PWM控制时速度低初PWM周期太长发现周期缩短然济事怕PWM信号占空1直流电机速度然非常低查阅电路图发现PWM信号高电位选通三极驱动直流电机决定直流电机获电压电机左边旋钮控制需旋钮调提高PWM控制方式直流电机转速
问题二:数码显示速度跳动
解决方法:通占空100分频调1000样占空没变化1速度变化会减少
43 设计体会
次课程设计期2周两周中历什懂解逐渐熟悉EDA软件VHDL语言运程程中学书学东西时巩固前学知识做子模块编写时候遇问题开始时什知道网搜集资料查老师资料懂问老师弄清中原理次练逐渐够解决编写程序中问题模块编写出然仿真时遇点困难想结果正确显示结果点点分析错误中思考产生错误原修改电路图终想结果完成次课程设计
通次课程设计懂理实际相结合重理知识远远够学理知识实践相结合起理中出结提高实际动手力独立思考力真正社会服务
感谢组成员基础懂感谢两周私帮助细心讲解感谢予悉心指导老师两周中亏您厌烦指教谢谢
参考文献
[1] SOPCIIEDA实验指导书(第二版)
[2] SOPCII手册(第二版)
[3] EDA技术基础 谭会生编著 湖南学出版社2004
[4] EDA技术实教程(第二版)潘松黄继业编著 科学出版社 2005
附录A:设计程序
时钟控制信号模块程序
library ieee
use ieeestd_logic_1164all
use ieeestd_logic_arithall
use ieeestd_logic_unsignedall
entity teltcl is
port( Clk in std_logic 时钟输入1Mhz
ena out std_logic 允许计数
clr out std_logic 计数器清零信号产生
clkhz out std_logic 秒脉信号产生
clkkhz out std_logic 1KHZ脉产生
load out std_logic 锁存显示输出允许
)
end teltcl
architecture behave of teltcl is
signal clk1hz std_logic1HZ时钟信号
signal clk1khz std_logic
signal count std_logic_vector(2 downto 0)6秒计数
signal clr1 std_logic清零信号
signal ena1 std_logic允许计数信号
signal load1 std_logic允许计数信号
signal cq1cq2cq3cq4 INTEGER RANGE 0 TO 15计数数
begin
process(clk) 1HZ信号产生
variable cnttemp INTEGER RANGE 0 TO 999999
variable count integer range 0 to 999
begin
IF clk'1' AND clk'event THEN
IF cnttemp999999 THEN cnttemp0
ELSE
IF cnttemp<500000 THEN clk1hz<'1'
ELSE clk1hz<'0'
END IF
cnttempcnttemp+1
END IF
if count999 then count0
else
if count<500 then clk1khz<'1'
else clk1khz<'0'
end if
countcount+1
end if
end if
clkhz
process(Clk1hz)6秒计数
begin
if(Clk1hz'event and Clk1hz'1') then
count
ena1<'1'load1<'0'clr1<'0'
elsif count6 then
load1<'1'ena1<'0'clr1<'0'
elsif count7 then
ena1<'0'load1<'0'clr1<'1'
end if
end if
ena
end behave
十进制计数器模块程序
LIBRARY IEEE
USE IEEESTD_LOGIC_1164ALL
ENTITY CNT10 IS
PORT (CLKIN STD_LOGIC 计数时钟信号
CLRIN STD_LOGIC 清零信号
ENAIN STD_LOGIC 计数信号
CQ OUT INTEGER RANGE 0 TO 15 4位计数结果输出
CARRY_OUTOUT STD_LOGIC) 计数进位
END CNT10
ARCHITECTURE ART OF CNT10 IS
SIGNAL CQI INTEGER RANGE 0 TO 15
BEGIN
PROCESS(CLKENA) IS
BEGIN
IF CLR '1' THEN CQI< 0 计数器异步清零
elsIF CLK'EVENT AND CLK '1' THEN
IF ENA '1' THEN
iF CQI10 THEN cqi<1
ELSE CQI
END IF
END IF
END PROCESS
PROCESS (CQI) IS
BEGIN
IF CQI10 THEN CARRY_OUT< '1' 进位输出
ELSE CARRY_OUT< '0'
END IF
END PROCESS
CQ
键盘扫描显示程序
library ieee
use ieeestd_logic_1164all
use ieeestd_logic_arithall
use ieeestd_logic_unsignedall
entity exp13 is
port( Clk in std_logic 时钟信号
buff1buff2buff3buff4 in integer range 0 to 9
Kr in std_logic_vector(3 downto 0) 键盘行
Kc buffer std_logic_vector(3 downto 0) 键盘列
abcdefgdp out std_logic
Sasbsc buffer std_logic 七段码片选
dot_c OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
dot_r out std_logic_vector(7 downto 0)
yangbo out integer range 0 to 15
led out std_logic_vector(7 downto 0)
)
end exp13
architecture behave of exp13 is
signal keyrkeyc std_logic_vector(3 downto 0)
signal kcount std_logic_vector(2 downto 0)
signal dcount std_logic_vector(1 downto 0)
signal kflag1kflag2 std_logic
signal buff8 integer range 0 to 15
signal Disp_Temp integer range 0 to 15 扫描键值
signal Disp_Decode std_logic_vector(7 downto 0)
signal s std_logic_vector(3 downto 0)
signal key std_logic_vector(15 downto 0)
FUNCTION seg_code(a in integer) return std_logic_vector is
begin
case a is
when 0>return 00111111 '0'
when 1>return 00000110 '1'
when 2>return 01011011 '2'
when 3>return 01001111 '3'
when 4>return 01100110 '4'
when 5>return 01101101 '5'
when 6>return 01111101 '6'
when 7>return 00000111 '7'
when 8>return 01111111 '8'
when 9>return 01101111 '9'
when 10>return 01110111 'A'
when 11>return 01111100 'b'
when 12>return 00111001 'C'
when 13>return 01011110 'd'
when 14>return 01111001 'E'
when 15>return 01110001 ''
when others>return 00000000 全灭
end case
end seg_code
begin
yangbo
begin
if(Clk'event and Clk'1') then
if(Kr1111) then
kflag1<'0'
kcount
kc<1110
elsif(kcount1) then
kc<1101
elsif(kcount2) then
kc<1011
else
kc<0111
end if
else
kflag1<'1'
keyr
kflag2
end process
process(Clk) 获取键值
begin
if(Clk'event and Clk'1') then
if(kflag1'1' and kflag2'0') then
if(keyr0111) then
case keyc is
when 0111>buff8<1
when 1011>buff8<4
when 1101>buff8<7
when 1110>buff8<14
when others>buff8
elsif(keyr1011) then
case keyc is
when 0111>buff8<2
when 1011>buff8<5
when 1101>buff8<8
when 1110>buff8<0
when others>buff8
elsif(keyr1101) then
case keyc is
when 1110>buff8<15
when 1101>buff8<9
when 1011>buff8<6
when 0111>buff8<3
when others>buff8
elsif(keyr1110) then
case keyc is
when 1110>buff8<13
when 1101>buff8<12
when 1011>buff8<11
when 0111>buff8<10
when others>buff8
end if
end if
end if
end process
process(clk)
begin
if(clk'event and clk'1') then 扫描累加
dcount
when 00> Disp_Decode
sa
end if
end process
process (clk)
begin
if (clk'event and clk'1')then
s
s<1000
end if
end if
end process
process (s)
begin
case s is
when 1000>dot_r<01111111
when 1001>dot_r<10111111
when 1010>dot_r<11011111
when 1011>dot_r<11101111
when 1100>dot_r<11110111
when 1101>dot_r<11111011
when 1110>dot_r<11111101
when 1111>dot_r<11111110
when others>dot_r<11111111
end case
end process
process(sDisp_Temp)
begin
if (Disp_Temp0) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c
end case
elsif (Disp_Temp1) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c
elsif (Disp_Temp2) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示2
when 1001>dot_c<0111000001110000
when 1010>dot_c<0100100000001000
when 1011>dot_c<0100010000001000
when 1100>dot_c<0100001000001000
when 1101>dot_c<0100000100001000
when 1110>dot_c<0110000011110000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp3) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示3
when 1001>dot_c<0001100000011000
when 1010>dot_c<0010000000000100
when 1011>dot_c<0100000010000010
when 1100>dot_c<0100000010000010
when 1101>dot_c<0010000101000100
when 1110>dot_c<0001111000111000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp4) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示4
when 1001>dot_c<0000000111100000
when 1010>dot_c<0000000100010000
when 1011>dot_c<0000000100001000
when 1100>dot_c<0000000100000000
when 1101>dot_c<0011111111111110
when 1110>dot_c<0000000100000000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp5) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示5
when 1001>dot_c<0001100111111100
when 1010>dot_c<0010000010000100
when 1011>dot_c<0010000001000100
when 1100>dot_c<0010000001000100
when 1101>dot_c<0001000010000100
when 1110>dot_c<0000111100000100
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp6) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示6
when 1001>dot_c<0000011111110000
when 1010>dot_c<0000100010001000
when 1011>dot_c<0001000001000100
when 1100>dot_c<0010000001000100
when 1101>dot_c<0010000010001100
when 1110>dot_c<0001111000000000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp7) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示7
when 1001>dot_c<0000000000011100
when 1010>dot_c<0000000000000010
when 1011>dot_c<0011111100000010
when 1100>dot_c<0000000011000010
when 1101>dot_c<0000000000110010
when 1110>dot_c<0000000000001100
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp8) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示8
when 1001>dot_c<0001111000111100
when 1010>dot_c<0010000101000010
when 1011>dot_c<0010000010000010
when 1100>dot_c<0010000010000010
when 1101>dot_c<0010000101000010
when 1110>dot_c<0001111000111100
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp9) then
led<11000000 十位LED显示0
case s is
when 1000>dot_c<0000000000000000 列显示9
when 1001>dot_c<0001000000111000
when 1010>dot_c<0010000001000100
when 1011>dot_c<0100000010000010
when 1100>dot_c<0100000010000010
when 1101>dot_c<0010000001000100
when 1110>dot_c<0000111111111000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp10) then
led<11111001 十位LED显示1
case s is
when 1000>dot_c
elsif (Disp_Temp11) then
led<11111001 十位LED显示1
case s is
when 1000>dot_c
elsif (Disp_Temp12) then
led<11111001 十位LED显示1
case s is
when 1000>dot_c<0000000000000000 列显示2
when 1001>dot_c<0111000001110000
when 1010>dot_c<0100100000001000
when 1011>dot_c<0100010000001000
when 1100>dot_c<0100001000001000
when 1101>dot_c<0100000100001000
when 1110>dot_c<0110000011110000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp13) then
led<11111001 十位LED显示1
case s is
when 1000>dot_c<0000000000000000 列显示3
when 1001>dot_c<0001100000011000
when 1010>dot_c<0010000000000100
when 1011>dot_c<0100000010000010
when 1100>dot_c<0100000010000010
when 1101>dot_c<0010000101000100
when 1110>dot_c<0001111000111000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp14) then
led<11111001 十位LED显示1
case s is
when 1000>dot_c<0000000000000000 列显示4
when 1001>dot_c<0000000111100000
when 1010>dot_c<0000000100010000
when 1011>dot_c<0000000100001000
when 1100>dot_c<0000000100000000
when 1101>dot_c<0011111111111110
when 1110>dot_c<0000000100000000
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
elsif (Disp_Temp15) then
led<11111001 十位LED显示1
case s is
when 1000>dot_c<0000000000000000 列显示5
when 1001>dot_c<0001100111111100
when 1010>dot_c<0010000010000100
when 1011>dot_c<0010000001000100
when 1100>dot_c<0010000001000100
when 1101>dot_c<0001000010000100
when 1110>dot_c<0000111100000100
when 1111>dot_c<0000000000000000
when others>dot_c<0000000000000000
end case
end if
end process
end behave
16位锁存器模块程序设计
LIBRARY IEEE
USE IEEESTD_LOGIC_1164ALL
ENTITY REG32B IS
PORT(LOAD IN STD_LOGIC
DIN IN STD_LOGIC_VECTOR(15 DOWNTO 0)
DOUT OUT STD_LOGIC_VECTOR(15 DOWNTO 0))
END ENTITY REG32B
ARCHITECTURE ART OF REG32B IS
BEGIN
PROCESS ( LOAD DIN ) IS
BEGIN
IF LOAD 'EVENT AND LOAD '1'
THEN DOUT
END PROCESS
END ART
PWM信号控制模块
library ieee
use ieeestd_logic_1164all
use ieeestd_logic_arithall
use ieeestd_logic_unsignedall
entity pwm is
port( pwmin in std_logic_vector(3 downto 0) pwm信号输入
clk in std_logic 时钟
pwmout out std_logic 电机控制信号
)
end pwm
architecture behave of pwm is
signal cycle integer range 0 to 16000
signal keynum integer range 0 to 15
begin
process(clk)
begin
if clk'event and clk'1' then
if cycle16000 then
pwmout<'1'cycle<0
elsif cyclekeynum*1000 then
pwmout<'0'cycle
cycle
end if
end process
process(pwmin)
begin
case pwmin is
when 0000 > keynum <0
when 0001 > keynum <1
when 0010 > keynum <2
when 0011 > keynum <3
when 0100 > keynum <4
when 0101 > keynum <5
when 0110 > keynum <6
when 0111 > keynum <7
when 1000 > keynum <8
when 1001 > keynum <9
when 1010 > keynum <10
when 1011 > keynum <11
when 1100 > keynum <12
when 1101 > keynum <13
when 1110 > keynum <14
when 1111 > keynum <15
when others > null
end case
end process
end behave
警报控制彩色LED模块程序设计
library ieee
use ieeestd_logic_1164all
use ieeestd_logic_arithall
use ieeestd_logic_unsignedall
entity speedled is
port( speed in integer range 0 to 15
clkhz in std_logic
sbell in std_logic
bell out std_logic
d_speed out std_logic
sled out std_logic_vector(2 downto 0)
yang out std_logic
)
end speedled
architecture behave of speedled is
signal count integer range 0 to 3000
signal waring std_logic
begin
process(speed)
begin
if speed<4 then sled<100waring<'1'yang<'0'
elsif speed>9 then
if speed>10 then
waring
sled<001waring<'1'yang<'0'
end if
else sled<010waring<'1'yang<'0'
end if
end process
process(waring)
begin
if waring'event and waring'1' then
if count2000 then
count<0d_speed<'0'
elsif count2 then
count
count
end if
if sbell'0' then
if count<1000 then
bell
end if
end process
end behave
声音模块
library ieee
use ieeestd_logic_1164all
use ieeestd_logic_arithall
use ieeestd_logic_unsignedall
entity audio is
port( clk in std_logic Clock Signal
spk buffer std_logic) speaker driver
end audio
architecture behave of audio is
signal tone std_logic_vector(10 downto 0)
signal tone_count std_logic_vector(10 downto 0)
signal tone_index integer range 0 to 15
signal clk10_count std_logic_vector(17 downto 0)
signal time integer range 0 to 150
signal clk10 std_logic
begin
process(clk) generate 10hz clock signal
begin
if(clk'event and clk'1') then
clk10_count
clk10
end if
end process
process(clk10)
begin
if(clk10'event and clk10'1') then
if(time150) then
time<0
else
time