german010 发表于 2012-11-20 17:40:20

如何让一个信号,在另一个信号上升沿置1,下降沿置0?

咨询大家一个问题:如何让一个信号,在另一个信号上升沿置1,下降沿置0?
如下的信号a,信号b 在信号a上升沿置位1,下降沿置位为0
always @(posedge a)
    b <=1'b1;

always @( negedgea)
   b<=1'b0;

希望达到这样的效果,但这样写编译一定通过不了,
大家都用什么办法实现这样的功能?

ab8780000 发表于 2012-11-20 20:19:13

always @(posedge clk(大时钟) or negedge rst_n)
begin
if(!rst_n) b <= 1'b0;
else if(a_pos)b <= 1'b1;
else if(a_neg)b <= 1;b0;
end
仅供参考!

yuyu87 发表于 2012-11-20 20:39:37

ab8780000 发表于 2012-11-20 20:19 static/image/common/back.gif
always @(posedge clk(大时钟) or negedge rst_n)
begin
if(!rst_n) b

这种方法不就又多了两个变量了么?

关注

yuyu87 发表于 2012-11-20 20:41:05

always @(posedge a or negedgea)
   if (a) b <=1'b1;
else
   b<=1'b0;


这样呢?
未验证

zxq6 发表于 2012-11-20 20:41:23

其实我觉得应该还有更简单的
assign b=a;

yuyu87 发表于 2012-11-20 20:41:30

记得一个变量只能在一个进程里赋值

zhangalex88 发表于 2012-11-20 20:58:24

干吗不直接用a?
支持5楼。

lanliang714 发表于 2012-11-20 21:21:53

always @(posedge a)
if(rst) m <=0;
else m <=~m;

always @( negedgea)
if(rst) n <=0;
else n <=~n;

assign b = m ^ n;

ziruo2002ab 发表于 2012-11-20 22:11:14

各位,逻辑电路不是C语言

ziruo2002ab 发表于 2012-11-20 22:12:32

什么叫hdl,就是hardware description language
用软件思维来写是很恐怖的

ziruo2002ab 发表于 2012-11-20 22:16:39

lz的问题,如果是考虑到系统稳定性,最好的方法是
用系统时钟采样输入信号,就是多个触发器串联去采样输入信号
然后下降沿和上升沿其实也很容易获取
就是前一个触发器 AND 后一个触发器的反
或者 前一个触发器的反 AND 后一个触发器
即可检出上升下降沿脉冲
这个是跨时钟域处理的最基础的问题
我不是做逻辑的,具体找书去

pocker5200 发表于 2012-11-20 22:52:22

如果没有其他附加条件的话,5楼正解……

wildone 发表于 2012-11-21 09:57:10

个人感觉如果要稳定,这样行不行?
always(posedge clk)
begin
   a_tmp1 <= a;
   a_tmp2 <= a_tmp1;
end

always(posedge clk)
begin
    if(a_tmp1 && !a_tmp2) //上升沿
      b <= 1'b1;
    else if(!a_tmp1 && a_tmp2) //下降沿
      b <= 1'b0;
end

german010 发表于 2012-11-21 11:01:15

谢谢 ,应该效果不错    {:smile:}

jm2011 发表于 2012-11-21 14:04:16

13楼是推荐的写法

zhangalex88 发表于 2012-11-22 18:30:15

我是6楼,难道就5楼和12楼和我的思维一致?
a信号本身就是在上升沿变为1,下降沿变为0,为什么还要写那么多代码来实现明摆着的东西?
学术研究?让信号与时钟同步?让信号延时2个时钟?
楼主,你看呢?

starli 发表于 2012-11-22 21:03:13

用模拟比较器

wildone 发表于 2012-11-23 09:40:36

zhangalex88 发表于 2012-11-22 18:30 static/image/common/back.gif
我是6楼,难道就5楼和12楼和我的思维一致?
a信号本身就是在上升沿变为1,下降沿变为0,为什么还要写那么多 ...

消除组合电路的毛刺现象

wangshaosh123 发表于 2012-11-23 12:31:56

5楼应该是可以的    简单实用
如果有毛刺应该从另外的角度去去除而不是把它搞复杂

simpleh 发表于 2012-11-27 11:54:49

学习了。13楼应该可以。

german010 发表于 2012-11-27 17:34:45

