搜索
bottom↓
回复: 18

学习VERILOG一个大家都会碰到的疑问,谁帮我解决一下

[复制链接]

出0入0汤圆

发表于 2014-2-5 22:38:54 | 显示全部楼层 |阅读模式
在学习fpga过程中,大家都会碰到边缘检测问题,我看到很多边缘检测都搞得很复杂,需要用2个reg来保存前一次和当前次的数据,

verilog不是有个语句是

always@(posetage clk)吗    这里的clk是fpga的clk,如果我需要检测一个按键的上升沿,比如key_ris,那我不是直接用 always@(posetage key_ris)这样就行了吗,干嘛搞得那么麻烦,

另外有个问题,如果我想检测一个频率为100M时钟的上升沿,如果fpga运行频率也为100m,是不是就没法实现了............

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-2-5 22:54:00 | 显示全部楼层
楼主的问题,查找有关逻辑电路同步设计的内容即可知道答案。

出0入4汤圆

发表于 2014-2-5 22:56:17 | 显示全部楼层
你这个是把HDL当程序设计语言来用啊

出0入0汤圆

发表于 2014-2-5 23:45:41 | 显示全部楼层
请用同步设计,LZ这种用 信号做时钟的 不是同步设计,你100M 需要采沿 确实要高速时钟

出0入0汤圆

发表于 2014-2-5 23:49:03 | 显示全部楼层
如果不同步,输出结果会有毛刺或者误差

出0入0汤圆

 楼主| 发表于 2014-2-6 10:49:03 | 显示全部楼层
咖啡可乐 发表于 2014-2-5 23:49
如果不同步,输出结果会有毛刺或者误差

同步设计我知道,但是有个疑问,如果用100M的FPGA时钟,外部MCU为 STM32F系列的72M时钟,如果用FSMC交换数据,FPGA如何同步捕捉  WR或者RD信号的边沿变化,我看有些使用这样的代码
并没有用同步设计,这又怎么解释........我都迷糊了.........如果都要同步的话,72M的时钟用100M去同步,基本上没法同步啊,总不能另外用pll产生一个高频时钟吧,要是CPLD那又怎么办呢,没PLL

module fsmc(
input[2:0] ab,
inout[15:0] data,

input clk_f,
input wrn,
input rdn,
input resetn,
input fpga_cs0,

output sing
);

reg [15:0] mem_d[7:0];      //定义数据空间 大小自己可以设定
reg [15:0] addr;                 //数据空间的地址
reg [15:0] indata;
reg [24:0] cnt;

reg rd;
reg wr;

always @(*)
begin
rd <= ~fpga_cs0 && ~rdn;
wr <= ~fpga_cs0 && ~wrn;
end

//---------------------------------------------------
always @(posedge clk_f)
cnt <= cnt + 1'b1;
assign sing = wr|rd;//|cnt[24];

initial begin
  mem_d[0] = 16'd120;
  mem_d[1] = 16'd121;
  mem_d[2] = 16'd122;
  mem_d[3] = 16'd123;
  mem_d[4] = 16'd124;
  mem_d[5] = 16'd125;
  mem_d[6] = 16'd126;
  mem_d[7] = 16'd127;
end

//---------------------------------------------------
//write data,
always @(posedge wr)// or negedge resetn)
begin
  if(wr)//(!resetn)
  begin
    case (ab)
      3'b000:addr <= data;            //地址暂存
      3'b001:mem_d[addr[3:0]] <= data;   //往预设地址的空间中写入数据
    default: ;
    endcase
  end
end

//red data
always @(posedge rd)//(rd)// or negedge resetn
begin
  if(rd)//(!resetn) indata <= 16'h0000;
  begin
    case (ab)
      3'b000:;
      3'b001: indata <= mem_d[addr[3:0]];    //读取数据
    default:;
    endcase
  end
end
assign data = rd ? indata:16'hzzzz;

endmodule

出0入0汤圆

发表于 2014-2-6 11:01:17 | 显示全部楼层
WR或者RD 这两个信号应该是长周期的信号,100m是完全可以采到的

出0入0汤圆

 楼主| 发表于 2014-2-6 11:16:26 | 显示全部楼层
Fourier00 发表于 2014-2-6 11:01
WR或者RD 这两个信号应该是长周期的信号,100m是完全可以采到的

为什么不直接用

always@(postage  rdn)

而要中间用一个

rd <= rdn;

再用 always@(postage  rd )

在一个问题,这里的wr不是长周期的信号,是fsmc的信号

出0入0汤圆

发表于 2014-2-6 11:16:38 | 显示全部楼层
边沿使用reg和reg_dly主要是为了避免毛刺吧。提高稳定性;

出0入0汤圆

 楼主| 发表于 2014-2-6 11:17:10 | 显示全部楼层
Fourier00 发表于 2014-2-6 11:01
WR或者RD 这两个信号应该是长周期的信号,100m是完全可以采到的

不是说直接这样用会产生毛刺什么的么,必须要用同步么,这里怎么又可以?

出0入0汤圆

发表于 2014-2-6 11:44:12 | 显示全部楼层
oceanheart 发表于 2014-2-6 11:16
为什么不直接用

always@(postage  rdn)


这里是有毛刺的,用真正的时钟才没有毛刺,我不是很懂 fsmc,我刚刚上网搜索了一下fsmc的 读写周期是可以调的,如果感觉时序比较吃紧,而又不需要这么快的速度,可以把rdn周期调长

出0入0汤圆

