网站重新上线,多谢朋友们的关心
添加留言
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]
               

 
知识海啊 Email Homepage
2010/03/02 22:50
溜达溜达!!
Haly
2010/01/21 16:30
您好,我是与非网的.之前听老板说过您的传奇史.对您很是佩服,仰慕.今天在网上无意看到您的网站.看到您对Xilinx FPGA的深入认识,也看到您对网友们的热情解答.更是仰慕不已.而目前与非网刚刚推出Xilinx FPGA技术社区,非常需要像您这样技术精湛,见解深刻,而又热心帮助学习Xilinx 产品的朋友.所以我特别希望您能访问我们的网站,给社区的社员们以技术上的指导,思路上的点拨.并且写一些博文,给后来学习者分享一些学习心得.

网站地址:www.xilinx.eefocus.com
如果您将进驻我们的社区,我将非常感谢.
联系方式:hongli@eefocus.com
MSN:haly1@live.cn
小波
2009/10/12 20:57
网站太好了,学习中。
123
2009/09/26 11:04
Rickysu :
你好,我在做spartan-3e板子上的A/D,遇到几个问题想不明白:
1、放大器跟FPGA之间的spi_mosi应该是控制增益,在仿真时需要有循环的8位命令信号吗?
2、片选信号的下降沿跟spi_sck的上升沿都有一定的延时,感觉很难控制,这个延时是必须存在的吗?能不能同时有效?
3、ad跟FPGA之间的spi_miso应该是采样后的数字信号,对FPGA而言是输入信号,可实际上是我以后需要处理的数字信号,对AD来说是输出,我根本不知道它的信号是怎么样的,仿真的时候怎么给激励呢?如果把spi_miso当最终的输出,那编程时我有不知道这么给它赋值。
请博主指导下,非常感谢
JIN Email
2009/09/20 15:00
Rickysu :
你好,我在做XUPV2上做slide_show_256mb的例程http://www.xilinx.com/univ/xupv2p_demo_ref_designs.htm
的时候出现了一些问题,已经调试了很久,还没找到问题的所在,希望你能帮我解答。
我用的是EDK9.1i.
所以,看了你的博文,我用了plb_tft_cntlr_ref_v1_00_c.
现在出现的情况是:如果把PARAMETER C_ON_INIT = 0b1,就是让显示器一开始就显示的话,就能显示第一幅图像,但是改成PARAMETER C_ON_INIT = 0b0话,就是什么都没有。我想是写dcr的寄存器没有写对,这样造成,没法开启显示器,没法转变显存的地址,所以没法变换图片。但是我又觉得我的DCR的地址没算错,所以找不到原因,希望你能帮我看看。

BEGIN plb2opb_bridge
PARAMETER INSTANCE = plb2opb
PARAMETER HW_VER = 1.01.a
# DCR的地址范围在C_RNG1_BASEADDR
PARAMETER C_DCR_INTFCE = 1
# 该核有两个地址范围RNG0 RNG1
PARAMETER C_NUM_ADDR_RNG = 2
PARAMETER C_RNG0_BASEADDR = 0x40000000
PARAMETER C_RNG0_HIGHADDR = 0x7fffffff
PARAMETER C_RNG1_BASEADDR = 0xD0000000
PARAMETER C_RNG1_HIGHADDR = 0xD0000FFF
BUS_INTERFACE SPLB = plb
BUS_INTERFACE MOPB = opb
END

BEGIN plb_tft_cntlr_ref
PARAMETER INSTANCE = VGA_FrameBuffer
PARAMETER HW_VER = 1.00.c
PARAMETER C_DEFAULT_TFT_BASE_ADDR = 0b00000000000
PARAMETER C_PIXCLK_IS_BUSCLK_DIVBY4 = 0b1
PARAMETER C_DCR_BASEADDR = 0b0000010000
PARAMETER C_DCR_HIGHADDR = 0b0000010001
PARAMETER C_ON_INIT = 0b1
BUS_INTERFACE MPLB = plb
BUS_INTERFACE SDCR = dcr_v29_0
PORT TFT_LCD_CLK = fpga_0_VGA_FrameBuffer_TFT_LCD_CLK
PORT TFT_LCD_HSYNC = fpga_0_VGA_FrameBuffer_TFT_LCD_HSYNC
PORT TFT_LCD_VSYNC = fpga_0_VGA_FrameBuffer_TFT_LCD_VSYNC
PORT TFT_LCD_B = fpga_0_VGA_FrameBuffer_TFT_LCD_B
PORT TFT_LCD_G = fpga_0_VGA_FrameBuffer_TFT_LCD_G
PORT TFT_LCD_R = fpga_0_VGA_FrameBuffer_TFT_LCD_R
PORT TFT_LCD_BLNK = fpga_0_VGA_FrameBuffer_TFT_LCD_BLNK
END

