初学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 static/image/common/back.gif
估计又是阻塞和非阻塞没分清
但是仿真来说是没有错的,怪就怪在这里,也不是很复杂的电路。
总不能执行alway时,同时把赋值和移位一起执行了吧? 注意自己单片机的时序对不对, 结合综合后的电路图分析 例: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’ 最简单的方法 CS=1正常加 clk 说出应该一直是0 chenguanglu 发表于 2012-10-18 16:02 static/image/common/back.gif
注意自己单片机的时序对不对, 结合综合后的电路图分析
这个已经验证过,没有问题, 无论是用直接输出时序,读取数值,还是直接通过命令控制引脚高低来模拟时序,得到得结果都是一样的,而且在单片机程序不改的情况下,把FPGA的赋值改为222(11011110) 让最后输出是0的话,就可以正常输出,每次都是222. 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时, 可以输出正确数值 korgo 发表于 2012-10-18 16:03 static/image/common/back.gif
例:a=‘1’,b=‘0’,c=‘1’
b=a;
c=b;
这个我知道的,也想过这方面, 但是alway里面判断里分别只有一条语句,无论并行还是串行都是一样的呀?个人看法 zouyf12 发表于 2012-10-18 16:08 static/image/common/back.gif
这个已经验证过,没有问题, 无论是用直接输出时序,读取数值,还是直接通过命令控制引脚高低来模拟时序 ...
还是上modelsim的波形图吧 看看再低一级的电路 是什么样的 触发器 组合逻辑都对吗 你这综合出来的只有8个触发器啊 被优化掉了一个? chenguanglu 发表于 2012-10-18 16:19 static/image/common/back.gif
你这综合出来的只有8个触发器啊 被优化掉了一个?
那个我搞错, 我刚才实验赋值222时生成的RTL,因为222最后一位为0 ,且移入的数值也为0,所以被优化掉一个,现在更新在LZ位了,并附加上仿真
页:
[1]