微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > assign 无法赋值

assign 无法赋值

时间:10-02 整理:3721RD 点击:
用assign 产生八相位时钟,具体是
assign #(1*(period/4))   a[0]=b;
assign #(2*(period/4))   a[1]=b;
assign #(3*(period/4))   a[2]=b;
assign #(4*(period/4))   a[3]=b;
其中b是已经产生的时钟反转信号,a是wire类型,问题是第4句a[3]没信号,一直为零,感觉b没有传导给a[3],前三个信号都有,请各位大神帮忙分析一下,谢谢!

求大神指导。

把a和b的波形贴出来



    波形搞不出来,就是b是时钟信号,a[0],a[1],a[2]都是b的延时,只有a[3]一直为低电平。我怀疑是assign后面延时的原因

有没有可能是在第四个时钟下这个进程被打断了。非阻塞赋值都会有这样的问题的

reg clk1,clk2,clk3,clk4;
        initial begin
                clk1 = 1'b0;
                #0;
                forever #10 clk1 = ~clk1;
        end
        initial begin
                clk2 = 1'b0;
                #1;
                forever #10 clk2 = ~clk2;
        end
        initial begin
                clk3 = 1'b0;
                #2;
                forever #10 clk3 = ~clk3;
        end
        initial begin
                clk4 = 1'b0;
                #3;
                forever #10 clk4 = ~clk4;
        end
不是应该用initial 块的么? 怎么是直接assign的?



    为什么会打断呢,求详解

有可能是因为,每当过了4*(period/4)的时候,你的b恰好都是0.所以你以为没有赋值,实际上是赋值了,只不过恰巧是0罢了



    应该不是的,带delay的assign赋值是在等号右边表达式有变化时立即采样,然后进入延时等待,再赋值,我也试过#3.1*(period/4),也没有波形,应该是延时出了问题。

第一,个人感觉时延是不是应该在assign之前?
第二,个人感觉period是不是刚好和B周期一样?
另外好像这种“#3.1*(period/4)” 在仿真的时候会把小数点后面的省略了。



    那个period就是b的周期,因为要从b的一个信号产生它的八相时钟;延时的精度与timescale有关,小数点后会保留几位的。

perid就是b的周期的话肯定不出波形。
assign #(4*(period/4))   a[3]=b;换言之就是assign #period a[3]=b。
这句话的执行机制是:
(1)b发生变化(0->1)触发等待period延迟
(2)period延迟期间,忽略b的一切变化
(3)period延迟到期后,取到期后当时b的值给a[3](因为period就是b的周期,因此b又是0->1的变化沿,取变化前的值,因此a[3]=0)。
(4)(3)发生时刚好又是b的变化沿,回到(1)。

省略了小数点后的值是因为timescale设定的不对

真心不感觉这个也会成为问题,能否把你的模块多贴出来点?包括Period的值。不知道你在什么情况下会用到这种在assign下的delayed blocking assignment。这是不可综合的你肯定知道吧。

检查综合后的网表,看综合出来的电路是什么。

要用assign 语句 或者always语句,这样产生就好
module tba;
reg clk;
initial begin
  clk = 1'b0;
  forever #2 clk = ~clk;
end
reg b1,b2,b3,b4;
always b1 = #1 clk;
always b2 = #1 b1;
always b3 = #1 b2;
always b4 = #1 b3;
wire c1,c2,c3,c4;
assign #1 c1 = clk;
assign #1 c2 = c1;
assign #1 c3 = c2;
assign #1 c4 = c3;
endmodule
延迟赋值跨波形变化点(这里是半时钟周期),仿真肯定大部分软件都会有问题,我已经在modelsim中测试过,延迟在等号后和语句前结果不同,但都不能达到群延迟效果。



    恩 应该就是你说的这个原因,用了你写的这几句,波形就可以出来了,多谢!

always @(clk) b1 <= #1 clk;
always @(clk) b2 <= #2 clk;
always @(clk) b3 <= #3 clk;
always @(clk) b4 <= #4 clk;
这样写, 非阻塞赋值, 时延跨几个时钟周期都没问题

用的多了,反而忘了 阻塞赋值与非阻塞赋值的对于仿真软件的含义了, 咳!
阻塞赋值:  仿真软件只在信号状态改变时, 新值更新到 等号前信号内
非阻塞赋值: 用于在特定时间或者事件发生时, "等号后信号"值更新到"被赋值信号"
基础真的很重要!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top