VHDL 语言编程,检测两个周期信号是否同时达到上升沿或者下降沿变化

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOG... LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY pulsesd IS
PORT ( CLK1: IN STD_LOGIC;
CLK2: IN STD_LOGIC;
CLK3: OUT STD_LOGIC);
END ENTITY ;

ARCHITECTURE ONE OF pulsesd IS
SIGNAL A: STD_LOGIC := '0';

BEGIN
PROCESS (CLK1,CLK2) BEGIN
IF RISING_EDGE(CLK1) AND RISING_EDGE(CLK2) THEN
A <= NOT A;
END IF;
IF FALLING_EDGE(CLK1) AND FALLING_EDGE(CLK2) THEN
A<= NOT A;
END IF;
END PROCESS;
CLK3 <= A;
END ONE;

这是我的程序,输入两个周期信号clk1和clk2,当clk1和clk2同时是上升沿或者下降沿变化时,中间信号A取反,并将结果从clk3输出,仿真的时候出现了错误:Error (10628): VHDL error at pulsesd.vhd(17): can't implement register for two clock edges combined with a binary operator ;Error (10658): VHDL Operator error at pulsesd.vhd(17): failed to evaluate call to operator ""and""; 是不是在同一个进程中不能同时检测两个信号的变化?这个程序改如何修改?不能的话请另外讲一个更好的方案,谢谢。
展开
 我来答
夏侯珈蓝德0Ijb04
2014-04-09 · TA获得超过283个赞
知道小有建树答主
回答量:185
采纳率:83%
帮助的人:91万
展开全部
是的,在一个process中不能检测两个上升沿变化
可以用一个中间变量记录上一次的值就可以了,例如:
if(clk11='0' AND clk1='1') then --检测上升沿
clk11<=clk1;
追问
不是很明白,能否在我的程序上面修改一下,就是进程那块程序,谢谢
追答
ARCHITECTURE ONE OF pulsesd IS
SIGNAL A: STD_LOGIC := '0';
SIGNAL CLK11: STD_LOGIC := '0';
SIGNAL CLK21: STD_LOGIC := '0';
BEGIN

PROCESS (CLK1,CLK2)
BEGIN
IF(CLK11='0' AND CLK1='1') THEN
IF(CLK21='0' AND CLK2='1')THEN
A <= NOT A;
END IF;
END IF;

IF(CLK11='1' AND CLK1='0') THEN
IF(CLK21='1' AND CLK2='0')THEN
A <= NOT A;
END IF;
END IF;

CLK11<=CLK1;
CLK21<=CLK2;

END PROCESS;
CLK3 <= A;
END ONE;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
nereus78e904
2014-04-10 · TA获得超过1.5万个赞
知道大有可为答主
回答量:5463
采纳率:90%
帮助的人:1915万
展开全部
你试试下面这样成不成:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY pulsesd IS
PORT ( CLK1: IN STD_LOGIC;
CLK2: IN STD_LOGIC;
CLK3: OUT STD_LOGIC);
END ENTITY ;

ARCHITECTURE ONE OF pulsesd IS
SIGNAL A: STD_LOGIC := '0';
BEGIN
PROCESS (CLK1,CLK2)
BEGIN
IF RISING_EDGE(CLK1) THEN
IF CLK2='1' AND CLK2'LAST_VALUE='0' THEN
A <= NOT A;
END IF;
END IF;
END PROCESS;
CLK3 <= A;
END ONE;
更多追问追答
追问
不行,还是有问题Error (10819): Netlist error at pulsesd.vhd(22): can't infer register for A because it changes value on both rising and falling edges of the clock
追答

我刚刚用Quartus II编译了一下,通过了,没有错误提示。综合之后的RTL如下:

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式