zouyf12 发表于 2012-10-18 15:32:06

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

本帖最后由 zouyf12 于 2012-10-18 16:28 编辑

代码如下,要实现的功能是, CLK持续的输入时钟信号, 当CS为低电平时,9个位的寄存器DataBuff把之前存的数据从高到低依次从最高位 DataBuff 输出,最低位补0,当CS为高时,DataBuff赋一个值,(程序中为217, 既 11011001)
现在的问题是,用一个单片机根据时序读出FPGA里面的值时, 却是 217 (11011001) 和178 (10110010)交替出现,可用MODELSIM仿真是没有问题的,
经过一系列的实验发现,当移位输出‘1’时,比如来4个CLK上升沿后, DataBuff= ‘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 DataBuff;

parameterVerion = 9'd217;

assign DO = DataBuff;

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

endmodule


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

korgo 发表于 2012-10-18 15:36:39

估计又是阻塞和非阻塞没分清

zouyf12 发表于 2012-10-18 15:55:45

korgo 发表于 2012-10-18 15:36 static/image/common/back.gif
估计又是阻塞和非阻塞没分清

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

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

chenguanglu 发表于 2012-10-18 16:02:36

注意自己单片机的时序对不对, 结合综合后的电路图分析

korgo 发表于 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’

chenguanglu 发表于 2012-10-18 16:06:42

最简单的方法 CS=1正常加 clk 说出应该一直是0

zouyf12 发表于 2012-10-18 16:08:00

chenguanglu 发表于 2012-10-18 16:02 static/image/common/back.gif
注意自己单片机的时序对不对, 结合综合后的电路图分析

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

zouyf12 发表于 2012-10-18 16:10:35

chenguanglu 发表于 2012-10-18 16:06 static/image/common/back.gif
最简单的方法 CS=1正常加 clk 说出应该一直是0

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

zouyf12 发表于 2012-10-18 16:12:36

korgo 发表于 2012-10-18 16:03 static/image/common/back.gif
例:a=‘1’,b=‘0’,c=‘1’
b=a;
c=b;


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

korgo 发表于 2012-10-18 16:13:04

zouyf12 发表于 2012-10-18 16:08 static/image/common/back.gif
这个已经验证过,没有问题, 无论是用直接输出时序,读取数值,还是直接通过命令控制引脚高低来模拟时序 ...

还是上modelsim的波形图吧

chenguanglu 发表于 2012-10-18 16:14:40

看看再低一级的电路 是什么样的 触发器 组合逻辑都对吗

chenguanglu 发表于 2012-10-18 16:19:45

你这综合出来的只有8个触发器啊 被优化掉了一个?

zouyf12 发表于 2012-10-18 16:30:26

chenguanglu 发表于 2012-10-18 16:19 static/image/common/back.gif
你这综合出来的只有8个触发器啊 被优化掉了一个?

那个我搞错, 我刚才实验赋值222时生成的RTL,因为222最后一位为0 ,且移入的数值也为0,所以被优化掉一个,现在更新在LZ位了,并附加上仿真
页: [1]
查看完整版本: 初学FPGA,被一个移位输出寄存器难倒,求高手指点一二