社区导航

 

搜索
查看: 112|回复: 3

[讨论] 想用FPGA做个SPI Slave,有几个关于时钟的问题请教一下

[复制链接]

18

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-7-5 11:39 | 显示全部楼层 |阅读模式
本帖最后由 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论坛


回复

使用道具 举报

2150

TA的帖子

0

TA的资源

裸片初长成(初级)

Rank: 10Rank: 10Rank: 10

荣誉会员勋章

发表于 2019-7-5 22:39 | 显示全部楼层

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

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

203.34 KB, 下载次数: 2

请修改签名 ^_^


回复

使用道具 举报

2150

TA的帖子

0

TA的资源

裸片初长成(初级)

Rank: 10Rank: 10Rank: 10

荣誉会员勋章

发表于 2019-7-5 22:41 | 显示全部楼层

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

请修改签名 ^_^


回复

使用道具 举报

18

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

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



回复

使用道具 举报

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

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-16 06:51 , Processed in 0.139393 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表