返回信息流10MHz时钟的上升沿,输入4路数据,原本的程序架构是,A、B、C都用同一个时钟驱动,但是这样A处理的是上一个clock的数据,而B处理的是上两个clock的数据。
现在我的想法是上面两路数据用写成一个模块,下面两路一个模块,每个clock输出4路到C,然后C用组合逻辑电路,问题是这样好像不能保证信号同步到达C。
向大家求助了,有时候真的想像单片机那样一个always全部写完。。。
这是一条镜像帖。来源:北邮人论坛 / circuit / #22306同步于 2013/3/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
问一下FPGA程序结构
ocean
2013/3/22镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
A.B模块用了几个clock 上面两路数据在C模块里面打几拍不就行了, 理论上好解决吧,注意下路径延迟问题,进组合逻辑之前,都用时序逻辑并且延迟相同时间是可以的吧 --
那应该要求时钟频率大于数据率吧?有可能实现一个时钟将数据都处理完并且输出么?
【 在 kimi169 的大作中提到: 】
A.B模块用了几个clock 上面两路数据在C模块里面打几拍不就行了, 理论上好解决吧,注意下路径延迟问题,进组合逻辑之前,都用时序逻辑并且延迟相同时间是可以的吧 --
FPGA程序中最重要的原则 同步 流水,这要符合这两点,一般很难出错。能一个时钟域处理就不要跨时钟域。你想说的是A B 模块有延迟,跟信号直接到C模块对不齐嘛。你把输入到C模块的信号延迟到跟B模块输出对齐就行了。用时序逻辑,不要用组合逻辑。这样就能保证对齐,不用考虑什么布线延迟
大致意思了解,可是感觉有点矛盾。用时序逻辑的话,A B C都用同一个时钟驱动,但是在t1时刻,B是处理t1-1时刻A输出的数据,这样不就必然跨时钟域嘛?
【 在 chrischen25 的大作中提到: 】
: FPGA程序中最重要的原则 同步 流水,这要符合这两点,一般很难出错。能一个时钟域处理就不要跨时钟域。你想说的是A B 模块有延迟,跟信号直接到C模块对不齐嘛。你把输入到C模块的信号延迟到跟B模块输出对齐就行了。用时序逻辑,不要用组合逻辑。这样就能保证对齐,不用考虑什么布线延迟
跨时钟域是指两个不同频率之间的时钟域有信号交互,你这个都工作在同一个时钟下,不是跨时钟域啊
【 在 ocean 的大作中提到: 】
: 大致意思了解,可是感觉有点矛盾。用时序逻辑的话,A B C都用同一个时钟驱动,但是在t1时刻,B是处理t1-1时刻A输出的数据,这样不就必然跨时钟域嘛?
:
噢噢,原来如此,了解了。灰常感谢!
【 在 chrischen25 的大作中提到: 】
: 跨时钟域是指两个不同频率之间的时钟域有信号交互,你这个都工作在同一个时钟下,不是跨时钟域啊
我现在有空,给你写个
---------------------------------------------------------------------------------------------------------------------------------
--// 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就是分别控制固定流水线延迟后,同步后的数据。