verilog中reg变量赋初始值问题
大家帮我看看,我遇到2个问题,非常感谢1:reg型变量能在定义的时候直接赋值吗?比如reg[3:0]a=10;有人说可以,但是我试过,不行2:reg型变量,可以在alwa...
大家帮我看看,我遇到2个问题,非常感谢
1:reg型变量能在定义的时候直接赋值吗?比如reg[3:0] a=10;有人说可以,但是我试过,不行
2:reg型变量,可以在always中利用reset 赋值,这个我试过,可以。但是有个问题,我不用按reset 键也能赋值,咋回事呢?比如,下面程序上电自动赋值,不用按键。
always@(posedge clk,negedge rst)
if(!rst) a=10; //a赋初值
else
begin
......
end 展开
1:reg型变量能在定义的时候直接赋值吗?比如reg[3:0] a=10;有人说可以,但是我试过,不行
2:reg型变量,可以在always中利用reset 赋值,这个我试过,可以。但是有个问题,我不用按reset 键也能赋值,咋回事呢?比如,下面程序上电自动赋值,不用按键。
always@(posedge clk,negedge rst)
if(!rst) a=10; //a赋初值
else
begin
......
end 展开
5个回答
展开全部
reg型变量能在定义的时候直接赋值,这跟综合工具有关,一般不建议将这样的代码直接综衫轿合而是仅仅仿真用。
不用按reset 键或悉肆也能赋值,是因为你的硬件有陆纤一个上电复位电容,就是但凡刚启动,都会自动复位。
不用按reset 键或悉肆也能赋值,是因为你的硬件有陆纤一个上电复位电容,就是但凡刚启动,都会自动复位。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
求可综合,可以简单写成:
always@ (posedge a)
begin
@ (negedge b)
c<=...;
end
如果要想可综合的话,需要用状态机类似的概念,
即设一个标志位,当a上升沿来是,把它赋值为1,
当它为1且b下降沿来时,给c赋值,并将它赋值回0:
并且,如果a,b不是时钟的话,不推荐使用posedge的写法
采用下面的方法比较好:
reg a_dly,b_dly; //a,b的1始终delay信号
wire a_pos,b_pos; //a,b的上升沿抓取信号
assign a_pos = a & !a_dly;
assign b_pos = b & !b_dly;
reg flag;//标志位
always@(posedge clk or posedge rst)
begin
if(rst) begin
a_pos <= 1'b0;
b_pos <= 1'b0;
end
else begin
a_pos <= a;
b_pos <= b;
end
end
always@(posedge clk or posedge rst)
begin
if(rst)
flag <= 1'b0;
else if(a_pos)
flag <= 1'b1;
else if(b_pos)
flag <= 1'b0;
end
always@(posedge clk)
begin
if(flag & b_pos)
c<=....
end
把flag赋值回为0很重要,不然逻辑有问题。
用3段状态机写就是
parameter IDLE = 2'h0;
parameter WAIT_B_POS = 2'h1;
parameter GET_C = 2'h2;
reg [1:0] cs; //current state
reg [1:0] ns; //next state
//1段 状态转换
always@(posedge clk or posedge rst)
begin
if(rst)
cs <= IDLE;
else
cs <= ns;
end
//2段 状态茄大迁移
always@(a_pos or b_pos or cs or ns)
begin
ns = XX; //设置ns为xx
case(cs)
IDLE: begin
if(a_pos) ns = WAIT_B_POS;//用阻塞赋值
else ns = IDLE;
end
WAIT_B_POS:begin
if(b_pos) ns = GET_C;
else ns = WAIT_B_POS;
end
GET_C:begin
ns = IDLE;
end
default:;
endcase
end
//3段 赋值
always@(posedge clk or posedge rst)
begin
if(rst)
c<=1'b0;
else begin
if(ns == GET_C)
c <= .....;
end
end
用状态机写颤启竖的好处就是不用加标志位了,但是个人觉得没有必要这样写。
能力有限,错旁如误请指正
always@ (posedge a)
begin
@ (negedge b)
c<=...;
end
如果要想可综合的话,需要用状态机类似的概念,
即设一个标志位,当a上升沿来是,把它赋值为1,
当它为1且b下降沿来时,给c赋值,并将它赋值回0:
并且,如果a,b不是时钟的话,不推荐使用posedge的写法
采用下面的方法比较好:
reg a_dly,b_dly; //a,b的1始终delay信号
wire a_pos,b_pos; //a,b的上升沿抓取信号
assign a_pos = a & !a_dly;
assign b_pos = b & !b_dly;
reg flag;//标志位
always@(posedge clk or posedge rst)
begin
if(rst) begin
a_pos <= 1'b0;
b_pos <= 1'b0;
end
else begin
a_pos <= a;
b_pos <= b;
end
end
always@(posedge clk or posedge rst)
begin
if(rst)
flag <= 1'b0;
else if(a_pos)
flag <= 1'b1;
else if(b_pos)
flag <= 1'b0;
end
always@(posedge clk)
begin
if(flag & b_pos)
c<=....
end
把flag赋值回为0很重要,不然逻辑有问题。
用3段状态机写就是
parameter IDLE = 2'h0;
parameter WAIT_B_POS = 2'h1;
parameter GET_C = 2'h2;
reg [1:0] cs; //current state
reg [1:0] ns; //next state
//1段 状态转换
always@(posedge clk or posedge rst)
begin
if(rst)
cs <= IDLE;
else
cs <= ns;
end
//2段 状态茄大迁移
always@(a_pos or b_pos or cs or ns)
begin
ns = XX; //设置ns为xx
case(cs)
IDLE: begin
if(a_pos) ns = WAIT_B_POS;//用阻塞赋值
else ns = IDLE;
end
WAIT_B_POS:begin
if(b_pos) ns = GET_C;
else ns = WAIT_B_POS;
end
GET_C:begin
ns = IDLE;
end
default:;
endcase
end
//3段 赋值
always@(posedge clk or posedge rst)
begin
if(rst)
c<=1'b0;
else begin
if(ns == GET_C)
c <= .....;
end
end
用状态机写颤启竖的好处就是不用加标志位了,但是个人觉得没有必要这样写。
能力有限,错旁如误请指正
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.reg类型的不可以直接赋值的,一般在always块中进行赋值。
2.有上电复位的。
2.有上电复位的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不能,可不可以把完整的程序,发给我看下!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询