1478|2

62

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

VHDL在异步时钟下对一个信号进行修改,有问题,有什么修改的方法吗? [复制链接]

本帖最后由 haha丶 于 2023-3-27 08:30 编辑

需要将数据包在40M的时钟下写入FIFO中,在240M的时钟下读出数据包。应为读时钟比写时钟块,并且希望每次可以连续读出一个完整的数据包,所以我的想法是在写入端每次检测到包尾的最高位‘01’时,变量var_cnt + 1,这时若var_cnt不为‘0’读使能置高,同时在读出端监测到包尾的最高位‘01’时,变量var_cnt - 1,若var_cnt为‘0’停止读出。测试时在只发送一个数据包的情况下var_cnt在写入端检测到包尾的最高位‘01’时变量var_cnt + 1=1,在读出端测到包尾的最高位‘01’时变量var_cnt - 1=0,在减到‘0’后一个周期又变为‘1’,FIFO也没读出程序陷入死循环。

 

下图中rxdata30写入FIFO,在检测到包尾最高位‘01’时,cnt由0变1.

下图中fifo_out为FIFO读出数据,在检测到包尾最高位‘01’时,cnt由1变0,但在一个周期后又变为1(写程序时就觉得有问题).

数据包每一帧位宽为30bit,用高两位来区分包头、数据、包尾

这段代码如下,感觉不应该在两个时钟下对一个变量进行修改,该怎么改比较好呢?rxclk为40MHz时钟,rxdata30_1另作它用且正常可以不管。

rx_vr: for i in 0 to 15 generate 
begin 
    process(fe_rst,rxclk,tx_rst,clk240 )
    variable var_cnt : txrx5b_type_16;
    begin        
        if (rxclk'event and rxclk = '1') then
            if (fe_rst = '1' or tx_rst = '1') then
                rxdata30_1(i) <= (others => '0');
            else  
                if (rx_valid(i) = '1' and rx_ready(i) = '1') then
                    rxdata30_1(i) <= rxdata30(i);
                     if(rxdata30(i)(29 downto 28) = "01") then
                        var_cnt(i) := var_cnt(i) + '1';
                    end if;
                end if;
            end if;
        end if;
   
        if (clk240'event and clk240 = '1') then
            if (fe_rst = '1' or tx_rst = '1') then
                var_cnt(i) := (others => '0');
            else                
                    if (fifo_outdout(i)(29 downto 28) = "01" and fifo_outdout1(i)(29 downto 28) = "00") then  --fifo_outdout1 <= fifo_outdout在别的位置写了
                        var_cnt(i) := var_cnt(i) - '1';
                    
                end if;   
            end if;
            
        end if; 
        flit_cnt(i) <=  var_cnt(i);
    end process; 

   

此帖出自FPGA/CPLD论坛

最新回复

关于VHDL在异步时钟下对一个信号进行修改,楼主的想法有什么不对么   详情 回复 发表于 2023-3-27 07:32
点赞 关注
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

关于VHDL在异步时钟下对一个信号进行修改,楼主的想法有什么不对么

此帖出自FPGA/CPLD论坛

点评

就是在发送一个测试包时,写入段和读出端,检测到包尾的‘01’后,var_cnt会正常加减‘1’,但在读出端完成减‘1’的操作一个周期后无缘无故又变回‘1’  详情 回复 发表于 2023-3-27 08:34
 
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
Jacktang 发表于 2023-3-27 07:32 关于VHDL在异步时钟下对一个信号进行修改,楼主的想法有什么不对么

就是在发送一个测试包时,写入段和读出端,检测到包尾的‘01’后,var_cnt会正常加减‘1’,但在读出端完成减‘1’的操作一个周期后无缘无故又变回‘1’

此帖出自FPGA/CPLD论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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