关于移位指令在VHDL中运用的
在潘松出版的《vhdl实用教程》中所表述的移位指令是通过调用numeric_std,signed或者是unsigned库来实现的,在库中会有一个SLL,SRL之类的移位指令,但是在VIVADO实际操作中却用不了。
btw:Numeric_std用的时候会比后面两者加一个arith库更好一些:std_logic_arith、std_logic_unsigned、std_logic_signed的问题在于当在同一文件中同时使用signed和unsigned时,会出现函数重载的冲突,导致错误(网络经验)。但是用的时候并不是这样,当使用的时候如果只用numeric_std的话在加减法乘法上报错如下图所示,但是用里unsigned或者signed库就不会有了:
网上大多给出的方案是使用shift_left()和shift_right()两个函数进行替代(iman也这么说)但是有一个问题是这个不能循环移位,于是目前对程序来说是在process里进行位的替换,ALU代码如下所示(注意数据的更新是在process完成之后):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity ALU_file is
Port ( a : in STD_LOGIC_VECTOR (7 downto 0);
b : in STD_LOGIC_VECTOR (7 downto 0);
s : in STD_LOGIC_VECTOR (3 downto 0);
cin : in STD_LOGIC;
o : out STD_LOGIC_VECTOR (7 downto 0));
end ALU_file;
architecture Behavioral of ALU_file is
signal a4,b4 : STD_LOGIC_VECTOR (3 downto 0);
signal o_s : STD_LOGIC_VECTOR (7 downto 0):="00000000";
begin
a4<=a(3)&a(2)&a(1)&a(0);
b4<=b(3)&b(2)&b(1)&b(0);
process(a,b,s,cin)
begin
if(s="0000")then
o_s<=a+b+cin;--add
elsif(s="0001")then
o_s<=a-b;--sub
elsif(s="0010")then
o_s<=a4*b4;--mul
elsif(s="0011")then
o_s<=a and b;--and
elsif(s="0100")then
o_s<=a or b;--or
elsif(s="0101")then
o_s<=a xor b;--xor
elsif(s="0110")then--shift left
o_s(7)<='0';o_s(6)<=a(7);o_s(5)<=a(6);o_s(4)<=a(5);
o_s(3)<=a(4);o_s(2)<=a(3);o_s(1)<=a(2);o_s(0)<=a(1);
elsif(s="0111")then--shift right
o_s(0)<='0';o_s(1)<=a(0);o_s(2)<=a(1);o_s(3)<=a(2);
o_s(4)<=a(3);o_s(5)<=a(4);o_s(6)<=a(5);o_s(7)<=a(6);
elsif(s="1000")then
o_s(7)<=a(0);o_s(6)<=a(7);o_s(5)<=a(6);o_s(4)<=a(5);
o_s(3)<=a(4);o_s(2)<=a(3);o_s(1)<=a(2);o_s(0)<=a(1);
elsif(s="1001")then
o_s(0)<=a(7);o_s(1)<=a(0);o_s(2)<=a(1);o_s(3)<=a(2);
o_s(4)<=a(3);o_s(5)<=a(4);o_s(6)<=a(5);o_s(7)<=a(6);
end if;
end process;
o<=o_s;
end Behavioral;
关于script的理解
有一个很重要的脚本语言需要知道——TCL脚本语言,这个脚本语言是可以在terminal中运行的,可以直接在terminal中打开可用于批量的综合和仿真。目前还不知道是否有terminal可以将脚本作为文本Print出来。但是在综合器的程序中有一个command.log文件,这个文件记录了很多关于用户使用的命令记录,以及在sim文件夹中也发现了一个类似的文件。
用command的时候如果记不得文件夹名字,直接复制粘贴可以防止在cp到指定路径时由于粗心导致的路径出错。