3746|4

16

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

想用FPGA做个SPI Slave,有几个关于时钟的问题请教一下 [复制链接]

本帖最后由 zengxy3407 于 2019-7-6 14:07 编辑

Hi,各位看官,

作为一个新手,我想用FPGA实现一个SPI Slave,网上搜了一下别人的实现方式,有两点困惑请各位大牛指点一下:

 

1. 数据移位到底是直接用外部的SCLK边沿好还是用系统时钟同步后的SCLK边沿好?或者各有什么优缺点?

 

2. 在一段Process中在系统时钟的上升沿判断某个量的状态,而在另一个Process中又在系统时钟上升沿改变这个量的状态,这样会不会产生竞争?比如这段代码:


    -- -------------------------------------------------------------------------

    --  SPI CLOCK REGISTER

    -- -------------------------------------------------------------------------



    -- The SPI clock register is necessary for clock edge detection.

    spi_clk_reg_p : process (CLK)

    begin

        if (rising_edge(CLK)) then

            if (RST = '1') then

                spi_clk_reg <= '0';

            else

                spi_clk_reg <= SCLK;

            end if;

        end if;

    end process;



    -- -------------------------------------------------------------------------

    --  SPI CLOCK EDGES FLAGS

    -- -------------------------------------------------------------------------



    -- Falling edge is detect when SCLK=0 and spi_clk_reg=1.

    spi_clk_fedge_en <= not SCLK and spi_clk_reg;

    -- Rising edge is detect when SCLK=1 and spi_clk_reg=0.

    spi_clk_redge_en <= SCLK and not spi_clk_reg;

    其中的CLK为系统时钟,它的spi_clk_reg是在CLK的上升沿锁存的,因此得到的spi_clk_fedge_en和spi_clk_redge_en应该也是和CLK上升沿对齐的。但是,在数据移位的时候,用的也是CLK的上升沿:


    -- -------------------------------------------------------------------------

    --  RECEIVED BITS COUNTER

    -- -------------------------------------------------------------------------



    -- The counter counts received bits from the master. Counter is enabled when

    -- falling edge of SPI clock is detected and not asserted CS_N.

    bit_cnt_p : process (CLK)

    begin

        if (rising_edge(CLK)) then

            if (RST = '1') then

                bit_cnt <= (others => '0');

            elsif (spi_clk_fedge_en = '1' and CS_N = '0') then

                if (bit_cnt_max = '1') then

                    bit_cnt <= (others => '0');

                else

                    bit_cnt <= bit_cnt + 1;

                end if;

            end if;

        end if;

    end process;

也就是说同在CLK上升沿的时候,即要改变spi_clk_fedge_en,又要判断spi_clk_fedge_en的状态,这种做法不是容易产生竞争吗?

 

还请各位大牛多多指教

 

 

源代码出处:https://github.com/jakubcabal/spi-fpga

此帖出自FPGA/CPLD论坛

最新回复

直接用外部时钟的话,不利于做流水线,但是可实现的频率上限会高于使用内部时钟采样方式。频率不高的情况,使用过采样同步化后,后面的设计会比较灵活。       详情 回复 发表于 2019-8-5 10:59
点赞 关注
 

回复
举报

2113

帖子

0

TA的资源

裸片初长成(初级)

沙发
 

这儿有一个例程中有SPI的编写方法,希望可以帮到你。

进阶实验_10_RTC[DS1302Z] :读取和设置RTC,时间显示在数码管.rar

203.34 KB, 下载次数: 36

此帖出自FPGA/CPLD论坛
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

板凳
 

其实大部分人不喜欢帮别人看代码,因为他要按照你的思路去将代码阅读一遍,特别浪费时间。

此帖出自FPGA/CPLD论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(初级)

4
 
heningbo 发表于 2019-7-5 22:41 其实大部分人不喜欢帮别人看代码,因为他要按照你的思路去将代码阅读一遍,特别浪费时间。

有道理!直接把问题放最前面

此帖出自FPGA/CPLD论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

直接用外部时钟的话,不利于做流水线,但是可实现的频率上限会高于使用内部时钟采样方式。频率不高的情况,使用过采样同步化后,后面的设计会比较灵活。

 

 

此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表