搜索
bottom↓
回复: 0

求助 有关数字频率计的问题

[复制链接]

出0入0汤圆

发表于 2010-4-25 21:49:16 | 显示全部楼层 |阅读模式
刚刚入门FPGA,实践做了个数字频率计,写到板子上加方波对程序测试板子没有反应,实在找不出问题出在哪了?各位高手能不能帮忙看一下哪里出错了
代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity plj is
port ( start:in std_logic;                      --复位信号
       clk :in std_logic;                      --系统时钟
       clk1:in std_logic;                      --被测信号
       yy1:out std_logic_vector(7 downto 0);     --八段码
       w1 :out std_logic_vector(3 downto 0));    --数码管位选信号
end plj;
architecture behav of PLj is
signal b1,b2,b3,b4,b5,b6,b7:std_logic_vector(3 downto 0);  --十进制计数器
signal bcd:std_logic_vector(3 downto 0);                --BCD码寄存器
signal q :integer range 0 to 4999999;                  --秒分频系数
signal qq : integer range 0 to 499999;                   --动态扫描分频系数
signal en,bclk:std_logic;                             --使能信号,有效被测信号
signal sss : std_logic_vector(3 downto 0);               --小数点
signal bcd0,bcd1,bcd2,bcd3 : std_logic_vector(3 downto 0);
--寄存7位十位计数器中有效的高4位数据
begin

second:process(clk)                     --此进程产生一个持续时间为0.1秒的的闸门信号
begin
  if start='1' then q<=0;
  elsif clk'event and clk='1' then
     if q<4999999 then q<=q+1;
     else q<=4999999;
     end if;
  end if;
  if q<4999999 and  start='0' then en<='1';
  else en<='0';
  end if;
end process;

counter:process(en,clk1)                   --得到7位十进制计数器的计数脉冲
begin
  bclk<=clk1 and en;
end process;

process(start,bclk)           --对被测信号计脉冲数
begin
  if start='1' then                             --复位
b1<="0000";b2<="0000";b3<="0000";b4<="0000";b5<="0000";b6<="0000";b7<="0000";
  elsif bclk'event and bclk='1' then  
     if b1="1001" then b1<="0000";                   --此IF语句完成个位十进制计数
        if b2="1001" then b2<="0000";                --此IF语句完成百位十进制计数
           if b3="1001" then b3<="0000";             --此IF语句完成千位十进制计数
              if b4="1001" then b4<="0000";          --此IF语句完成万位十进制计数
                 if b5="1001" THEN b5<="0000";     --此IF语句完成十万位十进制计数
                    if b6="1001" then b6<="0000";    --此IF语句完成百万位十进制计数
                       if b7="1001" then b7<="0000"; --此IF语句完成千万位十进制计数
                       else b7<=b7+1;
                       end if;
                    else b6<=b6+1;
                    end if;
                 else b5<=b5+1;
                 end if;
              else b4<=b4+1;
              end if;
           else b3<=b3+1;
           end if;
        else b2<=b2+1;
        end if;
     else b1<=b1+1;
     end if;
  end if;
  b7<=b6;b6<=b5;b5<=b4;b4<=b3;b3<=b2;b2<=b1;
end process;

process(clk) --把7位十进制计数器有效的高4位数据送如bcd0~3;并得到小数点信息
begin
  if rising_edge(clk) then
     if en='0' then
        if b7>"0000" then bcd3<=b7; bcd2<=b6; bcd1<=b5; bcd0<=b4; sss<="1110";
        elsif b6>"0000" then bcd3<=b6; bcd2<=b5; bcd1<=b4; bcd0<=b3; sss<="1101";
        elsif b5>"0000" then bcd3<=b5; bcd2<=b4; bcd1<=b3; bcd0<=b2; sss<="1011";
            else bcd3<=b4; bcd2<=b3; bcd1<=b2; bcd0<=b1; sss<="1111";
            end if;
     end if;
   end if;
end process;

weixuan:process(clk)            --完成数据的动态显示
begin
  if clk'event and clk='1' then
        if qq< 99999 then qq<=qq+1;bcd<=bcd3; w1<="0111";
               if sss="0111" then yy1(0)<='1';
                   else yy1(0)<='1';
                   end if;
        elsif qq<199999 then qq<=qq+1;bcd<=bcd2; w1<="1011";
               if sss="1011" then yy1(0)<='1';
                   else yy1(0)<='1';
                   end if;
        elsif qq<299999 then qq<=qq+1;bcd<=bcd1; w1<="1101";
               if sss="1101" then yy1(0)<='1';
               else yy1(0)<='1';
               end if;
        elsif qq<399999 then qq<=qq+1;bcd<=bcd0; w1<="1110";
           if sss="1110" then yy1(0)<='1';
           else yy1(0)<='0';
           end if;
        else  qq<=0;
        end if;
  end if;
end process;


process (bcd)               --译码
  begin
  case bcd is
      when "0000"=>yy1(7 downto 1)<="1111110";
      when "0001"=>yy1(7 downto 1)<="0110000";
      when "0010"=>yy1(7 downto 1)<="1101101";
      when "0011"=>yy1(7 downto 1)<="1111001";
      when "0100"=>yy1(7 downto 1)<="0110011";
      when "0101"=>yy1(7 downto 1)<="1011011";
      when "0110"=>yy1(7 downto 1)<="1011111";
      when "0111"=>yy1(7 downto 1)<="1110000";
      when "1000"=>yy1(7 downto 1)<="1111111";
      when "1001"=>yy1(7 downto 1)<="1111011";
      when others=>yy1(7 downto 1)<="1111111";
  end case;
end process;
end behav;

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表