一.系统设计任务及功能概述
1.系统设计任务基于FPGA的半整数分频器设计
任务要求:设有一个5MHz(或7、9、11、13、15、17、19、21、23 、25MHz)的时钟源,但电路中需要产生一个2MHz的时钟信号,由于分频比为2.5(或3.5、4.5、5.5、6.5、7.5、8.5、9.5、10.5、11.5、12.5),因此采用小数分频。
2.小数分频的基本原理
小数分频的基本原理是采用脉冲吞吐计数器和锁相环技术先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。如设计一个分频系数为10.1的分频器时,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为:
F=(9×10+1×11)/(9+1)=10.1
3.系统功能概述
本系统是一个基于FPGA的半整数分频器,具有以下功能:有一个5MHz的时钟源,通过半整数分频器后电路中可以产生的是一个2MHz的时钟信号
二.系统设计方案和程序设计
1.系统设计方案
由于分频比为2.5,因此采用小数分频。
分频系数为N-0.5的分频器,其电路可由一个异或门、一个模N计数器和二分频器组成。下图给出了通用半整数分频器电路组成。
由于分频比为2.5则本实验中先要设计一个模11的计数器,然后建立模11计数器的元件,再利用原理图设计完成分频器的设计
2.VHDL程序设计
模11计数器VHDL程序如下:
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
entity jshq11 is --定义实体jshq
port(clr,ena,clk:in std_logic;
qa,qb,qc,qd:out std_logic);
end entity jshq11;
architecture art of jshq11 is --定义了结构体
signal cqi: std_logic_vector(0 to 3);
begin
process(clk,clr,ena)is --进程开始,clk,clr,ena为敏感信号
begin
if clr='1' then cqi<="0000";
else
if clk'event and clk='1'then
if ena='1'then
if cqi=10then cqi<="0000";
else
cqi<=cqi+1;
end if;
end if;
end if;
end if;
end process;
qa<=cqi(0); -- 信号赋值
qb<=cqi(1);
qc<=cqi(2);
qd<=cqi(3);
end architecture art;
三、仿真结果及原理图
1.模11计数器仿真波形图
图1计数器仿真波形图
2.模11计数器元件图
图2计数器元件图
3.半整数分频器原理图
图3 分频器原理图
4.半整数分频器仿真波形图
图4分频器仿真波形图
5.半整数分频器元件图
图5分频器元件图
6 输入输出管脚说明
表1 半整数分频器管脚
接口名称 | 类型 (输入/输出) | 结构图上的信号名 | 引脚号 | 说明 |
INCLK | IN | INCLK | 2 | 系统时钟 21MHz |
OUTCLK | OUT | OUTCLK | 3 | 系统输出 |
Q | OUT | Q | 4 | 系统输出 |
本次试验采用了程序与原理图相结合的设计方法,主要编写计数器的程序实现分频。经过一段时间的实验操作使我熟练的掌握了对软件maxplus2的使用,加深了对VHDL语言的了解,提高了编程能力。
掌握了一定的改错能力,业余还了解了一些关于EDA在实际中扮演的重要角色。这次实习获益匪浅,增加了对这门课的兴趣。
四.参考文献
[1] 谭会生,瞿遂春.EDA综合应用与实例分析. 西安:西安电子科技大学出版社,2004,11.
[2]潘松著.EDA技术实用教程(第二版). 北京:科学出版社,2005.
[3] 谭会生,张昌凡编著.EDA技术及应用. 西安:西安电子科技大学出版社.2011,1.
[4] 阎石主编.数字电子技术基础. 北京:高教出版社,2003.
[5] 刘艳萍,高振斌,李志军.EDA实用技术及应用[M].北京:国防工业出版社,2006
十字路口交通灯控制器的VHDL设计
一.系统设计任务及功能概述
1.系统设计任务
设计一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制器.
2.系统功能概述
(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。
(2)主干道处于常允许通行状态,而支干道有车来才允许通行。
(3)当主、支道均有车时,两者交替允许通行,主干道每次放行45s,支干道每次放行25s,在每次由亮绿灯变成亮红灯的转换过程中,要亮5s的黄灯作为过渡,并进行减计时显示。
二.系统设计方案和程序设计
1.系统设计方案
交通灯的控制电路主要由四大模块组成,通过传感器来判别主干道与支干道车辆运行情况,然后由交通灯实现车辆的自动控制。交通控制模块发出主支道控制信号,选择定时模块工作,控制显示模块。定时模块由45s,25s,5s三部分组成,实现红黄绿三个灯的显示时间。显示控制模块为译码做准备,相互配合实现时间显示。
图1 设计思路框图
2.VHDL程序设计
(1)交通控制模块
a.交通控制模块的程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JTD IS
PORT(CLK,SM,SB:IN STD_LOGIC; --SM,SB为主道和支道传感器信号
MR,MY,MG,BR,BY,BG:OUT STD_LOGIC);
END ENTITY JTD;
ARCHITECTURE ART OF JTD IS
TYPE STATE_TYPE IS(A,B,C,D);
SIGNAL STATE:STATE_TYPE;
BEGIN
CNT:PROCESS(CLK)IS -进程开始,CLK为敏感信号
VARIABLE S:INTEGER RANGE 0 TO 45; 定义变量范围0到45
VARIABLE CLR,EN:BIT;
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF CLR='0'THEN
S:=0;
ELSIF EN='0'THEN
S:=S;
ELSE
S:=S+1;
END IF;
CASE STATE IS --CASE四种选择状态
WHEN A=>MR<='0';MY<='0';MG<='1';
IF(SB AND SM)='1'THEN
IF S=45 THEN --状态转换
STATE<=B;CLR:='0';EN:='0';
ELSE
STATE<=A;CLR:='1';EN:='1';
END IF;
ELSIF SM='0'THEN
STATE<=B;CLR:='0';EN:='0';
STATE<=A;CLR:='1';EN:='1';
END IF;
WHEN B=>MR<='0';MY<='1';MG<='0';
BR<='1';BY<='0';BG<='0';
STATE<=C;CLR:='0';EN:='0';
WHEN C=>MR<='1';MY<='0';MG<='0';
IF S=25 THEN
ELSIF SB='0'THEN
ELSE
WHEN D=>MR<='1';MY<='0';MG<='0';
IF S=5 THEN
END IF;
END CASE;
END IF;
END PROCESS CNT;
END ARCHITECTURE ART;
b.交通控制模块的波形仿真图
图2交通控制模块的波形仿真图
c. 交通控制模块的元件图
图3 交通控制模块生成元件图
d. 输入、输出接口说明
表1 交通控制模块的输入\输出接口说明
接口名称 | 类型(输入\输出) | 引脚 | 说明 |
CLK | IN | 1 | 时钟信号 |
SM | IN | 3 | 主道车信号 |
SB | IN | 5 | 支道车信号 |
MR | OUT | 2 | 主道红灯 |
MG | OUT | 4 | 主道绿灯 |
MY | OUT | 6 | 主道黄灯 |
BG | OUT | 8 | 支道绿灯 |
BY | OUT | 10 | 支道黄灯 |
BR | OUT | 12 | 支道红灯 |
a.45s定时模块的程序设计
——CNT45S
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT45S IS
PORT(SB,CLK,EN45:IN STD_LOGIC;
DOUT45M,DOUT45B:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY CNT45S;
ARCHITECTURE ART OF CNT45S IS
SIGNAL CNT6B:STD_LOGIC_VECTOR(5 DOWNTO 0); --信号类型矢量类
BEGIN
PROCESS(SB,CLK,EN45)IS --进程开始
BEGIN
IF SB='0'THEN CNT6B<=CNT6B-CNT6B-1;
ELSIF(CLK'EVENT AND CLK='1')THEN
IF EN45='1'THEN CNT6B<=CNT6B+1; --加法计数器
ELSIF EN45='0'THEN CNT6B<=CNT6B-CNT6B-1;
END IF;
END IF;
END PROCESS;
PROCESS(CNT6B)IS
BEGIN
CASE CNT6B IS --倒计时
WHEN"000000"=>DOUT45M<="01000101";DOUT45B<="01010000";
WHEN"000001"=>DOUT45M<="01000100";DOUT45B<="01001001";
WHEN"000010"=>DOUT45M<="01000011";DOUT45B<="01001000";
WHEN"000011"=>DOUT45M<="01000010";DOUT45B<="01000111";
WHEN"000100"=>DOUT45M<="01000001";DOUT45B<="01000110";
WHEN"000101"=>DOUT45M<="01000000";DOUT45B<="01010101";
WHEN"000110"=>DOUT45M<="00111001";DOUT45B<="01000100";
WHEN"000111"=>DOUT45M<="00111000";DOUT45B<="01000011";
WHEN"001000"=>DOUT45M<="00110111";DOUT45B<="01000010";
WHEN"001001"=>DOUT45M<="00110110";DOUT45B<="01000001";
WHEN"001010"=>DOUT45M<="00110101";DOUT45B<="01000000";
WHEN"001011"=>DOUT45M<="00110100";DOUT45B<="01101001";
WHEN"001100"=>DOUT45M<="00110011";DOUT45B<="00111000";
WHEN"001101"=>DOUT45M<="00110010";DOUT45B<="00110111";
WHEN"001110"=>DOUT45M<="00110001";DOUT45B<="00110110";
WHEN"001111"=>DOUT45M<="00110000";DOUT45B<="00110101";
WHEN"010000"=>DOUT45M<="00101001";DOUT45B<="00110100";
WHEN"010001"=>DOUT45M<="00101000";DOUT45B<="00110011";
WHEN"010010"=>DOUT45M<="00100111";DOUT45B<="00110010";
WHEN"010011"=>DOUT45M<="00100110";DOUT45B<="00110001";
WHEN"010100"=>DOUT45M<="00100101";DOUT45B<="00110000";
WHEN"010101"=>DOUT45M<="00100100";DOUT45B<="00101001";
WHEN"010110"=>DOUT45M<="00100011";DOUT45B<="00101000";
WHEN"010111"=>DOUT45M<="00100010";DOUT45B<="00100111";
WHEN"011000"=>DOUT45M<="00100001";DOUT45B<="00100110";
WHEN"011001"=>DOUT45M<="00100000";DOUT45B<="00100101";
WHEN"011010"=>DOUT45M<="00011001";DOUT45B<="00100100";
WHEN"011011"=>DOUT45M<="00011000";DOUT45B<="00100011";
WHEN"011100"=>DOUT45M<="00010111";DOUT45B<="00100010";
WHEN"011101"=>DOUT45M<="00010110";DOUT45B<="00100001";
WHEN"011110"=>DOUT45M<="00010101";DOUT45B<="00100000";
WHEN"011111"=>DOUT45M<="00010100";DOUT45B<="00011001";
WHEN"100000"=>DOUT45M<="00010011";DOUT45B<="00011000";
WHEN"100001"=>DOUT45M<="00010010";DOUT45B<="00010111";
WHEN"100010"=>DOUT45M<="00010001";DOUT45B<="00010110";
WHEN"100011"=>DOUT45M<="00010000";DOUT45B<="00010101";
WHEN"100100"=>DOUT45M<="00001001";DOUT45B<="00010100";
WHEN"100101"=>DOUT45M<="00001000";DOUT45B<="00010011";
WHEN"100110"=>DOUT45M<="00000111";DOUT45B<="00010010";
WHEN"100111"=>DOUT45M<="00000110";DOUT45B<="00010001";
WHEN"101000"=>DOUT45M<="00000101";DOUT45B<="00010000";
WHEN"101001"=>DOUT45M<="00000100";DOUT45B<="00001001";
WHEN"101010"=>DOUT45M<="00000011";DOUT45B<="00001000";
WHEN"101011"=>DOUT45M<="00000010";DOUT45B<="00000111";
WHEN"101100"=>DOUT45M<="00000001";DOUT45B<="00000110";
WHEN OTHERS=>DOUT45M<="00000000";DOUT45B<="00000000";
END CASE;
END PROCESS;
END ARCHITECTURE ART;
b. 45s定时模块的波形仿真图
图4 45s定时模块的波形仿真图
c.45s定时模块的元件图
图5 45s定时模块的元件图
d. 输入、输出接口说明
表2 计分模块的输入\输出接口说明
接口名称 | 类型(输入\输出) | 引脚 | 说明 |
SB | 输入 | 1 | 支道车信号 |
CLK | 输入 | 2 | 分时钟信号 |
EN45 | 输入 | 5 | 使能信号 |
DOU45S[7..0] | 输出 | 21 | 输出 |
DOU45B[7..0] | 输出 | 22 | 输出 |
——CNT25S
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
entity cnt25s is
port(sb,sm,clk,en25:in std_logic;
dout25m,dout25b:out std_logic_vector(7 downto 0));
end entity cnt25s;
architecture art of cnt25s is
signal cnt5b:std_logic_vector(4 downto 0);
begin
process(sb,sm,clk,en25)is
begin
if sb='0' or sm='0' then --25进制加法计数器
cnt5b<=cnt5b-cnt5b-1;
elsif(clk'event and clk='1')then
if en25='1'then
cnt5b<=cnt5b+1;
elsif en25='0'then
cnt5b<=cnt5b-cnt5b-1;
end if;
end if;
end process;
process(cnt5b) is --倒计时
begin
case cnt5b is
when "00000" =>dout25b<="00100101";dout25m<="00110000";
when "00001" =>dout25b<="00100100";dout25m<="00110000";
when "00010" =>dout25b<="00100011";dout25m<="00110000";
when "00011" =>dout25b<="00100010";dout25m<="00110000";
when "00100" =>dout25b<="00100001";dout25m<="00110000";
when "00101" =>dout25b<="00100000";dout25m<="00110000";
when "00110" =>dout25b<="00011001";dout25m<="00110000";
when "00111" =>dout25b<="00011000";dout25m<="00110000";
when "01000" =>dout25b<="00010111";dout25m<="00110000";
when "01001" =>dout25b<="00010110";dout25m<="00110000";
when "01010" =>dout25b<="00010101";dout25m<="00110000";
when "01011" =>dout25b<="00010100";dout25m<="00110000";
when "01100" =>dout25b<="00010011";dout25m<="00110000";
when "01101" =>dout25b<="00010010";dout25m<="00110000";
when "01110" =>dout25b<="00010001";dout25m<="00110000";
when "01111" =>dout25b<="00010000";dout25m<="00110000";
when "10000" =>dout25b<="00001001";dout25m<="00110000";
when "10001" =>dout25b<="00001000";dout25m<="00110000";
when "10010" =>dout25b<="00000111";dout25m<="00110000";
when "10011" =>dout25b<="00000110";dout25m<="00110000";
when "10100" =>dout25b<="00000101";dout25m<="00110000";
when "10101" =>dout25b<="00000100";dout25m<="00110000";
when "10110" =>dout25b<="00000011";dout25m<="00110000";
when "10111" =>dout25b<="00000010";dout25m<="00110000";
when "11000" =>dout25b<="00000001";dout25m<="00110000";
when others =>dout25b<="00000000";dout25m<="00000000";
end case;
end process;
end architecture art;
.b. 25s定时模块的波形仿真图
图6 25s定时模块的波形仿真图
c.25s定时模块的元件图
图7 25s定时模块的元件图
a. 5s定时模块的程序设计
——CNT05S
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT05S IS --定义实体
PORT(CLK,EN05M,EN05B:IN STD_LOGIC;
DOUT5:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY CNT05S;
ARCHITECTURE ART OF CNT05S IS
SIGNAL CNT3B:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS(CLK,EN05M,EN05B)IS
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF EN05M='1'OR EN05B='1'THEN
CNT3B<=CNT3B+1;
ELSE
CNT3B<="000";
END IF;
END IF;
END PROCESS;
PROCESS(CNT3B)IS
BEGIN
CASE CNT3B IS
WHEN"000"=>DOUT5<="00000101";
WHEN"001"=>DOUT5<="00000100";
WHEN"010"=>DOUT5<="00000011";
WHEN"011"=>DOUT5<="00000010";
WHEN"100"=>DOUT5<="00000001";
WHEN OTHERS=>DOUT5<="00000000";
END CASE;
END PROCESS;
END ARCHITECTURE ART;
b. 5s定时模块的波形仿真图
图8 5s定时模块的波形仿真
c.、5s定时模块的元件图
图9 5s定时模块的元件图
(3)显示控制模块
a.显示控制模块的程序
——XSKZ
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY XIANSHI IS
PORT(EN45,EN25,EN05M,EN05B:IN STD_LOGIC;
AIN45M,AIN45B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
AIN25M,AIN25B,AIN05:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUTM,DOUTB:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY XIANSHI;
ARCHITECTURE ART OF XIANSHI IS
BEGIN
PROCESS(EN45,EN25,EN05M,EN05B)IS --选择模块
BEGIN
IF EN45='1'THEN
DOUTM<=AIN45M(7 DOWNTO 0);DOUTB<=AIN45B(7 DOWNTO 0);
ELSIF EN05M='1'THEN
DOUTM<=AIN05(7 DOWNTO 0);DOUTB<=AIN05(7 DOWNTO 0);
ELSIF EN25='1'THEN
DOUTM<=AIN25M(7 DOWNTO 0);DOUTB<=AIN25B(7 DOWNTO 0);
ELSIF EN05B='1'THEN
DOUTM<=AIN05(7 DOWNTO 0);DOUTB<=AIN05(7 DOWNTO 0);
END IF;
END PROCESS;
END ARCHITECTURE ART;
b.25s定时模块的元件图
图10 显示控制生成元件图
三、十字路口交通灯控制器
设计交通控制器主要就是设计控制电路、定时时器电路和译码器电路三部分。在设计完这三部分的程序之后进行波形仿真,创建原件,其它的按照电路功能的要求直接调用器件,然后进行连接,实现其总体的功能。
1. 十字路口交通灯控制器原理图
图11 十字路口交通灯控制器原理图
2. 十字路口交通灯控制器的波形仿真图
图12 十字路口交通灯控制器的波形仿真图
3、十字路口交通灯控制器的元件图
图13 十字路口交通灯控制器的元件图
4、输入输出管脚说明
表3 交通灯控制器管脚
接口名称 | 类型(输入/输出) | 引脚号 | 说明 |
CLK | IN | 1 | 时钟脉冲 |
SM | IN | 3 | 主道传感器 |
SB | IN | 5 | 支道传感器 |
MR | OUT | 7 | 主道红灯 |
MY | OUT | 9 | 主道黄灯 |
MG | OUT | 8 | 主道绿灯 |
BY | OUT | 11 | 支道黄灯 |
BR | OUT | 12 | 支道红灯 |
BG | OUT | 15 | 支道绿灯 |
ZDI | OUT | 20 | 主道显示管个位 |
ZGAO | OUT | 17 | 主道显示管十位 |
BDI | OUT | 24 | 支道显示管个位 |
BGAO | OUT | 28 | 支道显示管十位 |
通过综合实验的思考和设计,对一个项目的整体设计有了进一步认识。第一次看到这样的大题目,困难重重,掌握他的工作原理以及控制结构花了大部分时间,其次就是编写程序。当看到要求后,应该对项目进行分功能和模块的设计,自顶向下,完成顶层的设计后,再编写功能模块。模块化设计便于修改和查错。通过程序的编写,加深了对VHDL语言的了解,提高了编程能力。这次设计我感觉程序调试最重要,我在编完各模块程序之后,编译查错最初有二十几个错误,有输入错误、语法错误。一遍一遍的编译查错,直到没有错误。必须注意工程名和实体名一致,以及保存过程中出现同名,调不出元件图。在没有错误之后可以进行波型仿真。若与理想的不同,再查看程序,有无原理上的编辑错误或没有查出的输入错误。锻炼了发现问题解决问题的能力,提高了个人素质。
五.参考文献
[1] 谭会生,瞿遂春.EDA综合应用与实例分析. 西安:西安电子科技大学出版社,2004,11.
[2]潘松著.EDA技术实用教程(第二版). 北京:科学出版社,2005.
[3] 谭会生,张昌凡编著.EDA技术及应用. 西安:西安电子科技大学出版社.2011,1.
[4] 阎石主编.数字电子技术基础. 北京:高教出版社,2003.
[5] 刘艳萍,高振斌,李志军.EDA实用技术及应用[M].北京:国防工业出版社,2006