BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #22306同步于 2013/3/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖

问一下FPGA程序结构

ocean
2013/3/22镜像同步9 回复
10MHz时钟的上升沿,输入4路数据,原本的程序架构是,A、B、C都用同一个时钟驱动,但是这样A处理的是上一个clock的数据,而B处理的是上两个clock的数据。 现在我的想法是上面两路数据用写成一个模块,下面两路一个模块,每个clock输出4路到C,然后C用组合逻辑电路,问题是这样好像不能保证信号同步到达C。 向大家求助了,有时候真的想像单片机那样一个always全部写完。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
kimi169机器人#1 · 2013/3/22
A.B模块用了几个clock 上面两路数据在C模块里面打几拍不就行了, 理论上好解决吧,注意下路径延迟问题,进组合逻辑之前,都用时序逻辑并且延迟相同时间是可以的吧 --
ocean机器人#2 · 2013/3/22
那应该要求时钟频率大于数据率吧?有可能实现一个时钟将数据都处理完并且输出么? 【 在 kimi169 的大作中提到: 】 A.B模块用了几个clock 上面两路数据在C模块里面打几拍不就行了, 理论上好解决吧,注意下路径延迟问题,进组合逻辑之前,都用时序逻辑并且延迟相同时间是可以的吧 --
ocean机器人#3 · 2013/3/23
目前打算用一个状态标志了,第一个clock,产生数据;第二个clk,做A处理;第三个,做B处理;第四个,做C处理。时钟速率是信号速率的4倍
chrischen25机器人#4 · 2013/3/24
FPGA程序中最重要的原则 同步 流水,这要符合这两点,一般很难出错。能一个时钟域处理就不要跨时钟域。你想说的是A B 模块有延迟,跟信号直接到C模块对不齐嘛。你把输入到C模块的信号延迟到跟B模块输出对齐就行了。用时序逻辑,不要用组合逻辑。这样就能保证对齐,不用考虑什么布线延迟
ocean机器人#5 · 2013/3/24
大致意思了解,可是感觉有点矛盾。用时序逻辑的话,A B C都用同一个时钟驱动,但是在t1时刻,B是处理t1-1时刻A输出的数据,这样不就必然跨时钟域嘛? 【 在 chrischen25 的大作中提到: 】 : FPGA程序中最重要的原则 同步 流水,这要符合这两点,一般很难出错。能一个时钟域处理就不要跨时钟域。你想说的是A B 模块有延迟,跟信号直接到C模块对不齐嘛。你把输入到C模块的信号延迟到跟B模块输出对齐就行了。用时序逻辑,不要用组合逻辑。这样就能保证对齐,不用考虑什么布线延迟
chrischen25机器人#6 · 2013/3/24
跨时钟域是指两个不同频率之间的时钟域有信号交互,你这个都工作在同一个时钟下,不是跨时钟域啊 【 在 ocean 的大作中提到: 】 : 大致意思了解,可是感觉有点矛盾。用时序逻辑的话,A B C都用同一个时钟驱动,但是在t1时刻,B是处理t1-1时刻A输出的数据,这样不就必然跨时钟域嘛? :
ocean机器人#7 · 2013/3/24
噢噢,原来如此,了解了。灰常感谢! 【 在 chrischen25 的大作中提到: 】 : 跨时钟域是指两个不同频率之间的时钟域有信号交互,你这个都工作在同一个时钟下,不是跨时钟域啊
Rhythm机器人#8 · 2013/6/28
我现在有空,给你写个 --------------------------------------------------------------------------------------------------------------------------------- --// COPYRIGHT(c)2013,BEIJING xxxxxxx TECHNOLOGY CO.,LTD. All Right Reserved. --// --// IP Lib index : IP Library index --// IP Core Name : Capital name of top entity. --// --// File Name : byr_test.vhd --// Entity Name : byr_test --// --// Device : Kintex-7 --// --// Description : data buffer reference design for bbs.byr.cn --// --// Author : rhythm. --// Email : xxxxxxxxx@xxxx.com --// Create Date : 2013-06-28 --// Release Version : --// --// Revision History: --------------------------------------------------------------------------------------------------------------------------------- --// Ver: | Author |Mod. Date |Changes Made: --// V1.0 | Rhythm |2013-06-28 |Initial version --// $log : --------------------------------------------------------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity byr_test is port( --// Global Clock clk :in std_loci; --// Asynchronous/Synchronous Reset, active low arst_n :in std_logic; --// Asynchronous reset (active low) rst_n :in std_logic; --// Synchronous reset (active low) --// Data Input a_din :in std_logic_vector(31 downto 0); c_din :in std_logic_vector(31 downto 0) ); end byr_test; architecture structure of byr_test is --------------------------------------------------------------------------------------------------------------------------------- signal a_data :std_logic_vector(31 downto 0); signal b_data :std_logic_vector(31 downto 0); signal c_din_buf :std_logic_vector(31 downto 0); signal c_data :std_logic_vector(31 downto 0); --------------------------------------------------------------------------------------------------------------------------------- --// Constant Declaration signal forcing_0 :std_logic :='0'; signal forcing_1 :std_logic :='1'; signal high_impedance :std_logic :='Z'; begin --------------------------------------------------------------------------------------------------------------------------------- --// Pipeline Buffer process(clk,arst_n) begin if(arst_n='0')then --// Pipeline Buffered for Channel A a_data <= (others => '0'); b_data <= (others => '0'); --// Pipeline Buffered for Channel C c_din_buf <= (others => '0'); c_data <= (others => '0'); elsif(rising_edge(clk))then if(rst_n='0')then --// Pipeline Buffered for Channel A a_data <= (others => '0'); b_data <= (others => '0'); --// Pipeline Buffered for Channel C c_din_buf <= (others => '0'); c_data <= (others => '0'); else --// Pipeline Buffered for Channel A --// Pipeline phase #1 a_data <= a_din; --// Pipeline phase #2 b_data <= a_data; --// Pipeline Buffered for Channel C --// Pipeline phase #1 c_din_buf <= c_din; --// Pipeline phase #2 c_data <= c_din_buf; end if; end if; end process; --------------------------------------------------------------------------------------------------------------------------------- end structure; 这是个思路,你可以参考一下。【还好你的系统是同步系统[ema34]】 寄存器后的b_data和c_data就是分别控制固定流水线延迟后,同步后的数据。
wangxiaobupt机器人#9 · 2013/6/28
哇 【 在 rhythm 的大作中提到: 】 : 我现在有空,给你写个