BEGIN opb2dcr_bridge
PARAMETER INSTANCE = opb2dcr_bridge_0
PARAMETER HW_VER = 1.00.b
PARAMETER C_BASEADDR = 0xD0000000
PARAMETER C_HIGHADDR = 0xD00003FF
BUS_INTERFACE SOPB = opb
BUS_INTERFACE MDCR = dcr_v29_0
END

在xparameters.h中,
/* Definitions for driver TFT_REF */
#define XPAR_XTFT_NUM_INSTANCES 1

/* Definitions for peripheral VGA_FRAMEBUFFER */
#define XPAR_VGA_FRAMEBUFFER_DCR_BASEADDR 0xD0000040
#define XPAR_VGA_FRAMEBUFFER_DCR_HIGHADDR 0xD0000047
#define XPAR_VGA_FRAMEBUFFER_DEVICE_ID 0

好像不能贴太多东西,所以没有放上C 代码。c代码和其他地址和原例程一样,
Mike Email
2009/09/08 21:38
Rickysu:

你好,我是一名在校研究生,从事基于Xilinx的FPGA的电子系统设计。经常浏览你的博客,也提问过你。最近用MIG2.3生成了一个ddr2 component的控制核,MIG2.3同时生成了一个ddr2_tb_top模块作为用户端读写的参考设计,关于其中的文件有些问题,希望您能指教。可能你没有具体看过这些代码,没关系,我尽量使我的问题不过多地涉及具体功能。

1
文件中有些输入信号经过寄存,但不是一般地通过always语句实现,而是通过实例化FDRSE,而且注释标注“Instantiate flops for timing”。我想问下为什么要这么写,这么写怎么就对timing有好处?因为我看了综合后结果,那些用always语句做寄存的,综合的结果就是FD, 但我不知道FDRSE和FD应该在时序方面的性能有什么差异。况且这里没有在UCF文件中对这些寄存器有什么约束,所以我想知道为什么要通过实例化的方式来做寄存。

