在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3325|回复: 6

时序问题

[复制链接]
发表于 2008-5-20 10:01:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
fpga功能:将输入的两组数据存储在内部的寄存器组A,B中,之后将A,B异或后赋值给C寄存器组
(A,B,C均为8bits*16的寄存器组),然后将C中的数据读出。在上述处理过程中,测试几个,几十个数据
没有问题,但是,当测试几十K或几百K的数据时就会有部分8bits*16的数据错误,可能一组或几组。
    我的时序控制是由计数器计数产生的,计数时钟是主时钟2分频后的时钟分频部分用状态机产生.
计数部分:
([email=always@(posedge]always@(posedge[/email] clk2)//clk2为2分频后的时钟,此部分可能不是很好,只是为了说明问题;
begin
if(counter<=8'd100)
begin
counter<=counter+1;
end
else
begin
counter<=8'h00;
end
end
执行部分:
[email=always@(posedge]always@(posedge[/email] clk)//系统的输入时钟;
begin
if(counter==8'd2)
  C<=A^B;
end
///////
[email=always@(posedge]always@(posedge[/email] clk)//其它运算部分的操作,上面的叙述只是一个简要举例说明,实际还有其它操作;
begin
if(counter==8'd4)
  ...;
end  
...   
整个文件中绝大部分数据处理正确,但有部分不正确,请问高手是不是我的时序控制上有问题,该怎么办?
请指点!谢谢!
发表于 2008-5-20 10:39:28 | 显示全部楼层
能看一下你的2分频是怎么做的么?可能问题会在那里找到。
发表于 2008-5-20 13:00:40 | 显示全部楼层
找到错误的地方debug 一下呢
 楼主| 发表于 2008-5-21 17:12:03 | 显示全部楼层
//*****产生系统所需的时钟信号,用状态机的方式产生了2、4分频时钟;*****//
module clk_gen(
clk,
reset,
clkn,
clk2,
clk4
);
input clk,reset;
output clkn,clk2,clk4;
wire clk,reset;

reg clk2,clk4;
reg[3:0] state;

parameter S1=4'b0001,
    S2=4'b0010,
    S3=4'b0100,
    S4=4'b1000,
    idle=4'b0000;   
     
assign clkn=clk;

[email=always@(posedge]always@(posedge[/email] clk or negedge reset)
begin
  if(!reset)
   begin
   clk2<=0;
   clk4<=0;
   state<=idle;
   end
  else
   begin
   case(state)
   S1:
    begin
    clk2<=~clk2;
    state<=S2;
    end
   S2:
    begin
    clk2<=~clk2;
    clk4<=~clk4;
    state<=S3;
    end
   S3:
    begin
    clk2<=~clk2;
    state<=S4;
    end
   S4:
    begin
    clk2<=~clk2;
    clk4<=~clk4;
    state<=S1;
    end
   idle:
    begin
    state<=S1;
    end
   default:state<=idle;
   endcase
   end
end
endmodule
 楼主| 发表于 2008-5-21 17:14:24 | 显示全部楼层
分频代码,请多多指教!
发表于 2008-5-21 23:52:31 | 显示全部楼层
既然用了状态机,为什么要用2分频呢,直接用这个状态机产生的一根控制信号来控制这个模块的使能不就可以了。可能2分频存在时钟漂移呢,
发表于 2008-5-29 21:32:46 | 显示全部楼层

给你一个答案

用二分频后后的信号作为clk的enable。
所有的clk都用系统时钟,这是最基本的。
always @(posedge clk or posedge rst)
begin
  if (rst)
div2<=0;
else
  div2<=~div2;
end

always @(posege clk or posedge rst)
begin
if (rst)
counter<=8'b00;
else if(div2)
begin
  if (counter<8'h100)
  counter<=counter+1;
else
counter<=0;
end
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 20:50 , Processed in 0.060008 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表