40130064 发表于 2010-7-23 11:04:35

求教一个VHDL算法问题

X:已知的整数.

n:X转换成二进制的最小位数n.

求Z:Z=2的n次方.

如X=10(十进制), 转换成二进制"1010"最小4位       Z=2的4次方 =8.
X=100(十进制), , 转换成二进制"1100100"最小7位   Z=2的7次方 =128.

有空的朋友帮想想,谢谢.

40130064 发表于 2010-7-23 11:09:47

我暂用的方法是判断X大小选取Z的值,没算

NJ8888 发表于 2010-7-23 11:45:16

把数据送进去,比如16位,从最高位查到为'1'就是对应的数据16-k位

40130064 发表于 2010-7-23 12:20:33

3KU
再或上K位1 应该可行 我试试

281229961 发表于 2010-7-23 12:51:28

等待结果

40130064 发表于 2010-7-23 13:41:36

http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570201.jpg
(原文件名:20100723132733687.jpg)

http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570202.jpg
(原文件名:20100723132748765.jpg)

正在调这个DDA两轴直线插补模块原型 开源给你们参考 你们调好了的话发个给我!哈   我发的这个暂时不能用

这电路由于输出信号延时会产生多毛刺 看仿真波形,用D触发器将CLK延时的话能消.期待更好的方法.

其中m就是一楼我要的Z值 m一个和积分有关的数,能改变整个周期,就是XY进给速度和m有关.



library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity DDA is
--generic (n : natural := 32);
port (
Xe            : in STD_LOGIC_VECTOR (31 DOWNTO 0);
Ye            : in STD_LOGIC_VECTOR (31 DOWNTO 0);
n            : in STD_LOGIC_VECTOR (31 DOWNTO 0);
Clock,rest    : in std_logic;
Xout          : out std_logic;
Yout          : out std_logic);

end entity DDA;

architecture maxcpld of DDA is
SIGNAL Jrx : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL Jry : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL Jvx : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL Jvy : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL m   : STD_LOGIC_VECTOR (31 DOWNTO 0);   
SIGNAL c   : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL d   :std_logic;
begin

process (Clock,rest) is
begin
if(rest='1')then
Jrx <= "00000000000000000000000000000000";
Jry <= "00000000000000000000000000000000";
m <= n;
Jvx <= Xe;
Jvy <= Ye;
d <='0';
elsif rising_edge(Clock) then
   
        if (c/=m)then
          c<=c+1;
          
                if((jvx+jrx)>=m )then
                jrx<=jvx+jrx-m;
                       
                        Xout<='1';
               
                else
                jrx<=jvx+jrx;
                Xout<='0';
                end if;
       
                if((jvy+jry)>=m )then
                jry<=jvy+jry-m;
               
                        Yout<='1';
               
               
                else
                jry<=jvy+jry;
                Yout<='0';
                end if;
        else
        Yout<='0';
        Xout<='0';
        end if;
end if;
endprocess;

end maxcpld;



http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570245.jpg
D (原文件名:1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570246.jpg
m (原文件名:2.jpg)

http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570247.jpg
m (原文件名:3.jpg)

281229961 发表于 2010-7-23 13:48:31

毛刺好像都在CLOCK上升沿产生的呀
大哥帮我看看我这个问题吧?http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4167686&bbs_page_no=1&bbs_id=9999

NJ8888 发表于 2010-7-23 16:00:52

回复【5楼】40130064

(原文件名:20100723132733687.jpg)
引用图片


(原文件名:20100723132748765.jpg)
<center><a class=tt16 onclick="fnquickimagequote(this,'files_31/ourdev_570202.jpg','原文件名:20100723132748......
-----------------------------------------------------------------------

你用一个相位与CLK相差90度的时钟打一下XP YP就没有毛刺了,如果宽度有要求,再用180度时钟复位它

zzsoft 发表于 2010-7-23 18:45:09

如果只是 要 找

X:已知的整数 (应该是无符号整数吧).

n:X转换成二进制的最小位数n.

求Z:Z=2的n次方.

用 for 要好一些。

ps : 2 4 次方 为 16, 你搞错了

-----------------------------------

z : out std_logic_vector(0 to 32);

x : in std_logic_vector(0 to 31);

process(x)
variable z_tmp : std_logic_vector( 0 to 32 );
begin
   
z_tmp := (others =>'0');

for i in 0 to 31 loop
    if ( x(i) = '1' ) then
      z_tmp(i) := '1';
      exit;
    end if;
end loop;
   
z <= z_tmp;

end process;

40130064 发表于 2010-7-23 19:24:56

nice
应该是最好方法了

honsimark 发表于 2010-8-17 22:58:19

2楼的方法不错

semonpic 发表于 2010-8-18 02:43:11

DDA插补有意思的就是速度的控制。有适量合成速度换算成 主轴的插补速度。有空我也来研究研究。
页: [1]
查看完整版本: 求教一个VHDL算法问题