搜索
bottom↓
回复: 12

初学FPGA,被一个移位输出寄存器难倒,求高手指点一二

[复制链接]

出0入0汤圆

发表于 2012-10-18 15:32:06 | 显示全部楼层 |阅读模式
本帖最后由 zouyf12 于 2012-10-18 16:28 编辑

代码如下,  要实现的功能是, CLK持续的输入时钟信号, 当CS为低电平时,9个位的寄存器DataBuff把之前存的数据从高到低依次从最高位 DataBuff[8] 输出,最低位补0,  当CS为高时,DataBuff赋一个值,(程序中为217, 既 11011001)
现在的问题是,用一个单片机根据时序读出FPGA里面的值时, 却是 217 (11011001) 和178 (10110010)交替出现,可用MODELSIM仿真是没有问题的,
经过一系列的实验发现,当移位输出‘1’时,比如来4个CLK上升沿后, DataBuff[8]  = ‘1’ , 这个时候,在CLK不变化的情况下,拉高CS, 再由CLK来一个上升沿,让DataBuff赋初值217时,问题就来了, 这时DataBuff并没有等于217(及9‘b011011001) 而是等于434(及9’b 110110010), 往前挪了一位,所以就导致下一次读出时,最高位的1被直接移出丢弃。  而当移位输出为‘0’时, 就没有这种情况,   真是很奇怪呀,   求高手指点个方向。


module TOP(
            CS,
            CLK,
            DO,
            );

input CS, CLK;
output DO;

reg [8:0]DataBuff;

parameter  Verion = 9'd217;

assign DO = DataBuff[8];

always@(posedge CLK)
begin
    if(CS == 1'b1)
        DataBuff <= Verion;
    else
    begin
        DataBuff <= {DataBuff[7:0], 1'b0};
    end
end

endmodule


修改加上波形 RTL图,也没有看出什么问题。  波形图注意红色框位置,当CS为1, DO为1时, 只要CLK一个上升沿,DO就会变0, 而实际运行却不是这样,DO仍然为1

本帖子中包含更多资源

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

x

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

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

出0入0汤圆

发表于 2012-10-18 15:36:39 | 显示全部楼层
估计又是阻塞和非阻塞没分清

出0入0汤圆

 楼主| 发表于 2012-10-18 15:55:45 | 显示全部楼层
korgo 发表于 2012-10-18 15:36
估计又是阻塞和非阻塞没分清

但是仿真来说是没有错的,怪就怪在这里,  也不是很复杂的电路。

总不能执行alway时,同时把赋值和移位一起执行了吧?

出0入0汤圆

发表于 2012-10-18 16:02:36 | 显示全部楼层
注意自己单片机的时序对不对, 结合综合后的电路图分析

出0入0汤圆

发表于 2012-10-18 16:03:30 | 显示全部楼层
例:a=‘1’,b=‘0’,c=‘1’
b=a;
c=b;
这时a=‘1’,b=‘1’,c=‘1’

b<=a;
c<=b;
这时a=‘1’,b=‘1’,c=‘0’

出0入0汤圆

发表于 2012-10-18 16:06:42 | 显示全部楼层
最简单的方法 CS=1  正常加 clk 说出应该一直是0

出0入0汤圆

 楼主| 发表于 2012-10-18 16:08:00 | 显示全部楼层
chenguanglu 发表于 2012-10-18 16:02
注意自己单片机的时序对不对, 结合综合后的电路图分析

这个已经验证过,没有问题, 无论是用直接输出时序,读取数值,还是直接通过命令控制引脚高低来模拟时序,得到得结果都是一样的,  而且在单片机程序不改的情况下,  把FPGA的赋值改为222(11011110) 让最后输出是0的话,就可以正常输出,每次都是222.

出0入0汤圆

 楼主| 发表于 2012-10-18 16:10:35 | 显示全部楼层
chenguanglu 发表于 2012-10-18 16:06
最简单的方法 CS=1  正常加 clk 说出应该一直是0

对,我就是这样试验, CS 为1时, 如果原来DO是1的话,无论来多少个CLK,读出的仍然是1 ,但是赋值后,最高位应该是0才对的。  如果DO为0时, 拉高CS, 那么来多少个CLK也是0 且下次拉低CS时, 可以输出正确数值

出0入0汤圆

 楼主| 发表于 2012-10-18 16:12:36 | 显示全部楼层
korgo 发表于 2012-10-18 16:03
例:a=‘1’,b=‘0’,c=‘1’
b=a;
c=b;


这个我知道的,也想过这方面, 但是alway里面判断里分别只有一条语句,无论并行还是串行都是一样的呀?  个人看法

出0入0汤圆

发表于 2012-10-18 16:13:04 | 显示全部楼层
zouyf12 发表于 2012-10-18 16:08
这个已经验证过,没有问题, 无论是用直接输出时序,读取数值,还是直接通过命令控制引脚高低来模拟时序 ...

还是上modelsim的波形图吧

出0入0汤圆

发表于 2012-10-18 16:14:40 | 显示全部楼层
看看再低一级的电路 是什么样的 触发器 组合逻辑都对吗

出0入0汤圆

发表于 2012-10-18 16:19:45 | 显示全部楼层
你这综合出来的只有8个触发器啊 被优化掉了一个?

出0入0汤圆

 楼主| 发表于 2012-10-18 16:30:26 | 显示全部楼层
chenguanglu 发表于 2012-10-18 16:19
你这综合出来的只有8个触发器啊 被优化掉了一个?

那个我搞错, 我刚才实验赋值222时生成的RTL,因为222最后一位为0 ,且移入的数值也为0,所以被优化掉一个  ,现在更新在LZ位了,并附加上仿真
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-27 11:17

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

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