发表于 2014-2-6 11:45:39 | 显示全部楼层
oceanheart 发表于 2014-2-6 11:17
不是说直接这样用会产生毛刺什么的么,必须要用同步么,这里怎么又可以?

这里 可能某个时刻是好的,某个时刻不行,稳定性很差

出0入0汤圆

 楼主| 发表于 2014-2-6 11:56:47 | 显示全部楼层
Fourier00 发表于 2014-2-6 11:44
这里是有毛刺的,用真正的时钟才没有毛刺,我不是很懂 fsmc,我刚刚上网搜索了一下fsmc的 读写周期是可以 ...

有这些疑问都起源于SDRAM的操作,由于用状态机,用100m clk同步,时序比较吃紧,然后外部mcu往fpga发数据,比如 T0时刻发送数据到FPGA,那么用同步的话,要在T1时刻采样到,然后T2时刻开始操作SDRAM,这样就浪费了很多不必要的周期

所以在想是不是有一种方法,可以在T0发送给FPGA的时候,用组合逻辑捕捉到这个数据,然后立刻操作SDRAM,这样至少可以省一个周期,所以一直在想一种办法是不是可以用组合逻辑捕捉到这种随机的信号,然后进行操作,


就好比做一个逻辑分析仪,如果要采样100M的逻辑,难道必须用200M甚至300M的FPGA时钟去操作么?难道就不能用100M的FPGA 时钟,用组合逻辑去采集么

出0入0汤圆

发表于 2014-2-6 12:19:15 | 显示全部楼层
oceanheart 发表于 2014-2-6 11:56
有这些疑问都起源于SDRAM的操作,由于用状态机,用100m clk同步,时序比较吃紧,然后外部mcu往fpga发数据,比 ...

时序这么吃紧,是带宽要求很高吗?还是和sdram操作需要很强的时序关系,如果是和sdram需要很强的耦合的话,可以用fifo存一下,如果是带宽要求高,可能需要提频
我不知道你的具体问题,所以也没法深入分析,至于逻辑分析仪,一般采用的技术是空间过采样,在空间多个相位的时钟,其实和时钟提频视 一样的效果

出0入0汤圆

 楼主| 发表于 2014-2-6 12:34:19 | 显示全部楼层
Fourier00 发表于 2014-2-6 12:19
时序这么吃紧,是带宽要求很高吗?还是和sdram操作需要很强的时序关系,如果是和sdram需要很强的耦合的话 ...

主要是这样的分析:

100M时钟FPGA驱动 800*480*16bit  TFT,tft时钟为25M, 刷新率为60hZ 这样TFT需要的带宽为800*480*2*60/1024/1024=44MB/s

100M SDRAM的读时序带宽按照最高来算,page模式大概为  200MB/s   除去读取的44MB/s带宽,剩下给写入SDRAM的带宽为 156MB/s,

主要是需要随机写入功能,这样,如果每个字节都用随机写入,这样的话一个字节需要 RCD+CL+RP+1=2+2+2+1=7个周期,   这样的话带宽就剩下 156/7=22MB/s,所以刷新速度剩下 30hZ这样的话勉强可以播放动画,当然实际上SDRAM带宽没有那么高,但是24hZ还是可以达到的,

现在的问题是实际上如果算上外部MCU发送给FPGA这里有1-2个同步采用锁存的周期浪费,一个字节写入折算下来怎么样也要10T了,所以就达不到播放动画的效果了,所以在一直想办法缩减这个同步采样所浪费的周期

另外如果随机写入的话,按10T来算的话,其实带宽为20MB/s,外部MCU如果速度比较快,比如有DMA FSMC这样的总线结构的话,势必传送速度>20MB/s,这样的话,如果一次性传送那么多800*480*2B数据的话,FPGA就来不及把数据写入SDRAm了,虽然说可以用fifo,但是势必这个FIFO也会满溢出的,没法保证外部MCU数据不丢失,


说了那么多,不知道你有没有理解我说的意思,,,,,我只是想实现一个比较性能高点的SDRAM的TFT控制器,至少可以播放动画达到24zhen的更新率,

出0入0汤圆

 楼主| 发表于 2014-2-6 12:37:07 | 显示全部楼层
Fourier00 发表于 2014-2-6 12:19
时序这么吃紧,是带宽要求很高吗?还是和sdram操作需要很强的时序关系,如果是和sdram需要很强的耦合的话 ...

我看很多用CPLD+SDRAM驱动TFT的,其实如果不要求播放动画的话,写入一个字节如果150ns-200ns的话,根本不需要任何fifo都可以做到,
我看很多人一看到CPLD+SDRAM驱动TFT就认为很难想象,因为CPLD没有FIFO,其实我觉得很简单可以实现,只是更新率不会很高 800*480的屏,估计能做到10hZ的画面刷新率,当然屏的刷新率还是60Hz,这里是2个概念

出0入0汤圆

发表于 2014-2-6 16:20:08 | 显示全部楼层
oceanheart 发表于 2014-2-6 12:34
主要是这样的分析:

100M时钟FPGA驱动 800*480*16bit  TFT,tft时钟为25M, 刷新率为60hZ 这样TFT需要的带 ...

我觉得这里是流水操作,吃掉几拍是没有关系的

出0入0汤圆

发表于 2014-2-7 00:44:00 | 显示全部楼层
时钟满天飞是不好的

出0入0汤圆

发表于 2014-2-25 22:13:37 | 显示全部楼层
这个采样还是要满足奈奎斯特采样定律的。 always@(posetage clk)这里面的clk即为采样时钟。其他的内部信号可以被看成是被采样信号。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 01:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表