我的VHDL学习笔记(3)

  • CASE语句,属于顺序语句,因此必须放在process中使用,用法如下:

case expression is

when choice => sequential_statements      --quential_statements 顺序语句构成,语句间用;隔开。
when choice => sequential_statements
. . .

when others=>sequential_statements)   --如果有没有被列举的情况,用此语句统一处理。

end case;

注:

1.choice 必须在expression的取值范围内;

2.when条件句中,必须覆盖expression中的所有情况,如果choice中没有覆盖expression中的所有情况,则要用others关键词,涵盖剩下的所有情况再作处理;

3.expression的每个情况只能出现一次,必须且只能选中一个情况。

  • std_logic_vector         标准逻辑矢量数据类型, 为一维数组,所以要求注明其宽度,用法如下:

例如:pout : out  std_logic_vector(7downto 0) ;  --定义了一个宽度为8位的标准逻辑矢量,每一位分别为pout(7),pout(6),pout(5)... ...pout(1),pout(0).

或者signal: std_logic_vector(1 to 4 )        --4位

其中的每一位都为std_logic类型,用于表达多通道端口或节点,或者总线BUS。类似的数据类型还有bit_vector.

  • 并置操作符,表示将操作数或数组合并起来形成新的数组,用法如下:

abc<=a&b 相当于 abc(1)<=a;abc(0)<=b.    a,b可代表操作数或者数组。

  • component         元件例化语句,用于对现有的实体定义为元件为准备调用作出声明,并配合port map()(端口映射语句)以达到连接底层元件形成更高层次电路结构,用法如下:

Simplified Syntax:

architecture architecture_name of entity_name is

component component_name [ is ]

    generic (generic_list);
    port (port_list);
end component component_name;

component component_name2 [ is ]

    generic (generic_list);
    port (port_list);
end component component_name2;

...

begin

  • port map()   端口映射语句,用于说明元件与当前设计实体中元件间及接口间的连接说明,用法如下:

port map( [被例化成元件的实体中的端口名=>]当前实体中指定的端口名,...  );  --"=>"为连接符号。

注:

当前的设计实体相当于一个高一层次的电路系统,而当前设计的实体中指定的接口相当于整个电路系统上的插座,而被例化的实体形成的元件相当于要插在这些插座上的芯片。

小数分频器是一种常见的电路,能够将输入时钟信号分频为一个小于1的分数。VHDL是硬件描述语言,可以用于设计数字电路。下面是一个小数分频器的VHDL实现。 ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Fractional_Divider is Port ( CLK_IN : in STD_LOGIC; CLK_OUT : out STD_LOGIC; EN : in STD_LOGIC; RST : in STD_LOGIC; N : in UNSIGNED(9 downto 0); D : in UNSIGNED(9 downto 0)); end Fractional_Divider; architecture Behavioral of Fractional_Divider is signal counter : UNSIGNED(9 downto 0) := (others => '0'); signal div : UNSIGNED(19 downto 0) := (others => '0'); signal clk_div : STD_LOGIC := '0'; begin process (CLK_IN, RST) begin if (RST = '1') then counter <= (others => '0'); div <= (others => '0'); clk_div <= '0'; elsif rising_edge(CLK_IN) then if (EN = '1') then counter <= counter + 1; if (counter = (D - 1)) then counter <= (others => '0'); div <= div + N; clk_div <= not clk_div; end if; end if; end if; end process; CLK_OUT <= clk_div; end Behavioral; ``` 这个小数分频器的输入是一个时钟信号`CLK_IN`,还有一个使能信号`EN`和复位信号`RST`。输出是分频后的时钟信号`CLK_OUT`。`N`和`D`分别是分子和分母,用于计算分数。 在`process`,首先根据复位信号清空计数器和除数寄存器以及分频后的时钟信号。然后在时钟上升沿触发时,如果使能信号为1,则将计数器加1。当计数器计数到D-1时,说明经过了D个时钟周期,需要对除数寄存器加上分数N,并将计数器清零。同时,分频后的时钟信号取反。 最后将分频后的时钟信号赋值给输出端口`CLK_OUT`即可。 这是一个简单的小数分频器的VHDL实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值