文档库 最新最全的文档下载
当前位置:文档库 › 基于FPGA的VHDL并串转换

基于FPGA的VHDL并串转换

基于FPGA的VHDL并串转换
基于FPGA的VHDL并串转换

Yibin University
电子信息技术与科学专业
题 专
目 业
并串转换总线接口电路 电子信息科学与技术 张伟 110303013 物电 2011 级 硕勋励志班 李庆
_
___
学生姓名 学 年 班 号 级 级
指导教师
2013 年
06 月 05


一、电路功能:
1、本电路能实现 FPGA 与单片机的部分接口功能,使单片机与 FPGA 能进行简单通信的 功能,即单片机通过 ALE、WR、P0、P2 管脚与 FPGA 相连接,通过这几个控制引,指导 FPGA 进行并串转换。同时,在 FPGA 上自带有 reset 与 CLK,实现对系统的清零复位,保证串行 输出有条进行。
图 1:FPGA 接口电路 2、来自单片机的时序
图 2:时序

3、输出大概波形
图 3:波形 二、具体电路功能: (1)单片机是一个拥有多扩展模块的芯片,所以,首先我们要设计地址总线。本题中设地
址为 0FA01H,当 ALE 来一个上升沿时,我们要锁存当前,P2 口和 P0 口的地址,然后再将 此地址与 0FA01H 比较。若比较结果相等,则选中该 FPGA
(2)选中该 FPGA 时,若单片机发一个写有效来(WR=0),则将 P0 口的数据读入 FPGA 内部 数据锁存器.当数据读入后,同时,内部应该产生一个读入完成信号 ready,以便通知 FPGA 进行并串转换。 (3)并串转换当 ready 有效时,开始进行并串转换,并输出 Q 串口按时钟 clk 将数据一 个 一 个 输 出 , 当 并 串 转 换 结 束 后 , 应 当 产 生 一 个 结 束 控 制 标 志 ( 本 电路中将 LD 结 束标志)使 ready 无效,停止并串转换。 (4)在前一个数据没有转换完之前,即使有新的数据进来要求发送,FPGA 不予理睬,直到 转换结束,SCLK,LD,Q,都应维持在低电平,等待下一个转换信号 ready 的到来。 三、设计思路: 1) 实体 1 进行接收来自单片机的信号,向实体 2 输出一个 READY 信号,和 8 位数据信息。 首先判断 ALE 信号的到来,锁存地址信息,和“FA01 比较”,若相等,锁存来自 P0 口 的 8 位数据,产生 READY 信号,通知实体 2 开始并串转换。 2) 实体 2 接收到来自实体 1 的 READY 信号后保存数据,开始并串转换, 1, SCLK 产生时钟信号,Q 端一次从高位到低位依次输出串口数据。8 位数据转换完毕 LD 产生一个周期的高电平, 2, 整个电路由状态机来完成,共有 4 个状态(idle,recieve,shift,finish),分别是空闲、 接收、转换、完成系统复位后,到空闲状态,当有 READY 信号时,到接收状态,锁存
实体 1 的数据,到转换状态,转换 8 次,转换结束时,到完成状态,接着回
到空闲状态,等待下一个 READY 信号的到来。

3, 空闲状态时,LD、SCLK、Q 输出为低电平,接收状态时,锁存数据到 reg 中,转换状态 时,SCLK 产生一个 8 个时钟信号,时钟信号时来自 CLK 的 2 分频。Q 端从 reg 的高位到 低位依次输出串口数据,输出完毕,完成状态时,LD 产生上升脉冲。
3) 接口图
图 4:实体 1 接口图
图 5:实体 2 接口图
图 6:最终电路图

