VHDL中怎么把一个std_logic_vector(3 downto 0)的输入转换成整形后,把个位和十位分开,再输出。。

VHDL中怎么把一个std_logic_vector(3 downto 0)的输入转换成整形后,把个位和十位分开,再输出。。,第1张

先用std_logic_unsigned程序包或者std_logic_signed程序包中的conv_integer函数,将std_logic_vector(3 downto 0)转换成integer类型,然后将integer类型的对象(变量或者信号)分别做MOD 10和REM 10运算(取模和取余),得到的结果就是十位和个位了。如果还需要转换成std_logic_vector类型的话,再调用std_logic_arith程序包中的conv_std_logic_vector函数,分别将十位和个位转换成std_logic_vector类型。

当然,也可以自己描述一个转换模块,直接将std_logic_vector(3 downto 0)分成十位和个位的std_logic_vector(3 downto 0)类型,分别输出,会简单些。

如果是DELPHI ,我是这样理解

FOR i:= n DOWNTO 1 DO BEGIN    //  N 的倒序排列,如: 8 7 61

x:=x+1; // X自加1

FOR j:=n DOWNTO i DO  //N-1之后再倒序排列   如:8 这个其它是和上面同步的 ,

y:=y+1;  //Y自加1

END;

下图,当N=3时,输出就是这样 ,3--表示X位, 3++是Y位

这个s_1是一个数字,举个例子:x(3 downto 0),表示x宽度是4,比如x的值为“1010”,他的十进制数为10,downto的意思就是左边是高位,右边是低位

如果是x(3 to 0),则相反,右边是高位,左边是低位,x为“1010”时十进制的值为5

LIBRARY IEEE;

USE IEEESTD_LOGIC_1164ALL;

USE IEEEstd_logic_arithall;

USE IEEEstd_logic_unsignedall; ---调用常用的库

ENTITY add8b IS

PORT(

clk:IN STD_LOGIC; ---时钟信号

cin: IN STD_LOGIC; ---相加进位信号

a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-----两个8位的二进制数

s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ----输出

cout:OUT STD_LOGIC);

END;

ARCHITECTURE cheng OF add8b IS

SIGNAL adda1,adda2,addb1,addb2,reg1a,reg1b,add1,add2:STD_LOGIC_VECTOR(4 DOWNTO 0);

SIGNAL reg2:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL cin1:STD_LOGIC;

BEGIN

PROCESS(clk)

BEGIN

IF clk'EVENT AND clk='1' THEN

adda1<='0'&a(3 DOWNTO 0); ----adda1是a的低4位

addb1<='0'&b(3 DOWNTO 0);-----addb1是b的低4位

adda2<='0'&a(7 DOWNTO 4);------adda2是a的高4位

addb2<='0'&b(7 DOWNTO 4);------addb2是b的高4位

cin1<=cin;

END IF;

END PROCESS;

PROCESS(CLK)

BEGIN

IF clk'EVENT AND clk='1' THEN

add1<=adda1+addb1+cin1; ---低4位相加放入add1 注意考虑是否有进位

reg1a<=adda2;

reg1b<=addb2;

END IF;

END PROCESS;

PROCESS(CLK)

BEGIN

IF clk'EVENT AND clk='1' THEN----高4位相加,考虑低4位相加的进位

add2<=reg1a+reg1b+add1(4);

reg2<=add1(3 DOWNTO 0);

END IF;

END PROCESS;

s<=add2(3 DOWNTO 0)&add1(3 DOWNTO 0);----结果是高四位与低四位并置

cout<=add2(4); ---是否有进位

END cheng ;

第二个 只需要搞清 二进制数的乘法原理就可以了 两个4位二进制数相乘,如a=1010,b=1111 那么可以看成是1010(1000+0100+0010+0001),结果等于 将1010左移三位加上1010左移两位,加上1010左移1位加上1010不移位

就是结果

y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000");

第一个是不移动 第二个是b低二位与a相乘左移1位 第三是b低3位 与a相乘左移两位,第四是b最高位与a相乘左移三位 结果相加

library ieee;

use ieeestd_logic_1164all;

entity paoma is

port(clk,reset:in std_logic;

output:out std_logic_vector(7 downto 0));

end entity;

architecture art of paoma is

begin

process(clk,reset)

variable data:std_logic_vector(7 downto 0);

begin

if reset='1' then

data:="00000000";

elsif clk'event and clk='1' then

if data="00000000" then

data:="00000001";

else data:=data(6 downto 0)&data(7);--右到左

(data:=data(0)&data(7 downto 1);)--左到右

end if;

end if;

output<=data;

end process;

end art;

library ieee;

use ieeestd_logic_1164all;

entity paoma is

port(clk,reset:in std_logic;

output:out std_logic_vector(7 downto 0));

end entity;

architecture art of paoma is

begin

process(clk,reset)

variable data:std_logic_vector(7 downto 0);

begin

if reset='1' then

data:="00000000";

elsif clk'event and clk='1' then

if data="00000000" then

data:="00011000" ;中间到两边

(data:="10000001";)-两边到中间

else

data:="data(6 downto 4)&data(7)&data(0)&data(3 downto 0);-从中间到两边

(data:="data(4)&data(7 downto 5)&data(2 downto 0)&data(3);)从两边到中间

end if;

end fi;

output<=data;

end process;

end art;

语句声明,表示xx有第0位和第1位,即两位二进制位宽的变量。

downto 即从高位到低位,to是从低位到高位。

举个例子:

variable STS_BIT: bit_vector (7 downto 0);

The example defines a bit vector or 8 elements: STS_BIT(7), STS_BIT(6),… STS_BIT(0)

以上就是关于VHDL中怎么把一个std_logic_vector(3 downto 0)的输入转换成整形后,把个位和十位分开,再输出。。全部的内容,包括:VHDL中怎么把一个std_logic_vector(3 downto 0)的输入转换成整形后,把个位和十位分开,再输出。。、计算机语句执行频度 FOR i:= n DOWNTO 1 DO {语句1}、eda语言:(s_1 downto 0)是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9732027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存