打印

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

[复制链接]
3059|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tong2gang|  楼主 | 2007-8-2 23:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天郁闷了一天,麻烦大侠们帮我看一下.
想写一条程序实现单片机并行发数据3个8位的数据给FPGA,共24位,FPGA提取前20位.一个时钟口和一个FPGA数据输出使能.时钟由单片机控制,每个时钟周期输入8位数据.程序如下,可就是实现不了.能帮个忙说下哪里没弄好吗?
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
Use ieee.std_logic_unsigned.all;
Entity Buf is
    port(datain:in std_logic_vector(7 downto 0);--数据进
        clk        :in std_logic;--时钟
        en         :in std_logic;--输出使能
        dataout:inout std_logic_vector(19 downto 0)--数据出
        );
end Buf;
architecture rtl of Buf is
signal databuf:std_logic_vector(23 downto 0);
signal count:std_logic_vector(1 downto 0);
begin
    process(clk)
    begin
        if(clk 'event and clk='1')then
            if(count="10")then
                count<="00";
            else count<=count+1;
            end if;                        
        end if;
    end process;
    process(count)
    begin    
            CASE count IS
                WHEN "00" =>
                    databuf(23 downto 16)<=datain;
                WHEN "01" =>
                    databuf(15 downto 8)<=datain;
                WHEN "10"=>
                    databuf(7 downto 0)<=datain;
                WHEN others =>
                    databuf<=databuf;
            END CASE;        
    end process;
    process(clk)
    begin
        if(en='1')then
            dataout<=databuf(19 downto 0);
        else dataout<=dataout;
        end if;
    end process;
end rtl; 

相关帖子

沙发
sibaidong| | 2007-8-3 10:35 | 只看该作者

VHDL程序有问题!


signal databuf:std_logic_vector(23 downto 0);

别用信号了,用变量吧!

使用特权

评论回复
板凳
至尊宝| | 2007-8-3 10:47 | 只看该作者

给你参考一下

process(clk,clr)
variable i : integer range 0 to 7;
begin
    if clr='0' then
             i := 0;
    elsif clk'event and clk='0' then            
        if i<6 then
            SReg(i) <= data;
             i := i+1;
              else
              i :=0 ;
              end if;
    end if;
end process;

使用特权

评论回复
地板
wolaiye3| | 2007-8-4 12:12 | 只看该作者

为什么没有复位信号

使用特权

评论回复
5
mybao| | 2007-8-4 12:53 | 只看该作者

re

WHEN "00" =>
           databuf(23 downto 16)<=datain;
count 不等于 "00"时,databuf(23 downto 16)等于多少呢?

用并发的when语句吧,
    databuf(23 downto 16)<=datain WHEN count="00" ELSE 
                              databuf(23 downto 16);
    databuf(15 downto 8)<=datain WHEN count="01" ELSE 
                              databuf(15 downto 8);
    databuf(7 downto 0)<=datain WHEN count="10" ELSE 
                              databuf(7 downto 0);


现在不能实现你的功能,也不一定是VHDL的问题,可能单片机的软件也有问题。反正我觉得这个逻辑做的不够好,导致单片机程序实现起来要考虑很多问题。

现在这么设计的话,datain只能用IO的方式和单片机接口,datain和clk要配合好,必须保证单片机输出一个datain后,再输出一个CLK,必须在三个CLK后使能en信号,偶觉得最好是边沿触发。

还不如用FPGA三个字节的SRAM,单片机和FPGA用总线接口,单片机软件实现也方便,定义三个变量就搞定了,输出三个变量之后,再置位单片机一个IO引脚,通知FPGA的dataout输出三个SRAM里面的数据,这样逻辑也简单。

使用特权

评论回复
6
wzg518| | 2007-8-8 17:09 | 只看该作者

??

你程序中为什么没有用到EN和DATAOUT啊?那么你定义它 ,有意义?

使用特权

评论回复
7
vfdff| | 2007-8-11 13:31 | 只看该作者

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

    process(clk)
    begin
        if(clk 'event and clk='1')then
            if(count="10")then
                count<="00";
            else count<=count+1;
            end if;                        
        end if;
    end process;
程序中缺少复位,所以当count>‘10’时状态不定,可能会出错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

26

帖子

0

粉丝