四、实验源程序(见附件) 五、仿真结果并分析 1,实体 1,接收来自单片机的数据。
实体 1 仿真波形
分析:在第一个 ALE 信号到来时,地址信息为 FA01,等待 WR 信号的到来,然后 锁存了,来自 P0 口的数据 16#02 并维持。而且在 READY 输出一个周期的高电平, 通知实体 2 并串转换。在第二个 ALE 到来时,地址信号为 FB03 与规定的地址不 和,READY 并没有产生脉冲信号,后面的数据不比并串转换,丢掉该数据。它完 成了所给定的任务,
2.实体 2,转换输出数据,
实体 2 的仿真图形 分析:系统复位后,状态 c_s 为 00,也就是前面设计时的空闲状态,SCLK、LD、 Q 数据都为低电平, 接收到 READY 信号后, 状态 c_s 变为 01, reg 锁存来自 DATAIN 的 8 位数据 16#9F,接着状态 c_s 变为 10,SCLK 共有 8 个脉冲,Q 端在 SCLK 上 升沿时输出的数据分别是”100111111”,就是接收到的数据 16#9F。状态 c_s 变为 11,LD 产生一个周期的高电平,c_s 回到 00 空闲状态,等待下一个 READY 信号的到来,这个实体完成了我所需要的功能。

附件:源程序
实体 1:接收来自单片机的信号,并锁存。
library ieee; use ieee.std_logic_1164.all; ------------------------------------entity usb is BEGIN port( P2,P0:IN BIT_VECTOR(7 DOWNTO 0);--数据和地址位 ALE,WR:IN BIT;--地址锁存,写信 号 END IF; DATAOUT:OUT BIT_VECTOR(7 DOWNTO 0);--输出 8 位数据 READY:OUT BIT);--准备好信号, 请求后续电路转换 END ENTITY; ------------------------------------architecture art of usb is SIGNAL ADDR:BIT_VECTOR(15 DOWNTO 0);-地址锁存, SIGNAL DATEIN:BIT_VECTOR(7 DOWNTO 0);-数据锁存 IF ADDR="1111101000000001" THEN --地址为 0FA01 再判断数据位 IF WR='0' THEN DATAOUT<=P0;READY<='1';-- 数据更新, 请 求转换信号 ELSE READY<='0';--保存数据 END IF; END IF; END PROCESS; END; IF ALE='1' THEN ADDR<=P2&P0;--地址锁存 BEGIN PROCESS(ALE,WR)IS--接收来自单片机 的数据并锁存

实体 2:接收转换部分
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; -------------------------------entity zhuanhuan is port( CLK,reset:IN BIT; DATAIN:IN BIT_VECTOR(7 DOWNTO 0); end if; READY:IN BIT; end process; SCLK:BUFFER BIT; Q,LD:OUT BIT); process(c_s,cnt,READY)--状态机 END ENTITY; begin -------------------------------case c_s is architecture art of zhuanhuan is when idle =>--空闲状态 signal cnt :integer range 0 to 31;--计 数,串口发送数据 8 次 signal reg_en : BIT;--接收信号。 signal shift_start:BIT;--转换信号,低 电平有效 type state is (idle,recieve,shift,finish);---定义 4 种状态,空闲、接收、转换、完成 signal c_S, n_s: state;--当前状态,下 一个状态 reg_en <= '1'; LD<='0'; shift_start <= '1'; if(READY = '1') then--有新 的数据要转换,到接收状态 n_s <= recieve; reg_en<='0'; else elsif(CLK'event and CLK = '1') then c_s <= n_s;--时钟到来,更新当前状态 process(reset,CLK)IS--状态交换, begin if(reset= '0') then c_s <= idle;-复位当前状态置为空闲 BEGIN

n_s <= idle; end if; when recieve =>--接收状态 reg_en <= '0';
end case; end process; process(reset,CLK,reg_en,shift_start) --转换进程 VARIABLE reg : BIT_vector(7 downto 0);
shift_start <= '1';--开始 转换 n_s<= shift;--下一状态,转 换 cnt<=0;reg:=(others=>'0'); when shift => elsif(CLK'event and CLK = '1') then reg_en <= '1'; if(cnt =16) then shift_start <= '1';-转换 8 次后,到完成状态 1 n_s <= finish; else shift_start <= '0';-没有转换结束,继续转换 n_s <= shift; reg:=reg(6 downto end if; when finish =>--转换完成 reg_en <= '1'; LD<='1'; shift_start <= '1';--转换 信号置为无效 end if; n_s <= idle; end process; when others => END architecture; n_s <= idle; 0)&'0'; END IF; cnt<=cnt+1; else cnt<=0;Q<='0'; end if; if(reg_en='0')then reg:=DATAIN; elsif(shift_start ='0') then-转换 SCLK<=NOT SCLK; if(SCLK='0')THEN Q<=reg(7); begin if(reset='0') then

相关文档