先用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)是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)