这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » always块里边语句执行顺序问题

共13条 1/2 1 2 跳转至

always块里边语句执行顺序问题

高工
2012-12-29 22:01:39     打赏
always对信号边沿敏感。那么,always里边的阻塞赋值怎么执行的?是每个边沿执行一句还是每个边沿到了时,一下子都执行了



关键词: always     里边     语句     执行     顺序     问题    

工程师
2012-12-30 09:14:17     打赏
2楼

一下子都执行了。。。


高工
2012-12-30 11:07:32     打赏
3楼
实验了一下  确实如此

在一个always块里边连续对一个寄存器两次赋值。
出来的结果是最后一次的赋值。中间不会发生信号变化什么的

助工
2012-12-30 13:32:04     打赏
4楼
参考阻塞与非阻塞语句的区别...

高工
2012-12-30 15:56:04     打赏
5楼
搞混阻塞与非阻塞了

高工
2012-12-30 18:01:01     打赏
6楼
无论是阻塞还是非阻塞赋值,最终结果都是一样的。
像下边这段,出来的波形就是最后一句的。
所以,期望always里边顺序执行是不可能的了
always @(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        q <= 0;
    else
        begin
            q=1'b1;
            q=1'b0;
            q=1'b1;
            q=1'b0;
            q=1'b1;
            q=1'b0;
            q=1'b1;
            q=1'b0;
            q=1'b1;
            q=1'b0;
            q=1'b1;
            //q=1'b0;
        end
end

工程师
2012-12-30 20:29:13     打赏
7楼

我认为在这里还应该注意的是:always块内是阻塞赋值还是非阻塞赋值,虽然边沿到来之后always块内的语句都执行。但是阻塞和非阻塞还是不同的。
比如
always@(posedge  clk)
     begin
         b = a ;
         c = b ;
    end

always@ (posedge clk)
    begin
       b <= a;
       c <= b;
    end
是不同的。
假设 a = 0、b =1;
第一段的结果是 c =b=a=0;第二段结果是 b = a = 0,c  = 1.
也就是说 阻塞赋值是在一条语句完成的时候,变量值就发生了变化。
而非阻塞赋值是在整个begin...end块结束后才开始赋值(把a的值给b的时候同时把b的值给c,这样b的值就没有覆盖。),在end之前只是描述了相互变量之间的逻辑关系。


高工
2013-01-02 21:30:06     打赏
8楼
军爷,综合的时候在RTL级里边就真直接给你接高或低了,

啥都不说了,它就看最后一个是啥

高工
2013-01-03 11:06:44     打赏
9楼
被优化掉了。
我最后整成这样的了。将信号串行化。在需要写命令的地方,使用该模块
还没有完善,命令传入之后需要有一个信号控制着开始写入12864.命令成功执行之后,需要有一个信号作为反馈。这些还没做呢
/*************************************************
* Module Name      : 向12864写命令   
* Engineer          : hanshuyujifen
* Target Device     : EP2C5Q208C8
* Tool versions     :
* Create Date      :
* Revision          : v1.0
* Description      :   
**************************************************/

module lcd_write_cmd(sys_clk,sys_rstn,isready,cs,rs,rw,cmddata,dataport);
input sys_clk,sys_rstn;
input [15:0] cmddata;
output isready;
output cs,rs,rw;
output [7:0] dataport;

reg [7:0]     dataport;
reg             isready;

reg clk1m;   //1M时钟信号

//分频器,产生1M时钟
reg [4:0] cnt1;
always @(posedge sys_clk or negedge sys_rstn)
begin
    if(!sys_rstn)
        begin
            cnt1 <= 5'd0;
            clk1m <= 1'd0;
        end
    else if(cnt1 == 5'd24)
        begin
            cnt1<= 5'd0;
            clk1m <= ~clk1m;
        end
    else
        begin
            cnt1 <= cnt1+1'b1;
            clk1m <= clk1m;
        end
end

reg [5:0] delay_cnt;
always@(posedge clk1m or negedge sys_rstn)
    begin
        if(!sys_rstn)
            delay_cnt <= 6'd0;
        else if(~isready)
            begin
                if(delay_cnt == 20)
                    delay_cnt<= 6'd0;
                else
                    delay_cnt <= delay_cnt +1'b1;
            end
    end

//写命令
reg cs,rs,rw;
always @(posedge clk1m or negedge sys_rstn)
    begin
        if(!sys_rstn)
            begin
                cs<= 1'b0;
                rs<= 1'b0;
                rw<= 1'b0;
                isready <= 1'b0;
                dataport <= 8'd0;
            end
        else
            begin
                case(delay_cnt)
                    0:    begin
                            cs = 0;
                            rs = 0;
                        end
                    1:
                        dataport = cmddata[15:8];
                    2:
                        begin
                            rw = 0;
                        end
                    3:
                        rw = 1;
                    4:
                        dataport = cmddata[7:0];
                    5:
                        rw = 0;
                    6:
                        begin
                            rw = 1;
                            cs = 1;
                            isready = 1;
                        end
                    endcase
            end
    end
endmodule

高工
2013-01-03 15:26:58     打赏
10楼
没弄明白,你嘛意思?

共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]