永发信息网

如何用VHDL实现输出一个单脉冲信号,脉宽大概几十个ns到几个us都可以

答案:3  悬赏:40  手机版
解决时间 2021-11-21 00:54
  • 提问者网友:浮克旳回音
  • 2021-11-20 12:52
如何用VHDL实现输出一个单脉冲信号,脉宽大概几十个ns到几个us都可以
最佳答案
  • 五星知识达人网友:鸽屿
  • 2021-11-20 13:49
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY fpq IS
PORT(clk:IN STD_LOGIC;
clk_out:OUT STD_LOGIC);
END fpq;

ARCHITECTURE dwz OF fpq IS
CONSTANT m : INTEGER:=5000;
SIGNAL tmp :STD_LOGIC;
BEGIN
PROCESS(clk, tmp)
VARIABLE cout : INTEGER:=0;
BEGIN
IF clk'EVENT AND clk='1' THEN cout:=cout+1;
IF cout<=m THEN tmp<='0';
ELSIF cout ELSE cout:=0;
END IF;
END IF;
END PROCESS;
clk_out<=tmp;
END dwz;
已经可以用了的!追问谢谢 请看清楚提问:‘’当一个脉宽不确定的单脉冲信号Q_in输进来时,马上输出一个脉宽确定的单脉冲信号Q_out,如果用到系统时钟CLK去计时的话,会有两路上升沿(Q_in和CLK)触发语句,对同一个信号赋值时, 在一个进程或两个进程里会出现信号冲突或多驱动的问题。‘’追答LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--输入一个信号,输出这个一个脉冲宽度的信号;
--是捕获一个下降沿,输出一个脉冲宽度的低电平
ENTITY XD IS
PORT( CLK:IN STD_LOGIC; --高频脉冲信号
KEY_IN:IN STD_LOGIC; --输入的需要捕获下降沿的信号
KEY_OUT: OUT STD_LOGIC); --输出信号
END XD;

ARCHITECTURE FWM OF XD IS
SIGNAL TMPA,TMPB:STD_LOGIC; --用于纪录信号的变化
SIGNAL TMPO:STD_LOGIC;
BEGIN
XDQ:PROCESS(CLK,TMPA,TMPB)
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
TMPA<=KEY_IN; TMPB<=TMPA;
END IF;
TMPO<= NOT(((NOT TMPA )AND TMPB));
END PROCESS XDQ;
KEY_OUT<=TMPO;
END FWM;
你的意思其实类似于消抖,只要输入信号进来,就输出一定宽度的信号,这是捕获输入信号的下降沿的,如果上升沿的话,只要TMPO<= NOT(((NOT TMPA )AND TMPB));这句话改一下就是了,可以为TMPO<= TMPA AND (not TMPB);我这个应该可以解决了吧?宽度问题可以再用一个process对系统的clk时钟进行分频,这样可以给分了不?追问你好
你用了阻塞赋值延时的:TMPA<=KEY_IN; TMPB<=TMPA;脉宽大小不可调;
你的程序不能满足:“当一个脉宽不确定的单脉冲信号KEY_IN输进来时,立即输出一个脉宽确定的单脉冲信号KEY_OUT”,也就是KEY_IN与KEY_OUT的上升沿几乎同时(可差10ns内)。
明白我意思没?
我用程序结合分立的symbol原件实现了,感觉复杂了点。追答这个看似延时了,但是你可以通过仿真分析,发现实际上这个在一个clk下就马上输出信号了,绝对没有一个clk的延时,是可以在10ns内的,不信你可以仿真看看
全部回答
  • 1楼网友:傲气稳了全场
  • 2021-11-20 15:13
这个比较容易实现吧
给你提供思路
用计数器cnt计数
cnt 计数到255清零
当 cnt<128时输出高电平
否则输出低电平追问这方法可以让一个上升沿变换成一个单脉冲输出吗?两个时钟上升沿信号在一个进程或两个进程里会出现信号冲突的问题。怎么解决?谢谢追答系统时钟只是作为触发条件,可以灵活改变,根据你需要单脉冲的周期,灵活改变系统时钟都是可以的。
至于你说的信号冲突,经过实践我没发现这个问题。
不过按照你的意思我个人理解,你意思,两个process都在clk上升沿触发,但是实际中存在这样的问题:cnt触发了,但是要有时延,这个时延的过程正好避开了输出信号的触发,所以,一般这个两个process不会冲突(当然你的时钟信号周期不能太短),这是一般的自然情况,如果想认为避免,方法有很多,比如 变种的异步触发同步释放。
假如你想要带脉冲,则cnt清零后不再计数即可。给你提供个方阵图参考一下(这个是我工程中一个可随时调整占空比的脉冲信号方阵图):追问你好,谢谢你的回答。我的要求是这样的:当一个脉宽不确定的单脉冲信号Q_in输进来时,马上输出一个脉宽确定的单脉冲信号Q_out,如果用到系统时钟CLK去计时的话,会有两路上升沿(Q_in和CLK)触发语句,对同一个信号赋值时, 在一个进程或两个进程里会出现信号冲突或多驱动的问题。怎么解决?谢谢。追答现在明白你的意思了。
个人感觉是否可以这样处理:既然是输出的脉宽是确定的,即为确定信号(当做确定波形,可以事先做好存储,(可以考虑FSM)),Q_in当做使能信号,Q_in上升沿触发一个确定信号发出,
CLK只对波形的存储作用,Q_in只对波形的发出作用。
不知道我说的清楚不?追问呵呵,你说的是状态机?怎么实现事先做好储存?可以给个程序么,我用VHDL不久。谢谢追答今天下午 在论坛上也看见你了 dspmatlab
方便的话留个q 说追问QQ:1422411963追答qq验证:电话号码??
  • 2楼网友:痴妹与他
  • 2021-11-20 13:59
看你的时钟频率
再用分频器追问之前用过这方法追答不行么?通常都是这样用的吧追问是行啊 我要单个脉冲的 脉宽可调追答喔 调好分频后的clk 用个计数器加一个开关控制线路咯
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