chp019479 发表于 2014-4-4 09:34:49

请大家帮忙看看如下时序如何用VHDL实现

我想完成一个如下时序输出:
pulse_A脉冲会使 OUT 输出高电平,
pulse_B脉冲会使 OUT 输出低电平。

编写VHDL时遇到如下困难:
pulse_A和pulse_B的 上升沿检测,不能在一个进程中。
如果分两个进程检测信号上升沿,又会遇到在两个进程中对同一个信号赋值的问题。

请问大神们,如何完成我需要的时序哪?

chp019479 发表于 2014-4-4 09:37:42

奉上一点点莫元了表心意,谢谢了。

jm2011 发表于 2014-4-4 09:39:25

有时钟信号吗?

chp019479 发表于 2014-4-4 09:47:19

有时钟信号

流氓马 发表于 2014-4-4 09:49:59

应该系统还有个高频的时钟信号吧?
用时钟信号的上升沿,检测PULSE_A和PULSE_B的状态的变化。
定义一个替代变量TMP_PULSE_A,每次时钟信号上升沿来临的时候,先比较当前PULSE_A和上一次存储的TMP_PULSE_A的状态,如果PULSE_A = 1&&TMP_PULSE_A = 0,那么OUT就赋值为1.
同理对PULSE_B也一样处理。
最后TMP_PULSE_A = PULSE_A,TMP_PULSE_B = PULSE_B

chp019479 发表于 2014-4-4 09:55:38

回楼上,如果pulse_A的宽度是一个时钟周期,是不是就不行了?您给了我新的思路,谢谢,我加宽脉冲宽度试试

lusson 发表于 2014-4-4 10:03:35

根据out的状态,当out为0时检测到a为1时out也为1
out为1时检测到b为1时变为0

chp019479 发表于 2014-4-4 10:16:33

谢谢楼上新思路,我会找时间依依测试。

chp019479 发表于 2014-4-4 10:18:37

看来用脉冲的上升沿来解决问题的思路是行不通的了

NJ8888 发表于 2014-4-4 10:51:07

不就是带复位的触发器吗

chp019479 发表于 2014-4-4 11:05:46

谢谢楼上回复,请您详细解释一下,本人新手。

amote 发表于 2014-4-4 11:33:35

利用鉴相的方法来 如图示,适用于低速脉冲,如果速度较快,需要约束时序

chp019479 发表于 2014-4-4 12:45:07

谢谢楼上回复,我有时间试试能不能写出您给的vhdl代码

guolh_bj 发表于 2014-4-4 13:34:16

类似RS触发器么~~~~~~~~

y595906642 发表于 2014-4-4 13:55:40

signal pa_dl, pb_dl, pa_re, pb_re, dout : std_logic;

process(clk)
begin
        if clk'event and clk='1' then
                pa_dl <= pa;
                pb_dl <= pb;
        end if;
end process;
pb_re <= (not pb_dl) and pb;
pa_re <= (not pa_dl) and pa;

process(clk)
begin
        if clk'event and clk='1' then
                if pa_re = '1' then
                        dout <= 1;
                elsif pb_re <= '1' then
                        dout <= 0;
                else
                        dout <= dout;
                end if;
        end if;
end process;
有一个系统时钟延时
如果同时上升沿out输出1

chp019479 发表于 2014-4-4 14:33:17

谢谢楼上回复,我找时间仔细看看。

linjpxt 发表于 2014-4-4 09:34:50

module sync_sign
        (
        input clk_in,reset_i,
        input aset,clr,
        output q
        );
        reg a_flag,b_flag;
        always @ (posedge aset or posedge reset_i)
        if(reset_i)
        begin
                a_flag=0;
        end
        else
        begin
                a_flag=~b_flag;
        end

        always @ (posedge clr or posedge reset_i)
        if(reset_i)
        begin
                b_flag=0;
        end
        else
        begin
                if(clr)        b_flag=a_flag;
        end
        assign q=(a_flag!=b_flag);
endmodule

chp019479 发表于 2014-4-4 15:54:22

本帖最后由 chp019479 于 2014-4-4 15:58 编辑

感谢linjpxt 回复,已经按照您的例子完美实现我的要求,谢谢!

结帖。{:biggrin:}{:biggrin:}
页: [1]
查看完整版本: 请大家帮忙看看如下时序如何用VHDL实现