搜索
bottom↓
回复: 6

verilog语句两个always块对同一个变量赋值问题!【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-16 21:31:25 | 显示全部楼层 |阅读模式
最近在做试验一个问题很是困扰了我,

比如



always @(posedge 其他信号)

begin

  star<=1;有其他信号标识star为1,在后面的always用star来标识进行一次处理

end



always @(posedge clk)

begin

 if(star==1)

  begin

    处理有star标识的一段程序,主要是在在每次时钟上升沿,处理一次

    处理完毕之后

    star<=1;       

  end

end 

上面的代码在编译的时候会出现star在两个always中多重赋值而出错,但程序又要到第二个always里面在处理完毕后来关掉star来确保在下一个时钟上升沿不在进行star的任务处理。

有没有其他解决办法或者思路呢?

大侠们帮我这个新手,我才入手方法和思路很窄,大家能告诉我一种思路不,现在觉得程序就是思路重要。

我之前想过在两个always之间用信号量来互相通信,但是这样好麻烦,verilog能够像C一样搞个全局变量什么的吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2008-11-16 23:54:41 | 显示全部楼层
我如果把两个always块合在一起,

always @(posedge clk,posedge enable...)

begin

 if(clk) star<=1;

 if(enable) star<=0;

end

编译是能够通过但是警告好多,说star在不同的分支下保存了先前的值。

这样搞还是不保险。

我之前搞信号量来的警告没有,但是太不方便啦

这个是我做transmiter的代码

module UTAR(Tx,empty,had_accept,rst,brand,clean_empty,send_me_data,data);

output Tx,empty,had_accept;

reg had_accept,empty,Tx;



input rst,clean_empty,send_me_data;

input brand;

input[7:0] data;



reg[9:0] transmit_data;

reg star_transmit;                     //开始传送信号

integer i;



reg  star_transmit_hand,empty_hand;                                  //always之间的握手信号



always @(posedge send_me_data or negedge rst)       //对锁存器的握手信号处理

begin

        if(!rst) begin

                 had_accept<=0;star_transmit<=0;

        end

        else begin

                transmit_data<=(data<<1)|(1<<9);          

                  had_accept<=1;

                if(star_transmit_hand) star_transmit<=0;

                else star_transmit<=1;

        end

end



always @(posedge brand or negedge rst)

begin

        if(!rst) begin

                Tx<=1;i<=0;star_transmit_hand<=0;empty_hand<=0;      //复位后TX一直发送停止位

        end

        else if(star_transmit)               //接受到了新数据

                begin

                        if(i>9) begin              //传输完毕

                                i<=0;

                                star_transmit_hand<=1;             //更改star_transmit状态的握手信号

                                empty_hand<=1;               //更改empty_transmit状态的握手信号

                        end  

                        else begin 

                                Tx<=transmit_data;i<=i+1;       //移位传输数据

                                star_transmit_hand<=0;               //更改star_transmit状态的握手信号

                                empty_hand<=0;                                        //更改empty_transmit状态的握手信号                        

                                end

                end        

end



always @(posedge clean_empty or negedge rst or posedge empty_hand)

begin

        if(!rst) empty<=0;

        else begin

                if(empty_hand) empty<=1;    //clena_empty和empty信号在

                else empty<=0;

        end

end



endmodule





为了在不同的always中改变empty和star_transmit加了信号量,太麻烦啦。不知道有什么办法解决没有,

http://ouravr.com/bbs/bbs_content.jsp?bbs_sn=861191&bbs_page_no=1&search_mode=1&search_text=driver&bbs_id=9999

这个跟我一样是同样的问题,我在去看看到底那样在两个always中对一个变量赋值会有什么不保险的地方,大家帮我出点注意好吗

出0入0汤圆

发表于 2008-11-16 22:29:00 | 显示全部楼层
不傻都是从傻开始的。

出0入0汤圆

 楼主| 发表于 2008-11-16 21:49:04 | 显示全部楼层
晕  我太傻啦  两个always何在一起就是啦  敏感列表两个和在一起就是的   if分开写就是   太傻啦

出0入0汤圆

发表于 2011-5-16 09:50:58 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-5-16 11:10:07 | 显示全部楼层
回复【3楼】shushi0123
-----------------------------------------------------------------------

据了解,一个变量是不能在多个always块中被赋值的。

出0入0汤圆

发表于 2011-5-19 09:04:35 | 显示全部楼层
回复【3楼】shushi0123
-----------------------------------------------------------------------

两个always之间是并行关系,有可能在同一时刻都对star赋值,这样就会引起冲突。

综合出来的硬件结构大约是star相当于一个寄存器,这个寄存器的时钟输入脚是always括号里面的信号,如果两个always里都对其赋值,就相当于star寄存器要有两个时钟输入引脚接,一个接"其他信号"另一个接clk,这种结构一般不可能实现的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表