EDA技术 实用教程
第 9章
VHDL基本语句
KX
康芯科技
9.1 顺序语句
9.1.1 赋值语句
9.1.2 IF 语句
信号赋值语句 变量赋值语句
赋值目标 赋值符号 赋值源
KX
康芯科技
9.1 顺序语句
9.1.3 CASE语句
CASE语句的结构如下:
CASE 表达式 IS
When 选择值 => 顺序语句;
When 选择值 => 顺序语句;
...
END CASE ;
多条件选择值的一般表达式为:
选择值 [ |选择值 ]
选择值可以有四种不同的表达方式:
单个普通数值, 如 6。
数值选择范围,如 (2 TO 4),表示取值
为 2,3或 4。
并列数值,如 3?5,表示取值为 3或者 5。
混合方式, 以上三种方式的混合 。
KX
康芯科技
【 例 9-1】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux41 IS
PORT (s4,s3,s2,s1, IN STD_LOGIC;
z4,z3,z2,z1, OUT STD_LOGIC);
END mux41;
ARCHITECTURE activ OF mux41 IS
SIGNAL sel, INTEGER RANGE 0 TO 15;
BEGIN
PROCESS (sel, s4,s3,s2,s1 )
BEGIN
sel<= 0 ; -- 输入初始值
IF (s1 ='1') THEN sel <= sel+1 ;
ELSIF (s2 ='1') THEN sel <= sel+2 ;
ELSIF (s3 ='1') THEN sel <= sel+4 ;
ELSIF (s4 ='1') THEN sel <= sel+8 ;
ELSE NULL; -- 注意,这里使用了空操作语句
END IF ;
z1<='0' ; z2<='0'; z3<='0'; z4<='0'; --输入初始值
CASE sel IS
WHEN 0 => z1<='1' ; -- 当 sel=0时选中
接下页
KX
康芯科技
WHEN 1?3 => z2<='1' ; -- 当 sel为 1或 3时选中
WHEN 4 To 7?2 => z3<='1'; -- 当 sel为 2,4,5,6或 7时选中
WHEN OTHERS => z4<='1' ; -- 当 sel为 8~ 15中任一值时选中
END CASE ;
END PROCESS ;
END activ ;
【 例 9-2】
SIGNAL value, INTEGER RANGE 0 TO 15;
SIGNAL out1, STD_LOGIC ;
...
CASE value IS -- 缺少以 WHEN引导的条件句
END CASE;
...
CASE value IS
WHEN 0 => out1<= '1' ; -- value2~ 15的值未包括进去
WHEN 1 => out1<= '0' ;
END CASE
...
CASE value IS
WHEN 0 TO 10 => out1<= '1'; -- 选择值中 5~ 10的值有重叠
WHEN 5 TO 15 => out1<= '0';
END CASE;
KX
康芯科技
【 例 9-3】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY alu IS
PORT( a,b, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
opcode,IN STD_LOGIC_VECTOR (1 DOWNTO 0);
result,OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END alu;
ARCHITECTURE behave OF alu IS
CONSTANT plus, STD_LOGIC_VECTOR (1 DOWNTO 0),= b"00";
CONSTANT minus, STD_LOGIC_VECTOR (1 DOWNTO 0),= b"01";
CONSTANT equal, STD_LOGIC_VECTOR (1 DOWNTO 0),= b"10";
CONSTANT not_equal,STD_LOGIC_VECTOR (1 DOWNTO 0),= b"11";
BEGIN
PROCESS (opcode,a,b)
BEGIN
CASE opcode IS
WHEN plus => result <= a + b; -- a,b相加
WHEN minus => result <= a - b; -- a,b相减
WHEN equal => -- a,b相等
接下页
KX
康芯科技
IF (a = b) THEN result <= x"01";
ELSE result <= x"00";
END IF;
WHEN not_equal => -- a,b不相等
IF (a /= b) THEN result <= x"01";
ELSE result <= x"00";
END IF;
END CASE;
END PROCESS;
END behave;
接上页
KX
康芯科技
9.1.4 LOOP语句
( 1) 单个 LOOP语句, 其语法格式如下:
[ LOOP标号,] LOOP
顺序语句
END LOOP [ LOOP标号 ];
( 2) FOR_LOOP语句, 语法格式如下:
[LOOP标号,] FOR 循环变量, IN 循环次数范围 LOOP
顺序语句
END LOOP [LOOP标号 ];
用法示例如下:
...
L2, LOOP
a,= a+1;
EXIT L2 WHEN a >10 ; -- 当 a大于 10时跳出循环
END LOOP L2;
...
KX
康芯科技【 例 9-4】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY p_check IS
PORT ( a, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
y, OUT STD_LOGIC );
END p_check;
ARCHITECTURE opt OF p_check IS
SIGNAL tmp, STD_LOGIC ;
BEGIN
PROCESS(a)
BEGIN
tmp <='0';
FOR n IN 0 TO 7 LOOP
tmp <= tmp XOR a(n);
END LOOP ;
y <= tmp;
END PROCESS;
END opt;
KX
康芯科技
【 例 9-5】
SIGNAL a,b,c, STD_LOGIC_VECTOR (1 TO 3);
...
FOR n IN 1 To 3 LOOP
a(n) <= b(n) AND c(n);
END LOOP;
此段程序等效于顺序执行以下三个信号赋值操作:
a(1)<=b(1) AND c(1);
a(2)<=b(2) AND c(2);
a(3)<=b(3) AND c(3);
KX
康芯科技
9.1.5 NEXT语句
NEXT; -- 第一种语句格式
NEXT LOOP标号; -- 第二种语句格式
NEXT LOOP标号 WHEN条件表达式; -- 第三种语句格式
【 例 9-6】
...
L1, FOR cnt_value IN 1 TO 8
LOOP
s1:a(cnt_value),= '0';
NEXT WHEN (b=c);
s2:a(cnt_value + 8 ):= '0';
END LOOP L1;
【 例 9-7】
...
L_x,FOR cnt_value IN 1
TO 8 LOOP
s1,a(cnt_value):= '0';
k,= 0;
L_y,LOOP
s2,b(k),= '0';
NEXT L_x WHEN
(e>f);
s3,b(k+8),= '0';
k,= k+1;
NEXT LOOP L_y ;
NEXT LOOP L_x ;
...
KX
康芯科技
9.1.6 EXIT语句
EXIT; -- 第一种语句格式
EXIT LOOP标号; -- 第二种语句格式
EXIT LOOP标号 WHEN条件表达式; -- 第三种语句格式
【 例 9-8】
SIGNAL a,b, STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL a_less_then_b, Boolean;
...
a_less_then_b <= FALSE ; -- 设初始值
FOR i IN 1 DOWNTO 0 LOOP
IF (a(i)='1' AND b(i)='0') THEN
a_less_then_b <= FALSE ; -- a > b
EXIT ;
ELSIF (a(i)='0' AND b(i)='1') THEN
a_less_then_b <= TRUE ; -- a < b
EXIT;
ELSE NULL;
END IF;
END LOOP; -- 当 i=1时返回 LOOP语句继续比较
KX
康芯科技
9.1.7 WAIT语句
WAIT; -- 第一种语句格式
WAIT ON 信号表; -- 第二种语句格式
WAIT UNTIL 条件表达式; -- 第三种语句格式
WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句
【 例 9-9】
SIGNAL s1,s2, STD_LOGIC;
...
PROCESS
BEGIN
...
WAIT ON s1,s2 ;
END PROCESS ;
【 例 9-10】
(a) WAIT_UNTIL结构 (b) WAIT_ON结构
..,LOOP
Wait until enable ='1'; Wait on enable;
..,EXIT WHEN enable ='1';
END LOOP;
KX
康芯科技
9.1.7 WAIT语句
一般地, 只有 WAIT_UNTIL格式的等待语句可以被综合器接受 (其余语
句格式只能在 VHDL仿真器中使用 ), WAIT_UNTIL语句有以下三种表达
方式:
WAIT UNTIL 信号 =Value ; -- (1)
WAIT UNTIL 信号 ’ EVENT AND 信号 =Value; -- (2)
WAIT UNTIL NOT 信号 ’ STABLE AND 信号 =Value; -- (3)
如果设 clock为时钟信号输入端, 以下四条 WAIT语句所设的进程启动条
件都是时钟上跳沿, 所以它们对应的硬件结构是一样的:
WAIT UNTIL clock ='1';
WAIT UNTIL rising_edge(clock) ;
WAIT UNTIL NOT clock’STABLE AND clock ='1';
WAIT UNTIL clock ='1' AND clock’EVENT;
KX
康芯科技【 例 9-11】
...
PROCESS
BEGIN
WAIT UNTIL clk ='1';
ave <= a;
WAIT UNTIL clk ='1';
ave <= ave + a;
WAIT UNTIL clk ='1';
ave <= ave + a;
WAIT UNTIL clk ='1';
ave <= (ave + a)/4 ;
END PROCESS ;
【 例 9-12】
PROCESS
BEGIN
rst_loop, LOOP
WAIT UNTIL clock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop WHEN (rst='1'); -- 检测复位信号 rst
x <= a ; -- 无复位信号,执行赋值操作
WAIT UNTIL clock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop When (rst='1'); -- 检测复位信号 rst
y <= b ; -- 无复位信号,执行赋值操作
END LOOP rst_loop ;
END PROCESS;
KX
康芯科技【 例 9-13】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shifter IS
PORT ( data, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
shift_left,IN STD_LOGIC;
shift_right,IN STD_LOGIC;
clk,IN STD_LOGIC;
reset, IN STD_LOGIC;
mode, IN STD_LOGIC_VECTOR (1 DOWNTO 0);
qout, BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0) );
END shifter;
ARCHITECTURE behave OF shifter IS
SIGNAL enable,STD_LOGIC;
BEGIN
PROCESS
BEGIN
WAIT UNTIL (RISING_EDGE(clk) ); --等待时钟上升沿
IF (reset = '1') THEN qout <= "00000000";
ELSE CASE mode IS
WHEN "01" => qout<=shift_right & qout(7 DOWNTO 1);--右移
WHEN "10" => qout<=qout(6 DOWNTO 0) & shift_left; --左移
WHEN "11" => qout <= data; -- 并行加载
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS;
END behave;
KX
康芯科技
9.1.8 子程序调用语句
调用过程的语句格式如下:
过程名 [([形参名 => ]实参表达式
{, [形参名 => ]实参表达式 }) ];
1、过程调用
一个过程的调用将分别完成以下三个步骤:
( 1)将 IN和 INOUT模式的实参值赋给欲调 用的过程中与它们对应的形参;
( 2)执行这个过程;
( 3)将过程中 IN和 INOUT模式的形参值返回给对应的实参。
KX
康芯科技【 例 9-14】
PACKAGE data_types IS -- 定义程序包
SUBTYPE data_element IS INTEGER RANGE 0 TO 3 ; -- 定义数据类型
TYPE data_array IS ARRAY (1 TO 3) OF data_element;
END data_types;
USE WORK.data_types.ALL; --打开以上建立在当前工作库的程序包 data_types
ENTITY sort IS
PORT ( in_array, IN data_array ;
out_array, OUT data_array);
END sort;
ARCHITECTURE exmp OF sort IS
BEGIN
PROCESS (in_array) -- 进程开始,设 data_types为敏感信号
PROCEDURE swap(data, INOUT data_array;
-- swap的形参名为 data,low,high
low,high, IN INTEGER ) IS
VARIABLE temp, data_element ;
BEGIN -- 开始描述本过程的逻辑功能
IF (data(low) > data(high)) THEN -- 检测数据
temp,= data(low) ;
data(low),= data(high);
data(high),= temp ;
END IF ;
END swap ; -- 过程 swap定义结束
VARIABLE my_array, data_array ; -- 在本进程中定义变量 my_array
接下页
KX
康芯科技
BEGIN -- 进程开始
my_array,= in_array ; -- 将输入值读入变量
swap(my_array,1,2);
-- my_array,1,2是对应于 data,low,high的实参
swap(my_array,2,3); -- 位置关联法调用,第 2、第 3元素交换
swap(my_array,1,2); -- 位置关联法调用,第 1、第 2元素再次交换
out_array <= my_array ;
END Process ;
END exmp ;
接上页
【例 9-15】
ENTITY sort4 is
GENERIC (top, INTEGER,=3);
PORT (a,b,c,d, IN BIT_VECTOR (0 TO top);
ra,rb,rc,rd, OUT BIT_VECTOR (0 TO top));
END sort4;
ARCHITECTURE muxes OF sort4 IS
PROCEDURE sort2(x,y, INOUT BIT_VECTOR (0 TO top)) is
VARIABLE tmp, BIT_VECTOR (0 TO top);
接下页
KX
康芯科技接上页
BEGIN
IF x > y THEN tmp,= x; x,= y; y,= tmp;
END IF;
END sort2;
BEGIN
PROCESS (a,b,c,d)
VARIABLE va,vb,vc,vd, BIT_VECTOR(0 TO top);
BEGIN
va,= a; vb,= b; vc,= c; vd,= d;
sort2(va,vc);
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
ra <= va; rb <= vb; rc <= vc; rd <= vd;
END PROCESS;
END muxes;
2、函数调用
函数调用与过程调用是十分相似的,不同之处是,调用函数将返还
一个指定数据类型的值,函数的参量只能是输入值。
KX
康芯科技
9.1.9 返回语句 (RETURN)
RETURN; -- 第一种语句格式
RETURN 表达式; -- 第二种语句格式
【 例 9-16】
PROCEDURE rs (SIGNAL s,r, IN STD_LOGIC ;
SIGNAL q,nq, INOUT STD_LOGIC) IS
BEGIN
IF ( s ='1' AND r ='1') THEN
REPORT "Forbidden state, s and r are quual to '1'";
RETURN ;
ELSE
q <= s AND nq AFTER 5 ns ;
nq <= s AND q AFTER 5 ns ;
END IF ;
END PROCEDURE rs ;
【 例 9-17】
FUNCTION opt (a,b,opr,STD_LOGIC) RETURN STD_LOGIC IS
BEGIN
IF (opr ='1') THEN RETURN (a AND b);
ELSE RETURN (a OR b) ;
END IF ;
END FUNCTION opt ;
KX
康芯科技
9.1.10 空操作语句 (NULL)
空操作语句的语句格式如下:
NULL;
在下例的 CASE语句中, NULL用于排除一些不用的条件 。
CASE Opcode IS
WHEN "001" => tmp,= rega AND regb ;
WHEN "101" => tmp,= rega OR regb ;
WHEN "110" => tmp,= NOT rega ;
WHEN OTHERS => NULL ;
END CASE ;
WHEN OTHERS => tmp,= rega ;
KX
康芯科技
9.2 VHDL并行语句
结构体中的并行语句主要有七种:
1,并行信号赋值语句 ( Concurrent Signal Assignments) 。
2、进程语句 (Process Statements)。
3、块语句 (Block Statements)。
4、条件信号赋值语句 (Selected Signal Assignments)。
5、元件例化语句 (Component Instantiations),其中包括类属配置语句。
6、生成语句 (Generate Statements)。
7,并行过程调用语句 (Concurrent Procedure Calls)。
ARCHITECTURE 结构体名 OF 实体名 IS
说明语句
BEGIN
并行语句
END ARCHITECTURE 结构体名
KX
康芯科技
9.2.1 并行信号赋值语句
1,简单信号赋值语句
赋值目标 ?= 表达式
以下结构体中的五条信号赋值语句的 执行是并行发生的 。
ARCHITECTURE curt OF bc1 IS
SIGNAL s1,e,f,g,h, STD_LOGIC ;
BEGIN
output1 <= a AND b ;
output2 <= c + d ;
g <= e OR f ;
h <= e XOR f ;
s1 <= g ;
END ARCHITECTURE curt;
KX
康芯科技
2,条件信号赋值语句
赋值目标 <= 表达式 WHEN 赋值条件 ELSE
表达式 WHEN 赋值条件 ELSE
...
表达式 ;
9.2.1 并行信号赋值语句
KX
康芯科技图 9-1 例 9-18的逻辑电路图
【 例 9-18】
ENTITY mux IS
PORT ( a,b,c, IN BIT ;
p1,p2, IN BIT ;
z, OUT BIT );
END;
ARCHITECTURE behv OF mux IS
BEGIN
z <= a WHEN p1 = '1' ELSE
b WHEN p2 = '1' ELSE
c ;
END;
KX
康芯科技
3,选择信号赋值语句
WITH 选择表达式 SELECT
赋值目标信号 <=表达式 WHEN 选择值
表达式 WHEN 选择值
...
表达式 WHEN 选择值;
9.2.1 并行信号赋值语句
KX
康芯科技【 例 9-19】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY decoder IS
PORT ( a,b,c, IN STD_LOGIC;
data1,data2, IN STD_LOGIC;
dataout, OUT STD_LOGIC );
END decoder;
ARCHITECTURE concunt OF decoder IS
SIGNAL instruction, STD_LOGIC_VECTOR(2 DOWNTO 0) ;
BEGIN
instruction <= c & b & a ;
WITH instruction SELECT
dataout <= data1 AND data2 WHEN "000",
data1 OR data2 WHEN "001",
data1 NAND data2 WHEN "010",
data1 NOR data2 WHEN "011",
data1 XOR data2 WHEN "100",
data1 XNOR data2 WHEN "101",
'Z' WHEN OTHERS ;
END concunt ;
KX
康芯科技
3,选择信号赋值语句
...
WITH selt SELECT
muxout <= a WHEN 0|1,-- 0或 1
b WHEN 2 TO 5,-- 2或 3,或 4或 5
c WHEN 6,
d WHEN 7,
'Z' WHEN OTHERS ;
...
9.2.1 并行信号赋值语句
下例是一个列出选择条件为不同取值范围的 4选 1多路选择
器,当不满足条件时,输出呈高阻态。
KX
康芯科技
9.2.2 块语句结构( BLOCK)
块标号, BLOCK [( 块保护表达式 ) ]
接口说明
类属说明
BEGIN
并行语句
END BLOCK 块标号 ;
9.2 VHDL并行语句
KX
康芯科技【 例 9-20】
...
ENTITY gat IS
GENERIC(l_time, TIME ; s_time, TIME ) ; -- 类属说明
PORT (b1,b2,b3, INOUT BIT) ; -- 结构体全局端口定义
END ENTITY gat ;
ARCHITECTURE func OF gat IS
SIGNAL a1, BIT ; -- 结构体全局信号 a1定义
BEGIN
Blk1, BLOCK -- 块定义,块标号名是
blk1
GENERIC (gb1,gb2, Time) ; -- 定义块中的局部类属参量
GENERIC MAP (gb1 => l_time,gb2 => s_time) ; -- 局部端口
参量设定
PORT (pb, IN BIT; pb2, INOUT BIT ); -- 块结构中局部端
口定义
PORT MAP (pb1 => b1,pb2 => a1 ) ; -- 块结构端口连接说明
CONSTANT delay, Time,= 1 ms ; -- 局部常数定义
SIGNAL s1, BIT ; -- 局部信号定义
BEGIN
s1 <= pb1 AFTER delay ;
pb2 <= s1 AFTER gb1,b1 AFTER gb2 ;
END BLOCK blk1 ;
END ARCHITECTURE func ;
KX
康芯科技
【 例 9-21】
...
b1, BLOCK
SIGNAL s1,BIT ;
BEGIN
S1 <= a AND b ;
b2, BLOCK
SIGNAL s2,BIT ;
BEGIN
s2 <= c AND d ;
b3, BLOCK
BEGIN
Z <= s2 ;
END BLOCK b3 ;
END BLOCK b2 ;
y <= s1 ;
END BLOCK b1 ;
...
KX
康芯科技
9.2.3 并行过程调用语句
过程名(关联参量名) ;
【 例 9-22】
...
PROCEDURE adder(SIGNAL a,b,IN STD_LOGIC ; --过程名为 adder
SIGNAL sum, OUT STD_LOGIC );
...
adder(a1,b1,sum1) ; -- 并行过程调用
..,-- 在此,a1,b1,sum1即为分别对应于 a,b,sum的关联参量名
PROCESS( c1,c2) ; -- 进程语句执行
BEGIN
Adder(c1,c2,s1) ; -- 顺序过程调用,在此 c1,c2,s1即为分别对
END PROCESS ; -- 应于 a,b,sum的关联参量名
KX
康芯科技
【 例 9-23】
PROCEDURE check(SIGNAL a, IN STD_LOGIC_VECTOR; -- 在调用时
SIGNAL error, OUT BOOLEAN ) IS -- 再定位宽
VARIABLE found_one, BOOLEAN,= FALSE ; -- 设初始值
BEGIN
FOR i IN a'RANGE LOOP -- 对位矢量 a的所有的位元素进行循环检测
IF a(i) = '1' THEN -- 发现 a中有 '1'
IF found_one THEN -- 若 found_one为 TRUE,则表明发现了一个以上的 '1'
ERROR <= TRUE; -- 发现了一个以上的 '1',令 found_one为 TRUE
RETURN; -- 结束过程
END IF;
Found_one,= TRUE; -- 在 a中已发现了一个 '1'
End IF;
End LOOP; -- 再测 a中的其它位
error <= NOT found_one; -- 如果没有任何 '1' 被发现,error 将被置
TRUE
END PROCEDURE check;
KX
康芯科技
【 例 9-24】
...
CHBLK,BLOCK
SIGNAL s1,STD_LOGIC_VECTOR (0 TO 0); -- 过程调用前设定位
矢尺寸
SIGNAL s2,STD_LOGIC_VECTOR (0 TO 1);
SIGNAL s3,STD_LOGIC_VECTOR (0 TO 2);
SIGNAL s4,STD_LOGIC_VECTOR (0 TO 3);
SIGNAL e1,e2,e3,e4,Boolean;
BEGIN
Check (s1,e1); -- 并行过程调用,关联参数名为 s1,e1
Check (s2,e2); -- 并行过程调用,关联参数名为 s2,e2
Check (s3,e3); -- 并行过程调用,关联参数名为 s3,e3
Check (s4,e4); -- 并行过程调用,关联参数名为 s4,e4
END BLOCK;
...
KX
康芯科技
9.2.4 元件例化语句
COMPONENT 元件名 IS
GENERIC ( 类属表 ) ; -- 元件定义语句
PORT ( 端口名表 ) ;
END COMPONENT 文件名;
例化名,元件名 PORT MAP( -- 元件例化语句
[端口名 =>] 连接端口名,,..) ;
9.2 VHDL并行语句
KX
康芯科技
9.2.5 生成语句
[标号,] FOR 循环变量 IN 取值范围 GENERATE
说明
BEGIN
并行语句
END GENERATE [标号 ];
[标号,] IF 条件 GENERATE
说明
Begin
并行语句
END GENERATE [标号 ];
四部分组成的:
( 1) 生成方式
( 2) 说明部分
( 3) 并行语句
( 4) 标号 表达式 TO 表达式 ; -- 递增方式, 如 1 TO 5表达式 DOWNTO 表 达 式 ; -- 递减方式, 如 5
DOWNTO 1
取值范围的语句格式, 有两种形式:
KX
康芯科技
C O M P
I N P U T O U T P U T
C O M P
I N P U T O U T P U T
C O M P
I N P U T O U T P U Ta [ 0 ] b [ 0 ]
a [ 1 ] b [ 1 ]
a [ 7 ] b [ 7 ]
.,,
图 9-2 生成语句产
生的 8个相同的电
路模块
【 例 9-25】
...
COMPONENT comp
PORT (x, IN STD_LOGIC ;
y, OUT STD_LOGIC );
END COMPONENT ;
SIGNAL a,STD_LOGIC_VECTOR(0 TO 7);
SIGNAL b,STD_LOGIC_VECTOR(0 TO 7);
...
gen, FOR i IN a’RANGE GENERATE
u1,comp PORT MA (x=>a(i),y=>b(i));
END GENERATE gen,
...
KX
康芯科技
【 例 9-26】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY Latch IS
PORT( D, IN STD_LOGIC;
ENA, IN STD_LOGIC;
Q, OUT STD_LOGIC );
END ENTITY Latch ;
ARCHITECTURE one OF Latch IS
SIGNAL sig_save, STD_LOGIC;
BEGIN
PROCESS (D,ENA)
BEGIN
IF ENA = '1' THEN sig_save <= D ;
END IF ;
Q <= sig_save ;
END PROCESS ;
END ARCHITECTURE one;
KX
康芯科技
【 例 9-27】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SN74373 IS
PORT (D, IN STD_LOGIC_VECTOR( 8 DOWNTO 1 );
OEN,G, IN STD_LOGIC;
Q, OUT STD_LOGIC_VECTOR(8 DOWNTO 1));
END ENTITY SN74373;
ARCHITECTURE two OF SN74373 IS
SIGNAL sigvec_save, STD_LOGIC_VECTOR(8 DOWNTO 1);
BEGIN
PROCESS(D,OEN,G,sigvec_save)
BEGIN
IF OEN = '0' THEN Q <= sigvec_save;
ELSE Q <= "ZZZZZZZZ";
END IF;
IF G = '1' THEN Sigvec_save <= D;
END IF;
END PROCESS;
END ARCHITECTURE two;
ARCHITECTURE one OF SN74373 IS
COMPONENT Latch
接下页
KX
康芯科技
PORT ( D,ENA, IN STD_LOGIC;
Q, OUT STD_LOGIC );
END COMPONENT;
SIGNAL sig_mid, STD_LOGIC_VECTOR( 8 DOWNTO 1 );
BEGIN
GeLatch, FOR iNum IN 1 TO 8 GENERATE
Latchx, Latch PORT MAP(D(iNum),G,sig_mid(iNum));
END GENERATE;
Q <= sig_mid WHEN OEN = '0' ELSE
"ZZZZZZZZ"; --当 OEN=1时,Q(8)~Q(1)输出状态呈高阻态
END ARCHITECTURE one;
【 例 9-28】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY d_ff IS
PORT ( d,clk_s, IN STD_LOGIC ;
q, OUT STD_LOGIC ;
nq, OUT STD_LOGIC );
END ENTITY d_ff;
ARCHITECTURE a_rs_ff OF d_ff IS
BEGIN
bin_p_rs_ff, PROCESS(CLK_S) 接下页
KX
康芯科技BEGIN
IF clk_s = '1' AND clk_s'EVENT THEN
q <= d ; nq <= NOT d;
END IF;
END PROCESS;
END ARCHITECTURE a_rs_ff;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY cnt_bin_n is
GENERIC (n, INTEGER,= 6);
PORT (q, OUT STD_LOGIC_VECTOR (0 TO n-1);
in_1, IN STD_LOGIC );
END ENTITY cnt_bin_n;
ARCHITECTURE behv OF cnt_bin_n IS
COMPONENT d_ff
PORT(d,clk_s, IN STD_LOGIC;
Q,NQ, OUT STD_LOGIC);
END COMPONENT d_ff;
SIGNAL s, STD_LOGIC_VECTOR(0 TO n);
BEGIN
s(0) <= in_1;
q_1, FOR i IN 0 TO n-1 GENERATE
dff, d_ff PORT MAP (s(i+1),s(I),q(i),s(i+1));
END GENERATE;
END ARCHITECTURE behv;
KX
康芯科技
I1
O T 1 1
I2
I3
I4
F D 2 1
I5
F D 2 1
F D 1 1
D0 Q0
F D 1 1
D0 Q0
F D 1 1
D0 Q0
I6
F D 1 1
I7
F D 1 1
I8
M U X 2 1
nqnq
nq
c l kc l kc l k
i = n - 1i = 0 i = 1
s ( n )
s ( 2 )
s ( 1 )
s ( 0 )
q n - 1q1q0
......
图 9-3 6 位二进制计数器原理图
KX
康芯科技
语句 ? NOT(clock’STABLE AND clock ='1'),的
表达方式是不可综合的 。
9.3 属性描述与定义语句
1,信号类属性
综合器支持的属性有:
LEFT,RIGHT,HIGH,LOW,RANGE,REVERS RANGE、
LENGTH,EVENT及 STABLE。
以下两语句的功能是一样的 。
(NOT clock’STABLE AND clock ='1')
(clock’EVENT AND clock ='1')
注 意:
KX
康芯科技
2,数据区间类属性
【 例 9-29】
...
SIGNAL range1, IN STD LOGIC VECTOR (0 TO 7) ;
...
FOR i IN range1'RANGE LOOP
...
3、数值类属性
...
PROCESS (clock,a,b);
TYPE obj IS ARRAY (0 TO 15) OF BIT ;
SIGNAL ele1,ele2,ele3,ele4, INTEGER ;
BEGIN
ele1 <= obj’RIGNT ;
ele2 <= obj’LEFT ;
ele3 <= obj’HIGH ;
ele4 <= obj’LOW ;
...
KX
康芯科技
【 例 9-30】
LIBRARY IEEE;--PARITY GENERATOR
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY parity IS
GENERIC (bus_size, INTEGER,= 8 );
PORT (input_bus, IN STD_LOGIC_VECTOR(bus_size-1
DOWNTO 0);
even_numbits,odd_numbits, OUT STD_LOGIC ) ;
END parity ;
ARCHITECTURE behave OF parity IS
BEGIN
PROCESS (input_bus)
VARIABLE temp,STD_LOGIC;
BEGIN
temp,= '0';
FOR i IN input_bus'LOW TO input_bus'HIGH LOOP
temp,= temp XOR input_bus( i ) ;
END LOOP ;
odd_numbits <= temp ;
even_numbits <= NOT temp;
END PROCESS;
END behave;
KX
康芯科技
4、数组属性 ‘ LENGTH
...
TYPE arry1 ARRAY (0 TO 7) OF BIT ;
VARIABLE wth,INTEGER;
...
wth1,=arry1’LENGTH; -- wth1 = 8
...
5、用户定义属性
ATTRIBUTE 属性名, 数据类型 ;
ATTRIBUTE 属性名 OF对象名, 对象类型 IS 值 ;
例如 Synplify综合器支持的特殊属性都在 synplify.attributes程序
包中, 使用前加入以下语句即可:
LIBRARY synplify;
USE synplicity.attributes.all;
KX
康芯科技
【 例 9-31】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY cntbuf IS
PORT( Dir,IN STD_LOGIC;
Clk,Clr,OE,IN STD_LOGIC;
A,B,INOUT STD_LOGIC_VECTOR (0 to 1);
Q,INOUT STD_LOGIC_VECTOR (3 downto 0) );
ATTRIBUTE PINNUM, STRING;
ATTRIBUTE PINNUM OF Clk,signal is "1";
ATTRIBUTE PINNUM OF Clr,signal is "2";
ATTRIBUTE PINNUM OF Dir,signal is "3";
ATTRIBUTE PINNUM OF OE,signal is "11";
ATTRIBUTE PINNUM OF Q,signal is "17,16,15,14";
END cntbuf;
KX
康芯科技
实 验
( 1) 实验目的,学习应用移位相加原理设计 8位乘法器 。
( 2) 实验原理,该乘法器是由 8位加法器构成的以时序方式设
计的 8位乘法器 。
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
其乘法原理是,乘法通过逐项移位相加原理来实现, 从被乘数的最低位
开始, 若为 1,则乘数左移后与上一次的和相加;若为 0,左移后以全零相
加, 直至被乘数的最高位 。 从图 9-5的逻辑图及其乘法操作时序图图 9-4( 示
例中的相乘数为 9FH和 FDH ) 上可以清楚地看出此乘法器的工作原理 。 图
9-5中, START信号的上跳沿及其高电平有两个功能, 即 16位寄存器清零和
被乘数 A[7..0]向移位寄存器 SREG8B加载;它的低电平则作为乘法使能信号
。 CLK为乘法时钟信号 。 当被乘数被加载于 8位右移寄存器 SREG8B后, 随
着每一时钟节拍, 最低位在前, 由低位至高位逐位移出 。 当为 1时, 1位乘
法器 ANDARITH打开, 8位乘数 B[7..0]在同一节拍进入 8位加法器, 与上一
次锁存在 16位锁存器 REG16B中的高 8位进行相加, 其和在下一时钟节拍的
上升沿被锁进此锁存器 。 而当被乘数的移出位为 0时, 与门全零输出 。 如此
往复, 直至 8个时钟脉冲后, 最后乘积完整出现在 REG16B端口 。 在这里, 1
位乘法器 ANDARITH的功能类似于 1个特殊的与门, 即当 ABIN为 ‘ 1’ 时,
DOUT直接输出 DIN,而当 ABIN为 ‘ 0’ 时, DOUT输出全, 00000000” 。
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
【 例 9-32】
LIBRARY IEEE; -- 8位右移寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SREG8B IS
PORT ( CLK, IN STD_LOGIC; LOAD, IN STD_LOGIC;
DIN, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
QB, OUT STD_LOGIC );
END SREG8B;
ARCHITECTURE behav OF SREG8B IS
SIGNAL REG8, STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS (CLK,LOAD)
BEGIN
IF LOAD = '1' THEN REG8 <= DIN;
ELSIF CLK'EVENT AND CLK = '1' THEN
REG8(6 DOWNTO 0) <= REG8(7 DOWNTO 1);
END IF;
END PROCESS;
QB <= REG8(0); -- 输出最低位
END behav;
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
【 例 9-33】
LIBRARY IEEE; --8位加法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER8 IS
PORT(B,A, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
S, OUT STD_LOGIC_VECTOR(8 DOWNTO 0) );
END ADDER8;
ARCHITECTURE behav OF ADDER8 IS
BEGIN
S <= '0'&A + B ;
END behav;
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
【 例 9-34】
LIBRARY IEEE; --1位乘法器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ANDARITH IS -- 选通与门模块
PORT ( ABIN, IN STD_LOGIC;
DIN, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUT, OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );
END ANDARITH;
ARCHITECTURE behav OF ANDARITH IS
BEGIN
PROCESS(ABIN,DIN)
BEGIN
FOR I IN 0 TO 7 LOOP -- 循环,完成 8位与 1位运算
DOUT(I) <= DIN(I) AND ABIN;
END LOOP;
END PROCESS;
END behav;
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
【 例 9-35】
LIBRARY IEEE; --16位锁存器 /右移寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG16B IS
PORT ( CLK,CLR, IN STD_LOGIC;
D, IN STD_LOGIC_VECTOR(8 DOWNTO 0);
Q, OUT STD_LOGIC_VECTOR(15 DOWNTO 0) );
END REG16B;
ARCHITECTURE behav OF REG16B IS
SIGNAL R16S, STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF CLR = '1' THEN R16S <= (OTHERS =>'0') ; -- 清零信号
ELSIF CLK'EVENT AND CLK = '1' THEN --时钟到来时,锁存输入值,并右移低 8
R16S(6 DOWNTO 0) <= R16S(7 DOWNTO 1); -- 右移低 8位
R16S(15 DOWNTO 7) <= D; -- 将输入锁到高 8位
END IF;
END PROCESS;
Q <= R16S;
END behav;
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
( 3) 实验内容 1,根据给出的乘法器逻辑原理图及其各模块
的 VHDL描述, 在 MAX+plusII上完成全部设计, 包括编辑, 编
译, 综合和仿真操作等 。 以 87H乘以 F5H为例, 进行仿真, 对
仿真波形作出详细解释, 包括对 8个工作时钟节拍中, 每一节拍
乘法操作的方式和结果, 对照波形图给以详细说明 。
( 4) 实验内容 2,编程下载, 进行实验验证 。 实验电路可选择
附图 1-3,8位乘数和被乘数可分别用键 2,键 1,键 4和键 3输入; 16位乘积可由 4个数码管显示;用键 8输入 CLK,键 7输入
START。 详细观察每一时钟节拍的运算结果, 并与仿真结果进
行比较 。
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
实验 9-1 移位相加 8位硬件乘法器电路设计
图 9-4 8位移位相加乘法器运算逻辑波形图
KX
康芯科技
实 验
( 5) 实验内容 3,乘法时钟连接实验系统上的连续脉冲, 如
clock0,设计一个此乘法器的控制模块, 接受实验系统上的连
续脉冲, 如 clock0,当给定启动 /清 0信号后, 能自动发出 CLK
信号驱动乘法运算, 当 8个脉冲后自动停止 。
( 6) 思考题,用 MAX+plusII进行优化设计后, 具体说明并
比较组合电路乘法器与本乘法器的逻辑资源占用情况和运行速
度 。
( 7) 实验报告,根据例 9-32至 9-35,详细分析图 9-5中个模块
的逻辑功能, 及其它们工作原理, 详细记录并分析实验 2和实验
3的过程和结果, 完成实验报告 。
实验 9-1 移位相加 8位硬件乘法器电路设计
KX
康芯科技
实 验
实验 9-1 移位相加 8位硬件乘法器电路设计
图 9-5 8位乘法器逻辑原理图
KX
康芯科技
被乘数高 4位
输入,0
16位乘积
输出显示:
4位 16进制数
被乘数低 4位
输入,3 乘数高 4位输入,3
乘数低 4位
输入,3
注意时钟频
率选择
此键负责清 0
和运算使能
KX
康芯科技
3 X 35 = 9F
KX
康芯科技
FF X FF = FE01
KX
康芯科技
实 验
( 1) 实验目的,设计一个在数字传输中常用的校验, 纠错模块:循环冗
余校验 CRC模块, 学习使用 FPGA器件完成数据传输中的差错控制 。
( 2) 实验原理,CRC即 Cyclic Redundancy Check 循环冗余校验, 是一种
数字通信中的信道编码技术 。 经过 CRC方式编码的串行发送序列码, 可称
为 CRC码, 共由两部分构成,k位有效信息数据和 r位 CRC校验码 。 其中 r
位 CRC校验码是通过 k位有效信息序列被一个事先选择的 r+1位, 生成多项
式, 相, 除, 后得到 ( r位余数即是 CRC校验码 ), 这里的除法是, 模 2运
算, 。 CRC校验码一般在有效信息发送时产生, 拼接在有效信息后被发送;在接收端, CRC码用同样的生成多项式相除, 除尽表示无误, 弃掉 r位
CRC校验码, 接收有效信息;反之, 则表示传输出错, 纠错或请求重发 。
实验 9-2 循环冗余校验( CRC) 模块设计
KX
康芯科技
实 验
实验 9-2 循环冗余校验( CRC) 模块设计
图 9-6 CRC模块
本设计完成 12位信息加 5位 CRC校验码发送, 接收, 由两个模块构成, CRC校验生成
模块 ( 发送 ) 和 CRC校验检错模块 ( 接收 ), 采用输入, 输出都为并行的 CRC校验
生成方式 。 图 9-6的 CRC模块端口数据说明如下:
CRC校
生成
C R C 校
检错
s d a t a d a t a c r cd a t a c r c r d a t a
c l k c l k
h s e n d h r e c v
d a t a f i n i
e r r o rd a t a l d
KX
康芯科技
实 验
实验 9-2 循环冗余校验( CRC) 模块设计
sdata,12位的待发送信息
datald,sdata的装载信号
datacrc,附加上 5位 CRC校验码的 17位 CRC码, 在生成模块被发送, 在接收
模块被接收 。
clk,时钟信号
rdata,接收模块 ( 检错模块 ) 接收的 12位有效信息数据
hsend,hrecv,生成, 检错模块的握手信号, 协调相互之间关系
error,误码警告信号
datafini,数据接收校验完成
KX
康芯科技
实 验
实验 9-2 循环冗余校验( CRC) 模块设计
例 9-36中采用的 CRC生成多项式为 X5+X4+X2+1,校验码为 5位, 有效信息数据为 12位 。
【例 9-36】
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
ENTITY crcm IS
PORT (clk, IN std_logic;
sdata, IN std_logic_vector(11 DOWNTO 0);
datald, IN std_logic;
datacrco, OUT std_logic_vector(16 DOWNTO 0);
datacrci, IN std_logic_vector(16 DOWNTO 0);
rdata, OUT std_logic_vector(11 DOWNTO 0);
datafini, OUT std_logic;
ERROR,hsend, OUT std_logic;
hrecv, IN std_logic);
END crcm; 接下页
KX
康芯科技
ARCHITECTURE comm OF crcm IS
CONSTANT multi_coef, std_logic_vector(5 DOWNTO 0),=
"110101";
-- 多项式系数,MSB一定为 '1'
SIGNAL cnt, std_logic_vector(4 DOWNTO 0);
SIGNAL dtemp, std_logic_vector(11 DOWNTO 0);
SIGNAL sdatam, std_logic_vector(11 DOWNTO 0);
SIGNAL rdtemp, std_logic_vector(11 DOWNTO 0);
SIGNAL rdatacrc,std_logic_vector(16 DOWNTO 0);
SIGNAL rcnt, std_logic_vector(4 DOWNTO 0);
SIGNAL st, std_logic;
SIGNAL rt, std_logic;
BEGIN
PROCESS(clk)
VARIABLE crcvar, std_logic_vector(5 DOWNTO 0);
BEGIN
IF(clk'event AND clk = '1') THEN
IF(st = '0' AND datald = '1') THEN
dtemp <= sdata; sdatam <= sdata;
cnt <= (OTHERS => '0');
hsend <= '0'; st <= '1';
ELSIF(st = ‘1’ AND cnt < 7) THEN 接下页
KX
康芯科技
cnt <= cnt + 1;
IF(dtemp(11) = '1') THEN
crcvar,= dtemp(11 DOWNTO 6) XOR
multi_coef;
dtemp <= crcvar(4 DOWNTO 0) & dtemp(5
DOWNTO 0) & '0';
ELSE dtemp <= dtemp(10 DOWNTO 0) & '0';
END IF;
ELSIF(st='1' AND cnt =7 ) THEN
datacrco <= sdatam & dtemp(11 DOWNTO 7);
hsend <= '1'; cnt <= cnt + 1;
ELSIF(st = '1' AND cnt = 8) THEN
hsend <= '0'; st <= '0';
END IF;
END IF;
END PROCESS;
PROCESS(hrecv,clk)
VARIABLE rcrcvar, std_logic_vector(5 DOWNTO 0);
接下页
KX
康芯科技
BEGIN
IF(clk'event AND clk = '1') THEN
IF(rt = '0' AND hrecv = '1') THEN
rdtemp <= datacrci(16 DOWNTO 5);
rdatacrc <= datacrci; rcnt <= (OTHERS => '0');
ERROR <= '0'; rt <= '1';
ELSIF(rt= '1' AND rcnt < 7) THEN
datafini <= '0'; rcnt <= rcnt + 1;
rcrcvar,= rdtemp(11 DOWNTO 6) XOR multi_coef;
IF(rdtemp(11) = '1') THEN
rdtemp <= rcrcvar(4 DOWNTO 0) & rdtemp(5 DOWNTO 0) & '0';
ELSE rdtemp <= rdtemp(10 DOWNTO 0) & '0';
END IF;
ELSIF(rt = '1' AND rcnt = 7) THEN
datafini <= '1';
rdata <= rdatacrc(16 DOWNTO 5);
rt <= '0';
IF(rdatacrc(4 DOWNTO 0) /= rdtemp(11 DOWNTO 7)) THEN
ERROR <= '1';
END IF;
END IF;
END IF;
END PROCESS;
END comm;
KX
康芯科技
实 验
( 3) 实验内容 1,编译以上示例文件, 给出仿真波形 。
( 4) 实验内容 2,建立一个新的设计, 调入 crcm模块, 把其中的 CRC
校验生成模块和 CRC校验查错模块连接在一起, 协调工作 。 引出必要的观
察信号, 锁定引脚, 并在 EDA实验系统上的 FPGA目标器件中实现 。
( 5) 思考题 1,例子中对 st,rt有不妥之处, 试解决之 ( 提示:复位
reset信号的引入有助于问题的解决 ) 。
实验 9-2 循环冗余校验( CRC) 模块设计
KX
康芯科技
实 验
( 6) 思考题 2,如果输入数据, 输出 CRC码都是串行的, 设计该如何
实现 ( 提示:采用 LFSR) 。
( 7) 思考题 3,在例子程序中需要 8个时钟周期才能完成一次 CRC校
验, 试重新设计使得在一个 clk周期内完成 。
( 8) 实验报告,叙述 CRC校验的工作原理, 根据以上的实验内容写
出实验报告, 包括设计原理, 程序设计, 程序分析, 仿真分析, 硬件测试
和详细实验过程 。
实验 9-2 循环冗余校验( CRC) 模块设计