to yuyu87
这里没有进程,是电路布线,布线后应该是并连或串连的电路

浮云残雪 发表于 2012-11-27 18:22:46

always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                        rs232_rx0 <= 1'b0;
                        rs232_rx1 <= 1'b0;
                        rs232_rx2 <= 1'b0;
                        rs232_rx3 <= 1'b0;
                end
        else begin
                        rs232_rx0 <= rs232_rx;
                        rs232_rx1 <= rs232_rx0;
                        rs232_rx2 <= rs232_rx1;
                        rs232_rx3 <= rs232_rx2;
                end
end
        //下面的下降沿检测可以滤掉<20ns-40ns的毛刺(包括高脉冲和低脉冲毛刺),
        //这里就是用资源换稳定(前提是我们对时间要求不是那么苛刻,因为输入信号打了好几拍)
        //(当然我们的有效低脉冲信号肯定是远远大于40ns的)
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;        //接收到下降沿后neg_rs232_rx置高一个时钟周期
这是一个边缘检测问题。这段代码你看看就明白了

浮云残雪 发表于 2012-11-28 23:09:13

ziruo2002ab 发表于 2012-11-20 22:16 static/image/common/back.gif
lz的问题,如果是考虑到系统稳定性,最好的方法是
用系统时钟采样输入信号,就是多个触发器串联去采样输入 ...

恩恩。你这个说的就是边缘检测方法。你说的这个很原理。很明白 。能不能提供下这类问题原理方面的书或论文什么的

LB964477 发表于 2012-11-28 23:11:44

来学习
{:smile:}

jm2011 发表于 2012-11-29 11:26:27

浮云残雪 发表于 2012-11-27 18:22 static/image/common/back.gif
always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                        rs232_rx0

问一下,这个问题和我的帖子:http://www.amobbs.com/thread-5509258-1-1.html
中描述的是一种问题吗? 是不是都是为了稳定才多打一拍的?

ziruo2002ab 发表于 2012-11-29 20:45:20

浮云残雪 发表于 2012-11-28 23:09 static/image/common/back.gif
恩恩。你这个说的就是边缘检测方法。你说的这个很原理。很明白 。能不能提供下这类问题原理方面的书或论 ...

忘了,不好意思
反正是一本数字电路逻辑设计经典,最让人印象深刻的第一句话就是:Hi, I'm John.
叫:数字逻辑设计?? 不知

浮云残雪 发表于 2012-12-1 09:23:05

ziruo2002ab 发表于 2012-11-29 20:45 static/image/common/back.gif
忘了,不好意思
反正是一本数字电路逻辑设计经典,最让人印象深刻的第一句话就是:Hi, I'm John.
叫:数 ...

好的。谢谢啦。

浮云残雪 发表于 2012-12-1 09:31:46

ziruo2002ab 发表于 2012-11-29 20:45 static/image/common/back.gif
忘了,不好意思
反正是一本数字电路逻辑设计经典,最让人印象深刻的第一句话就是:Hi, I'm John.
叫:数 ...

数字设计原理与实践 韦克利(John F.Wakerly)

今世小浪子 发表于 2012-12-5 21:04:50

13楼的 小弟试了一下 晚一个十周周期 有更好的方法吗

yuyu87 发表于 2012-12-5 21:11:19

zhangalex88 发表于 2012-11-22 18:30 static/image/common/back.gif
我是6楼,难道就5楼和12楼和我的思维一致?
a信号本身就是在上升沿变为1,下降沿变为0,为什么还要写那么多 ...

那假如上升沿置2,下降沿置7呢?
所以 assign 就不行了吧?

fsclub 发表于 2012-12-5 22:07:56

三种方法
1、用导线一条直接解决问题
2、两反向器串联
3、比较器一个

scutfanyu 发表于 2012-12-5 22:38:22

这个论坛果然很nb,一个这么小的问题大家都这么执着!!!受教了

zhangalex88 发表于 2012-12-6 20:54:26

yuyu87 发表于 2012-12-5 21:11 static/image/common/back.gif
那假如上升沿置2,下降沿置7呢?
所以 assign 就不行了吧?

和assign一样直接赋值:
wire b=(a?2:7);
当然如果要附加条件,则另当别论。
页: [1]
查看完整版本: 如何让一个信号,在另一个信号上升沿置1,下降沿置0?