学习日志之VHDL(3)——细节扫盲

关于移位指令在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到指定路径时由于粗心导致的路径出错。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值