有个计数器
reg [5:0]count=0;
现在需要用a信号对它清零,b信号对对它进行累加。
always @(posedge a)
count<=0;
always @(posedge b)
count=count+1;
出错了,两个或两个以上always块里面对同一个变量进行赋值,应该怎么解决呢?
两个always模块对一个变量进行赋值
貌似可以了,不过现在出现了个新问题
reg st=0; //开始信号寄存器
always @(posedge p or posedge z)
begin
if (z==1) //第一个Z脉冲z脉冲出现才计数
begin
count<=0;
st<=1;
end
else
begin
if (st==1) //判断是否已经出现Z脉冲
begin
count<=count+1;
if (count==10|count==30) //如果每周计数到10和30个脉冲就发出一个脉冲信号
CLK<=1;
else CLK<=0;
end
else CLK<=0;
end
end
问题是,仿真的时候,并没有等到第一个Z脉冲出现就已经开始计数了。这是为什么呢?
7楼
你的意思是:b作为计数器时钟,上升沿有效;a作为清零是能,高电平有效。
一个变量只能在一个进程中被赋值。
推荐的写法为:
always @ ( posedge b)
begin
if (a)
count <= 0;
else
count <= count + 1;
end
这是同步清零方式,能消除竞争冒险,且符合同步设计思想,便于仿真器穿透。但a高电平必须持续一个b周期以上。
另一种写法为:
always @ ( posedge b or posedge a )
begin
if (a)
count <= 0;
else
count <= count + 1;
end
这是异步清零方式,不推荐。
一个变量只能在一个进程中被赋值。
推荐的写法为:
always @ ( posedge b)
begin
if (a)
count <= 0;
else
count <= count + 1;
end
这是同步清零方式,能消除竞争冒险,且符合同步设计思想,便于仿真器穿透。但a高电平必须持续一个b周期以上。
另一种写法为:
always @ ( posedge b or posedge a )
begin
if (a)
count <= 0;
else
count <= count + 1;
end
这是异步清零方式,不推荐。
8楼
你用的是哪个仿真软件?这种写法从仿真语义上看应该是可以的,除了
if (count==10|count==30) 中的 “|” 应改成 “||”
但这种写法不好。
1, “reg st=0; ”,这个初值仅在仿真时有效,综合是无效,因此综合后st的初值是随机的,应该有一个全局的复位信号对需要的全部寄存器赋初值,先复位再使用。
2, 你的CLK会综合一个不希望的锁存器,因为你在if (z==1) 中未对其赋值。
回复
有奖活动 | |
---|---|
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? |
打赏帖 | |
---|---|
【换取手持数字示波器】AHT10温度检测分享被打赏40分 | |
【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC被打赏40分 | |
【换取手持数字示波器】ACM32F070LCD屏和触控按键功驱动蜂鸣器分享被打赏40分 | |
【换取手持数字示波器】国民技术PWM功能知识分享被打赏40分 | |
【换取手持数字示波器】放大器运放知识分享被打赏40分 | |
【分享评测,赢取加热台】+开关电源AC输入知识分享被打赏30分 | |
【换取手持数字示波器】N32G430点亮数码管与串口打印、ADC被打赏40分 | |
老胖子聊电路--分析一个反馈电路被打赏50分 | |
【换取手持数字示波器】+点亮WS2812RGB灯被打赏50分 | |
【换取手持数字示波器】+线性调整器理论知识分享被打赏40分 |