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

共7条 1/1 1 跳转至

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

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



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

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

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

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

高工
2012-12-30 18:01:01     打赏
4楼
无论是阻塞还是非阻塞赋值,最终结果都是一样的。
像下边这段,出来的波形就是最后一句的。
所以,期望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

高工
2013-01-03 11:06:44     打赏
5楼
被优化掉了。
我最后整成这样的了。将信号串行化。在需要写命令的地方,使用该模块
还没有完善,命令传入之后需要有一个信号控制着开始写入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 16:59:40     打赏
6楼
把要写入的数据交给这个模块,然后一个使能让这个模块工作。数据写入完毕,反馈一个信号。这是个还没搞定的东西。

高工
2013-01-03 20:58:11     打赏
7楼
总结出来,就是不存在顺序不顺序的问题。优化出来,以最简单的形式出结果。

共7条 1/1 1 跳转至

回复

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