永发信息网

verilog语言中,如何给变量赋初值,并能保证赋初值的语句与后面的always是顺序执行的。

答案:4  悬赏:10  手机版
解决时间 2021-04-03 06:47
verilog语言中,如何给变量赋初值,并能保证赋初值的语句与后面的always是顺序执行的。
最佳答案
不知道你是要做验证还是设计,如果是验证的话,不要求可综合,可以简单写成:
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

用状态机写的好处就是不用加标志位了,但是个人觉得没有必要这样写。

能力有限,错误请指正
全部回答
initial是初始化时使用的吧?
你可以这样,先定义变量的位宽,再做别的
always@(触发条件)
begin
具体语句
end
initial块与always 块是顺序执行的。因为在你的always块运行时,initial已经给你的信号赋了值,否则always出来的初始值应该是不可预期的,可能会是红线X。或者你 的always块里本身也有赋初值的语句,你可以做一下试验。运行initial跟always。两个模块里均对同一信号赋值。(这个是不冲突的)。仿真出来看信号得到的值到底是always块给的,还是initial块给的。
按我的经验来看,信号应该是先取得initial的值,再取得always块给的值。所以他们是顺序执行的。如果你需要两次赋值,你可以在initial的基础上再写两个always块。
希望对你有帮助。有问题可以再补充
你可以加入一个异步复位的信号,来进行初始化工作。
一般情况下,模块都应该有一个异步复位信号来进行初始化工作。有时候,不进行初始化会造成误码,误操作等情况。
格式如下:
always @ (posedge clk or posedge rst) begin
if (rst) begin
//这里填初始值
end
else begin
//这里是你的逻辑
end
end
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
这是一道商业数学题。 王师傅是卖鞋的,一只
共鸣什么意思
为什么人总是为情所困,16岁的我又被伤了
请问 中间两个小圆圈指钟数分别代表什么?还
关于信用卡申请资产证明。
急求《期待爱》钢琴简谱,我找不到钢琴谱。
"心生种种法生,心灭种种法灭"是主观唯心吗
微信好友不小心删了对方是单方好友我怎么加回
西周分封制在中国历史上影响深远。下列省、自
泰国最著名的体育运动
银杏盆景种植方法谁比较懂
平安人保人寿哪个好
膝盖3度烫伤用美宝有用吗
睢宁县交通局工会委员会地址好找么,我有些事
vc++的VMP SDK求助
推荐资讯
丁克女是不是性欲望强烈
蚂蝗是什么
市民可以转农民户口吗?
Neverjudgeamanbyhis_____alone—youmightbef
阅读下面甲、乙两段选文,回答题目。[甲]嗟夫
小狗出生后几个月就可以生小崽了?
途乐快捷宾馆地址好找么,我有些事要过去,
太原科技大学的行政级别
带名和时有关的成语有哪些
你好,世勋 韩文翻译
想在公安局工作要报什么学校?
问《疯狂农场》中的插曲名字
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?