////////////////////////源代码
// Instantiate flops for timing.
FDRSE ff_af_afull_r
(
.Q (app_af_afull_r),
.C (clk0),
.CE (1'b1),
.D (app_af_afull),
.R (1'b0),
.S (1'b0)
);

FDRSE ff_af_afull_r1
(
.Q (app_af_afull_r1),
.C (clk0),
.CE (1'b1),
.D (app_af_afull_r),
.R (1'b0),
.S (1'b0)
);


2
在MIG生成的参考代码中,所有模块的输出代码都是经过寄存的,但我不知道为什么有时对一些模块的输出经过了多级寄存再输出。比如这里wr_data_fall, wr_data_rise分别是已经经过寄存的16位数据了,通过"assign wr_data = {wr_data_fall, wr_data_rise};"拼接成32位的wr_data后,那我觉得尽管通过assign把它们拼接成32位的wr_data,但也不代表其中有什么组合逻辑,仅有连线的延时我觉得wr_data已经可以作为输出了。但源代码又将wr_data后通过下述语句对其做了两级寄存再输出:
always @(posedge clk) begin
app_wdf_data_r <= wr_data;
app_wdf_data <= app_wdf_data_r;
end
另外这里该信号作为数据通路没有等其他信号的必要。我想问下你觉得这里可能是出于什么样的考虑要多寄存几拍。为了时序吗?这里两个寄存器之间已经没有组合电路了,难道出于走线的延时吗?好像没这个必要吧。

可能我提出的问题过于琐碎了,但如果您能对上述问题提供参考意见或思路的话,我会非常感谢的。

Thanks in advance
Mike
RickySu 回复于 2009/09/17 17:07
Hi Mike,

FDRSE和FD都是寄存器,只是FDRSE是有reset和enable的,FD没有。标注for timing可能是因为1. 这个寄存器是用作Pipeline的 2. 这个寄存器是一个duplicated register。

问题二中,为什么要再寄存两次,那么我们就要首先查看这些寄存的中间信号有没有被别的逻辑使用过。没有的话,那么是不是会因为相关功能的其他路径上的信号因为有3级流水线,这里的功能没有那么复杂,不需要那么多级流水线,但是必须和其他信号匹配,所以才加入的寄存呢?

- Ricky
fkgong
2009/06/01 23:53
程序如下:
ENTITY HSSat_modu_all_pll IS
   PORT (
i_clk119p808m: IN STD_LOGIC;          
i_rst: IN STD_LOGIC;          
o_sou2_adj_data:  OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
o_sou2_adj_ena:  OUT STD_LOGIC
);    
END HSSat_modu_all_pll;

ARCHITECTURE test OF HSSat_modu_all_pll IS
COMPONENT HSSat_PLL_175p104m
PORT(
...
);
END COMPONENT;
        
COMPONENT HSSat_modu_fifo2
        port (
               ...);
END COMPONENT;

SIGNAL ...

BEGIN
gen_175p104m: HSSat_PLL_175p104m PORT MAP(
                CLKIN_IN => i_clk119p808m,
                RST_IN => '0',
                CLKDV_OUT => clk14p976m,
                CLKFX_OUT => clk175p104m,
                CLKIN_IBUFG_OUT => i_clk119p808m_ibug_out,
                CLK0_OUT => clk119p808m,
                LOCKED_OUT => pll1Lock
        );

rst_d <= i_rst OR (NOT pll1Lock);
        
PROCESS
   BEGIN
      WAIT UNTIL (clk14p976m'EVENT AND clk14p976m = '1') ;
      IF (rst_d = '1') THEN
         tmp_reg <=  "00000000001" ;        
         i_sou2(0) <= '0';    
         i_sou2_ena <= '0';
      ELSE
tmp_reg(10) <= tmp_reg(9) XOR tmp_reg(0);    
tmp_reg(9 DOWNTO 0) <= tmp_reg(10 DOWNTO 1);    
i_sou2(0) <= tmp_reg(0);                  
i_sou2_ena<='1';                            
END IF;
   END PROCESS;
        
         fifo2_rd_ena <= NOT fifo2_empty;
        
         fifo2: HSSat_modu_fifo2 PORT MAP(
                din => i_sou2,
                rd_clk => clk175p104m,
                rd_en => fifo2_rd_ena,
                rst => rst_d,
                wr_clk => clk14p976m,
                wr_en => i_sou2_ena,
                dout => o_sou2_adj_data,
                empty => fifo2_empty,
                full => fifo2_full,
                valid => o_sou2_adj_ena);        
END test;
fkgong
2009/06/01 23:48
写的一个FIFO程序,14.976MHz的时钟产生,经过FIFO后转换为175.104MHz的输出,其中,两个时钟都通过一个DCM产生,该DCM的输入为119.808MHz,即175.104MHz = 119.808MHz*19/13, 14.976MHz = 119.808MHz/8;
如果不加约束,没有问题。
当对该模块增加约束:
NET "i_clk119p808m" TNM_NET = i_clk119p808m;
TIMESPEC TS_i_clk119p808m = PERIOD "i_clk119p808m" 119.808 MHz HIGH 50%;
后,出现时序问题:
Timing constraint: TS_gen_175p104m_CLKDV_BUF_1 = PERIOD TIMEGRP
"gen_175p104m_CLKDV_BUF_1"         TS_i_clk119p808m / 8 HIGH 50%;

397 paths analyzed, 204 endpoints analyzed, 10 failing endpoints
10 timing errors detected. (10 setup errors, 0 hold errors)
Minimum period is 198.189ns.
...
Timing constraint: TS_gen_175p104m_CLKFX_BUF_1 = PERIOD TIMEGRP
"gen_175p104m_CLKFX_BUF_1"         TS_i_clk119p808m * 1.46153846 HIGH 50%;

282 paths analyzed, 155 endpoints analyzed, 10 failing endpoints
10 timing errors detected. (10 setup errors, 0 hold errors)
Minimum period is  16.817ns.
Slack:                  -0.854ns (requirement - (data path - clock path skew + uncertainty))
  Source:               fifo2/BU2/U0/gen_as.fgas/normgen.flblk/clkmod/cx.wrx/pntr_gc_2 (FF)
  Destination:          fifo2/BU2/U0/gen_as.fgas/normgen.flblk/clkmod/cx.wrx/pntr_gc_x_2 (FF)
  Requirement:          0.439ns
  Data Path Delay:      0.973ns (Levels of Logic = 0)
  Clock Path Skew:      0.000ns
  Source Clock:         clk14p976m rising at 667.735ns
  Destination Clock:    clk175p104m rising at 668.174ns
  Clock Uncertainty:    0.320ns

请问怎么消除呢?该错误对数据有影响吗?
Tarzandavid
2009/05/31 11:45
你好RickySu,

你的博客真是让我受益良多,特别感谢一下。

我在用EDK10.1.03,板卡是Spartan3 mini module,
现在在program to flash后下载bootloader的时候遇到了错误:
-------------------------------
EDK Bootloader
ERROR: SREC line is corrupted
-------------------------------
已经卡在这儿好几天了,我记得以前用spartan3a starter kit的时候也遇到过这个错误,那时候是在linker script里面设置有错误,导致bootloader跟我的sw app占用的内存overlap。

但是这次我检查了我的sw app的linker script,里面都设成了sram的MEM。后来我换了个方法-- 使用默认的LD,把program start address设为我要用的SRAM的起始地址,可是还是不对,同样的错误。

我试过用XMD,找到bootloader的ELF文件下载,错误照旧。我该怎么解决这个错误呢?望您多指教。

Tarzan
RickySu 回复于 2009/05/31 20:34
其实SREC line corrupted的错误是说你的image有问题,而不是bootloader有问题。一些可以检查的地方:尝试重新烧写Flash;尝试换个地址烧写Flash;检查Bootloader中定义的Flash开始拷贝的起始地址;打开bootloader的宏定义DEBUG;还不行的话给我email吧。
lanmozc
2009/05/12 22:51
恭喜Ricky的域名回归~~嘿嘿grin
hi
2009/04/24 19:55
您好,我一直都在关注您的文章,写的都很精彩,很实用。

小弟现在遇到一个关于时钟的问题,设计好的module有两个时钟输入clk_100M, clk_70M。分别设的105M 和73M约束,implement时没有任何时序错误。

现在我在一个顶层module中调用这个设计好的module,该顶层module使用DCM和PLL_DCM产生clk_100M, clk_70M。implement的时候报告很多时序错误,时序报告说只能工作在16M Hz。

可以给我些建议吗? 多谢
RickySu 回复于 2009/04/25 11:28
初步的建议是仔细查看时序报告,发现关键路径在哪里。通常来说同一个设计的时序差异不会那么大,所以我估计可能是第一次分别实现时时序约束没有覆盖到所有路径,或者第二次实现时时序约束有误。可以发email讨论。
wangchuanyiguo
2009/04/22 22:08
博主,你好,我想问下,ise10.1中在综合的
Design Goals and Strategy里,我选择Blanced,设置keep Hierarchy 为YES,但是看综合后的report时发现,仍然标明的是NO,似乎改不了。

---- General Options
Optimization Goal             : Speed
Optimization Effort           : 1
Library Search Order          : top.lso
Keep Hierarchy                : NO
Netlist Hierarchy             : as_optimized
。。。。

不知道应该怎么回事?
RickySu 回复于 2009/05/31 20:36
不好意思把这条留言给忘了,稍后我来实验一下。
游客
2009/04/21 17:46
看到《FPGA开发全攻略》有blog里完全一样的话,你是田耘?
RickySu 回复于 2009/04/21 22:26
呵呵,多谢关注《FPGA开发全攻略》。不过我不是田耘:)里面有一些文章有rickysu的署名,FPGA百问的章节中也有摘录了一些本Blog的内容。
yuster
2009/04/06 18:55
博主,我想问下,我做仿真时经常要把我自己本身要仿真的模块和glbl模块一起跑仿真,想问下有什么办法不用那么麻烦吗,谢谢
RickySu 回复于 2009/05/31 20:37
Verilog的话总要用glbl的。用ISE来启动ModelSim的话,我记得自己会添加glbl.v的。
MIKE
2009/04/06 13:17
博主,你好,前两天问你关于TIG的事情,现在想想可能是这样的,TIG本身不应该再在Timing Analyzer中被分析,但是这里用了TIMESPEC来做约束,因为这个,所以Timing Analyzer的报告中显示了结果。不知道你觉得对吗?有的时候,真的觉得FPGA及其软件有很多这样很细微的点,自己想有时候真的很难想出来的。
分页: 1/6 第一页 1 2 3 4 5 6 下页 最后页