还是阻塞和非阻塞,谢谢
代码要求:变量temp,在clk上升沿,temp加1;
当temp>=8的时候,temp减8.
如果写成阻塞,代码如下:
always @ (posedge clk)
begin
temp=temp+1;
if (temp>=8)
temp=temp-8;
end
验证下,也是对的.
我没弄明白,如果改成非阻塞,怎么做?总做的不对?
还是有的时序电路并不能用非阻塞,谢谢! 晕...
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
temp <= 'd0;
else if(temp >= 4'd8)
temp <= 'd0;
else
temp <= temp + 4'd1;
end
时序电路最好全部用非阻塞,好的style对于一个程序的稳定性是非常重要,还有EDA综合后的效率,速度.
大系统也能降低不确定因素.
否则你前仿可以后仿也许就不行了.
或者后仿可以烧片就不行了,或者温度变化,环境变化,器件老化后..... 谢谢OLIVER.上次也得到你的帮助. 是吗?我忘了,呵呵. 谢谢Oliver. 我的意图没有说明白.
每来1个时钟,temp就加1;然后判断如果>=8,再减8.这样一来加1和减8同时执行
就无法用非阻塞表达?
问题来源于另外一个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3380438&bbs_page_no=1&bbs_id=1029
cliff的代码怎么用非阻塞表达?
谢谢Oliver cliff 和大家. 你干嘛要搞这么复杂?
+和判同时执行,这样不符合数字电路综合原则
(真想这样只能用阻塞,仿真应该没问题,烧片就站不住脚了,至于怎么用是当事人的事)
你把8改成7不就完了吗????? +和判同时执行,这样不符合数字电路综合原则 .
谢谢Oliver. 不谢,你原来是不是写C(顺序执行)的.
HDL不一样,是并行执行的.
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
temp <= 'd0;
else if(temp >= 4'd7) //0:7(8 steps)
temp <= 'd0;
else
temp <= temp + 4'd1;
end
你看看,应该是你想要的 谢谢Oliver,是这个意思.
还有个问题,用FPGA分频能精确吗?
假设输入时钟是很精确的,10分频后,信号的相位会发生越来越大的漂移吗?
always @(posedge clk)
begin
if (cnt==9)
flag<=1;
else
flag<
end 谢谢Oliver,是这个意思.
还有个问题,用FPGA分频能精确吗?
假设输入时钟是很精确的,10分频后,信号的相位会发生越来越大的漂移吗?
always @(posedge clk)
begin
if (cnt==9)
begin
flag<=1; //别的地方实现flag<=0
else
cnt<=cnt+1;
end
运行一段时间后clk和flag之间的相位差会越来越大吗(因为门电路的延迟)? 不好意思,上面两个帖子不完整.完整如下:
谢谢Oliver,是这个意思.
还有个问题,用FPGA分频能精确吗?
假设输入时钟是很精确的,10分频后,信号的相位会发生越来越大的漂移吗?
always @(posedge clk)
begin
if (cnt==9)
begin
flag<=1; //别的地方实现flag<=0
cnt<=0;
end
else
cnt<=cnt+1;
end
运行一段时间后clk和flag之间的相位差会越来越大吗(因为门电路的延迟)? 1.你的电路不可能工作的,同一reg变量不能在多个always中操作.
2.分频不会相位越来越大,相同环境因素下是固定的,一般几个ns
(他们是同步工作的,怎么会越来越大呢?永远同步在posedge clk上).
3.建议你任何时候都把复位信号放上.
4.计数和时序输出可以分两个always写,虽然功能一样,但逻辑性更清楚些 多谢Oliver,很有启发,虽然还不是完全明白. Oliver方便的话可以邮件联系吗? 我的:nust10@yahoo.com.cn 我不是经常用邮件,去我那贴ARM7+CPLD+SRAM+TFT的贴子,里面有mail,qq,mp...... 是那个从SD卡显示照片的帖子吧,以前看了好几遍,今天找了好久找不着了,怪了.谢谢 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2199636&bbs_page_no=1&search_mode=4&search_text=Oliver&bbs_id=9999
页:
[1]