verilog语句两个always块对同一个变量赋值问题!【恢复】
最近在做试验一个问题很是困扰了我,比如
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一样搞个全局变量什么的吗? 我如果把两个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 data;
reg 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中对一个变量赋值会有什么不保险的地方,大家帮我出点注意好吗 不傻都是从傻开始的。 晕 我太傻啦 两个always何在一起就是啦 敏感列表两个和在一起就是的 if分开写就是 太傻啦 MARK 回复【3楼】shushi0123
-----------------------------------------------------------------------
据了解,一个变量是不能在多个always块中被赋值的。 回复【3楼】shushi0123
-----------------------------------------------------------------------
两个always之间是并行关系,有可能在同一时刻都对star赋值,这样就会引起冲突。
综合出来的硬件结构大约是star相当于一个寄存器,这个寄存器的时钟输入脚是always括号里面的信号,如果两个always里都对其赋值,就相当于star寄存器要有两个时钟输入引脚接,一个接"其他信号"另一个接clk,这种结构一般不可能实现的。
页:
[1]