简单的单片机与FPGA并行通信VHDL程序

[复制链接]
3870|6
 楼主| tong2gang 发表于 2007-8-2 23:55 | 显示全部楼层 |阅读模式
今天郁闷了一天,麻烦大侠们帮我看一下.<br />想写一条程序实现单片机并行发数据3个8位的数据给FPGA,共24位,FPGA提取前20位.一个时钟口和一个FPGA数据输出使能.时钟由单片机控制,每个时钟周期输入8位数据.程序如下,可就是实现不了.能帮个忙说下哪里没弄好吗?<br />LIBRARY&nbsp;IEEE;<br />USE&nbsp;IEEE.STD_LOGIC_1164.ALL;<br />Use&nbsp;ieee.std_logic_unsigned.all;<br />Entity&nbsp;Buf&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;port(datain:in&nbsp;std_logic_vector(7&nbsp;downto&nbsp;0);--数据进<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;std_logic;--时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;en&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;std_logic;--输出使能<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataout:inout&nbsp;std_logic_vector(19&nbsp;downto&nbsp;0)--数据出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />end&nbsp;Buf;<br />architecture&nbsp;rtl&nbsp;of&nbsp;Buf&nbsp;is<br />signal&nbsp;databuf:std_logic_vector(23&nbsp;downto&nbsp;0);<br />signal&nbsp;count:std_logic_vector(1&nbsp;downto&nbsp;0);<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(clk&nbsp;'event&nbsp;and&nbsp;clk='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count=&quot;10&quot;)then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&lt=&quot;00&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;count&lt=count+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(count)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CASE&nbsp;count&nbsp;IS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHEN&nbsp;&quot;00&quot;&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(23&nbsp;downto&nbsp;16)&lt=datain;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHEN&nbsp;&quot;01&quot;&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(15&nbsp;downto&nbsp;8)&lt=datain;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHEN&nbsp;&quot;10&quot;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(7&nbsp;downto&nbsp;0)&lt=datain;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHEN&nbsp;others&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf&lt=databuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;CASE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(en='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataout&lt=databuf(19&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;dataout&lt=dataout;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />end&nbsp;rtl;&nbsp;
sibaidong 发表于 2007-8-3 10:35 | 显示全部楼层

VHDL程序有问题!

“<br />signal&nbsp;databuf:std_logic_vector(23&nbsp;downto&nbsp;0);<br />”<br />别用信号了,用变量吧!
至尊宝 发表于 2007-8-3 10:47 | 显示全部楼层

给你参考一下

process(clk,clr)<br />variable&nbsp;i&nbsp;:&nbsp;integer&nbsp;range&nbsp;0&nbsp;to&nbsp;7;<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;clr='0'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;elsif&nbsp;clk'event&nbsp;and&nbsp;clk='0'&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&lt6&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SReg(i)&nbsp;&lt=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:=&nbsp;i+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:=0&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />end&nbsp;process;
wolaiye3 发表于 2007-8-4 12:12 | 显示全部楼层

为什么没有复位信号

  
mybao 发表于 2007-8-4 12:53 | 显示全部楼层

re

WHEN&nbsp;&quot;00&quot;&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(23&nbsp;downto&nbsp;16)&lt=datain;<br />count 不等于&nbsp;&quot;00&quot;时,databuf(23&nbsp;downto&nbsp;16)等于多少呢?<br /><br />用并发的when语句吧,<br />    databuf(23&nbsp;downto&nbsp;16)&lt=datain WHEN&nbsp;count=&quot;00&quot;&nbsp;ELSE&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(23&nbsp;downto&nbsp;16);<br />    databuf(15&nbsp;downto&nbsp;8)&lt=datain WHEN&nbsp;count=&quot;01&quot;&nbsp;ELSE&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(15&nbsp;downto&nbsp;8);<br />    databuf(7&nbsp;downto&nbsp;0)&lt=datain WHEN&nbsp;count=&quot;10&quot;&nbsp;ELSE&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databuf(7&nbsp;downto&nbsp;0);<br /><br /><br />现在不能实现你的功能,也不一定是VHDL的问题,可能单片机的软件也有问题。反正我觉得这个逻辑做的不够好,导致单片机程序实现起来要考虑很多问题。<br /><br />现在这么设计的话,datain只能用IO的方式和单片机接口,datain和clk要配合好,必须保证单片机输出一个datain后,再输出一个CLK,必须在三个CLK后使能en信号,偶觉得最好是边沿触发。<br /><br />还不如用FPGA三个字节的SRAM,单片机和FPGA用总线接口,单片机软件实现也方便,定义三个变量就搞定了,输出三个变量之后,再置位单片机一个IO引脚,通知FPGA的dataout输出三个SRAM里面的数据,这样逻辑也简单。<br />
wzg518 发表于 2007-8-8 17:09 | 显示全部楼层

??

你程序中为什么没有用到EN和DATAOUT啊?那么你定义它&nbsp;,有意义?
vfdff 发表于 2007-8-11 13:31 | 显示全部楼层

单片机与FPGA并行通信VHDL程序

&nbsp;&nbsp;&nbsp;&nbsp;process(clk)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(clk&nbsp;'event&nbsp;and&nbsp;clk='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count=&quot;10&quot;)then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&lt=&quot;00&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;count&lt=count+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />程序中缺少复位,所以当count&gt‘10’时状态不定,可能会出错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部