求助:VHDL设计计数器的问题

sf612 2007-09-03 05:24:34
设计一个16位的计数器对CLK1计数,上位机通过STRB对当前的计数值进行锁存,CS为计数器的片选,RD为读选通,读取锁存后的计数值
在QUARTUS中仿真,结果正确,可下载到CPLD后,发现即使CLK1没有输入信号,计数器也在计数,即语句CLK1 'event AND CLK1='1'好像没有起作用,counter1<=counter1+'1';一直在运行
下面是程序,请帮我看看原因在哪,我用的型号是MAXII

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity counter is
port(
CS: in std_logic;
STROBE: in std_logic;
CLK1: in std_logic;
CLR: in std_logic;
RD: in std_logic;
DATA: out std_logic_vector(15 downto 0)
);

end counter;

architecture behavior of sixcounter is
signal counter1: std_logic_vector(15 downto 0):=x"0000"; --计数值
signal counter1_temp: std_logic_vector(15 downto 0):=x"0000"; --锁存值


begin
COUNT1: process(CS,CLR,CLK1) --计数
begin
if(CLR='0' AND CS='0') then
counter1<=x"0000";
elsif(CLK1 'event AND CLK1='1') then
if(counter1=x"FFFF") then
counter1<=x"0000";
else counter1<=counter1+'1';
end if;
end if;
end process COUNT1;


STRB: process(CS,STROBE) --锁存
begin
if(STROBE 'event AND STROBE='1') then
if(CS='0') then
counter1_temp<=counter1;
end if;
end if;
end process STRB;


READDATA: process(CS,RD) --读取
begin
if(CS='0' AND RD='0') then
DATA<=counter1_temp(15 downto 0);
else DATA<="ZZZZZZZZZZZZZZZZ";
end if;
end process READDATA;

end behavior;
...全文
491 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
清钟沁桐 2007-10-16
  • 打赏
  • 举报
回复
可下载到CPLD后,初始值无效了
Spartan2 2007-09-29
  • 打赏
  • 举报
回复
像tigerxd 说的,搂朱最好把 下面的简化下,直接用CS,RD作为三态的驱动,
READDATA: process(CS,RD) --读取
begin
if(CS= "0 " AND RD= "0 ") then
DATA <=counter1_temp(15 downto 0);
else DATA <="ZZZZZZZZZZZZZZZZ";
end if;
end process READDATA;
tigerxd 2007-09-16
  • 打赏
  • 举报
回复
感觉你的程序应该有问题,比如
READDATA: process(CS,RD) --读取
begin
if(CS='0' AND RD='0') then
DATA<=counter1_temp(15 downto 0);
else DATA<="ZZZZZZZZZZZZZZZZ";
end if;
end process READDATA;
DATA是输出引脚,但是他的敏感信号只有CS,RD,它的触发信号CLK在哪呢?所以DATA的值不会受CLK影响。
一家之言,希望对你有帮助
Great_Bug 2007-09-16
  • 打赏
  • 举报
回复
o~长见识了 这两个process该有相同的地方

STRB: process(CS,STROBE) --锁存
begin
if(STROBE 'event AND STROBE='1') then
if(CS='0') then
counter1_temp<=counter1;
end if;
end if;
end process STRB;


READDATA: process(CS,RD) --读取
begin
if(CS='0' AND RD='0') then
DATA<=counter1_temp(15 downto 0);
else DATA<="ZZZZZZZZZZZZZZZZ";
end if;
end process READDATA;

Great_Bug 2007-09-15
  • 打赏
  • 举报
回复
会不会是虚焊?
Great_Bug 2007-09-15
  • 打赏
  • 举报
回复
看起来程序没问题
Spartan2 2007-09-04
  • 打赏
  • 举报
回复
CLK1 'event AND CLK1='1' 这个语句该没有什么问题
内部逻辑要认真检查的,不是做了 SIM 就ok得,你有要求时序马
Spartan2 2007-09-04
  • 打赏
  • 举报
回复
CLK1脚一直为低电平 时钟是间隙着给的吗
sf612 2007-09-03
  • 打赏
  • 举报
回复
电路已经查过好多遍了,应该没错,CLK1脚一直为低电平,我把counter1<=counter1+'1'换成常数赋值counter1<=x"1234" 结果单片机读到的DATA就是"1234",所以才怀疑CLK1 'event AND CLK1='1'没有起作用,可仿真的结果都是正确的,太奇怪了
Spartan2 2007-09-03
  • 打赏
  • 举报
回复
“发现即使CLK1没有输入信号,计数器也在计数,”这个可能性不大,除非要干扰什么的不好说。
你不如先确认下 的脚有没有对,时钟信号是不是他,用示波器看看
而后把,counter1直接输出,看看对应位的变化 是不是计数器动作的样子

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