搜索
bottom↓
回复: 7

VHDL的程序求助

[复制链接]

出0入0汤圆

发表于 2012-10-18 09:45:12 | 显示全部楼层 |阅读模式
最近编了个很简单的滤波程序,但是在ModelSim仿真时出现了一点问题,希望大神们快快现身,帮小弟解决这个困扰了好长时间的问题,特此把程序和仿真结果附上。
--****************************************************************************
--此程序为滤波源程序。通过计数输入脉冲的宽度,来滤除杂散窄脉冲。并将滤波后的脉冲输出,双边沿滤波。滤除高低电平杂波宽度范围不同
--****************************************************************************
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity filter_unbalance is
        port(        delayu,u,clku: in std_logic;        --delayu复位信号,clku为时钟信号,u为输入待滤波信号
                        fu:                out std_logic);
end entity;
architecture behav of filter_unbalance is
             constant N1:integer:=50;
             constant N2:integer:=120;
             signal countu1: integer range 0 to N1+1;
             signal countu2: integer range 0 to N2+1;
                  signal fu1:std_logic;
begin
        process(delayu,u,clku)
                begin
                        if(delayu ='0')then
                                countu1<=0;
                                countu2<=0;
                                fu1<='0';
                        elsif(clku'event and clku='1') then
                                    if(u ='0' and countu2<=N2)then
                                                countu1<=0;
                                                countu2<=countu2+1;       
                                         elsif(u ='1' and countu1<=N1)then         
                                                countu2<=0;
                                                countu1<=countu1+1;
                                         else
                                           null;
                                        end if;               
                                        if(countu2 >= N2)then
                                                fu1<='0';                                                 --当输入低电平宽度大于或等于N2个时钟周期时输出低电平
                                        end if;
                                        if(countu1 >= N1)then
                                                fu1<='1';                   --当输入高电平宽度大于或等于N1个时钟周期时输出高电平
                                        end if;
                                end if;
                end process;
                fu<=fu1;
        end behav;
--****************************************************************************

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-18 11:02:28 | 显示全部楼层
if(countu2 >= N2)then
      fu1<='0';                                                 --当输入低电平宽度大于或等于N2个时钟周期时输出低电平
  end if;
  if(countu1 >= N1)then
      fu1<='1';                   --当输入高电平宽度大于或等于N1个时钟周期时输出高电平
   end if;
上面count1 count2两个独立,会存在fu1无所适从

出0入0汤圆

 楼主| 发表于 2012-10-18 11:49:10 | 显示全部楼层
NJ8888 发表于 2012-10-18 11:02
if(countu2 >= N2)then
      fu1= N1)then
      fu1

  if(u ='0' and countu2<=N2)then
      countu1<=0;
      countu2<=countu2+1;        
  elsif(u ='1' and countu1<=N1)then         
      countu2<=0;
      countu1<=countu1+1;
上面这段程序不算把它们关联起来么,如果不算的话,还请您明示,请问如何才能把它们关联起来呢

出0入0汤圆

发表于 2012-10-18 12:27:07 | 显示全部楼层
本帖最后由 sky5566 于 2012-10-18 12:30 编辑

你程序有問題,不能同時對 fu1 下達 2 個寫入狀態

fu1 <= '1' when countu1>=N1 else
           '0' when countu2>=N2 else 'x';<-----學好 vhdl.....

你的觀念還停留在 c++

出0入0汤圆

 楼主| 发表于 2012-10-18 16:41:04 | 显示全部楼层
sky5566 发表于 2012-10-18 12:27
你程序有問題,不能同時對 fu1 下達 2 個寫入狀態

fu1 =N1 else

when 后面是赋值语句,不是判断语句啊,所以还是不行…

出0入0汤圆

 楼主| 发表于 2012-10-18 17:03:13 | 显示全部楼层
sky5566 发表于 2012-10-18 12:27
你程序有問題,不能同時對 fu1 下達 2 個寫入狀態

fu1 =N1 else

不好意思,我把它放在进程里面,所以没法调试成,当我把这句话放在进程外面的话,输出结果还是有一小段未知的情况

出0入0汤圆

发表于 2012-10-18 19:07:40 | 显示全部楼层
本帖最后由 sky5566 于 2012-10-19 01:06 编辑

當然要放在 process 外,因為 else 會引起 if誤判.
你有 4 個狀態,但是卻只輸出 2 個狀態,其他狀態你要怎麼處理fu1?

countu1>=N1(最高優先)
countu2>=N2
countu1<N1
countu2<N2

一般我會這樣規劃

f1 <= '0' when NN ="1111111100000000" else
         '1' when NN ="0000000011111111" else
         '0' when NN ="0000000000000000" else
         '1' whne NN ="1111111111111111" else  f1;

NN的值,使用移位bit方式進入........

你可以參考 ps2 解碼程序方式

出0入0汤圆

 楼主| 发表于 2012-10-18 21:14:21 | 显示全部楼层
sky5566 发表于 2012-10-18 19:07
當然要放在 process 外,因為 else 會引起 if誤判.
你有 4 個狀態,但是卻只輸出 2 個狀態,其他狀 ...

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

本版积分规则

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

GMT+8, 2024-7-24 09:29

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

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