第 9章
VHDL基本语句
EDA技术 实用教程
KX
康芯科技
9.1 顺序语句
9.1.1 赋值语句
9.1.2 IF 语句信号赋值语句 变量赋值语句赋值目标 赋值符号 赋值源
KX
康芯科技
9.1.3 CASE语句
CASE语句的结构如下:
CASE 表达式 IS
When 选择值 => 顺序语句;
When 选择值 => 顺序语句;
...
END CASE ;
9.1 顺序语句接下页
【 例 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时选中
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-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";
【 例 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;
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相等
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标号 ];
...
L2,LOOP
a,= a+1;
EXIT L2 WHEN a >10 ; -- 当 a大于 10时跳出循环
END LOOP L2;
...
9.1 顺序语句
KX
康芯科技
9.1.4 LOOP语句
(2) FOR_LOOP语句,语法格式如下:
[LOOP标号,] FOR 循环变量,IN 循环次数范围 LOOP
顺序语句
END LOOP [LOOP标号 ];
9.1 顺序语句接下页
【 例 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;
【 例 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.1 顺序语句
【 例 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.1 顺序语句
【 例 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.1 顺序语句
KX
康芯科技
9.1.7 WAIT语句
9.1 顺序语句
【 例 9-9】
SIGNAL s1,s2,STD_LOGIC;
...
PROCESS
BEGIN
...
WAIT ON s1,s2 ;
END PROCESS ;
KX
康芯科技
9.1.7 WAIT语句
9.1 顺序语句
【 例 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语句
【 例 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 ;
KX
康芯科技
9.1.7 WAIT语句
【 例 9-12】
PROCESS
BEGIN
rst_loop,LOOP
WAIT UNTILclock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop WHEN (rst='1'); -- 检测复位信号 rst
x <= a ; -- 无复位信号,执行赋值操作
WAIT UNTILclock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop When (rst='1'); -- 检测复位信号 rst
y <= b ; -- 无复位信号,执行赋值操作
END LOOP rst_loop ;
END PROCESS;
接下页
【 例 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 子程序调用语句
9.1 顺序语句过程名 [([形参名 => ]实参表达式
{,[形参名 => ]实参表达式 }) ];
(1) 将 IN和 INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;
(2) 执行这个过程;
(3) 将过程中 IN和 INOUT模式的形参值返回给对应的实参 。
1,过程调用接下页
【 例 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
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);
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;
KX
康芯科技
9.1.9 返回语句 (RETURN)
9.1 顺序语句
RETURN; -- 第一种语句格式
RETURN 表达式; -- 第二种语句格式
KX
康芯科技
9.1.9 返回语句 (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 PROCEDURErs ;
KX
康芯科技
9.1.9 返回语句 (RETURN)
9.1 顺序语句
【 例 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.2 VHDL并行语句并行信号赋值语句 (Concurrent Signal Assignments)
进程语句 (Process Statements)
块语句 (BlockStatements)
条件信号赋值语句 (Selected Signal Assignments)
元件例化语句 (Component Instantiations),其中包括类属配置语句生成语句 (Generate Statements)
并行过程调用语句 (ConcurrentProcedure Calls)
KX
康芯科技
9.2 VHDL并行语句
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
康芯科技
9.2 VHDL并行语句
9.2.1 并行信号赋值语句
2,条件信号赋值语句赋值目标 <= 表达式 WHEN 赋值条件 ELSE
表达式 WHEN 赋值条件 ELSE
...
表达式 ;
KX
康芯科技
9.2 VHDL并行语句
9.2.1 并行信号赋值语句
2,条件信号赋值语句图 9-1 例 9-18的逻辑电路图
KX
康芯科技
2,条件信号赋值语句
【 例 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
康芯科技
9.2 VHDL并行语句
9.2.1 并行信号赋值语句
3,选择信号赋值语句
WITH 选择表达式 SELECT
赋值目标信号 <= 表达式 WHEN 选择值表达式 WHEN 选择值
...
表达式 WHEN 选择值;
【 例 9-19】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdecoder IS
PORT ( a,b,c,IN STD_LOGIC;
data1,data2,IN STD_LOGIC;
dataout,OUT STD_LOGIC );
END decoder;
ARCHITECTURE concunt OFdecoder IS
SIGNALinstruction,STD_LOGIC_VECTOR(2 DOWNTO0);
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
康芯科技
9.2 VHDL并行语句
9.2.2 块语句结构 (BLOCK)
块标号,BLOCK [(块保护表达式 )]
接口说明类属说明
BEGIN
并行语句
END BLOCK 块标号 ;
接下页
【 例 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 ;
【 例 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 VHDL并行语句
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的关联参量名
【 例 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;
【 例 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 VHDL并行语句
9.2.4 元件例化语句
COMPONENT元件名 IS
GENERIC (类属表 ); -- 元件定义语句
PORT (端口名表 );
END COMPONENT文件名;
例化名,元件名 PORT MAP( -- 元件例化语句
[端口名 =>] 连接端口名,,..);
KX
康芯科技
9.2 VHDL并行语句
9.2.5 生成语句
[标号,] FOR 循环变量 IN 取值范围 GENERATE
说明
BEGIN
并行语句
END GENERATE [标号 ];
[标号,] IF 条件 GENERATE
说明
Begin
并行语句
END GENERATE [标号 ];
【 例 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.2 VHDL并行语句
9.2.5 生成语句
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-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;
【 例 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;
接下页
【 例 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
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)
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
康芯科技
9.2 VHDL并行语句
9.2.5 生成语句图 9-3 6 位二进制计数器原理图
F D 1 1
D0 Q0
F D 1 1
D0 Q0
F D 1 1
D0 Q0
nqnq
nq
c lkc lkc lk
i= n - 1i= 0 i= 1
s ( n )
s ( 2 )
s ( 1 )
s ( 0 )
q n - 1q1q0
KX
康芯科技
9.3 属性描述与定义语句
1,信号类属性
(NOT clock’STABLE AND clock ='1')
(clock’EVENT AND clock ='1')
注意:
语句,NOT(clock'STABLE AND clock ='1'),的表达方式是不可综合的 。 因为,对于 VHDL综合器来说,括号中的语句等效于一条时钟信号边沿测试专用语句,它已不是普通的操作数,所以不能以操作数方式来对待 。
KX
康芯科技
9.3 属性描述与定义语句
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 ;
...
【 例 9-30】
LIBRARY IEEE;--PARITYGENERATOR
USE IEEE.STD_LOGIC_1164.ALL;
ENTITYparity 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 OFparity 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
康芯科技
9.3 属性描述与定义语句
4,数组属性 'LENGTH
...
TYPE arry1 ARRAY (0 TO 7) OF BIT ;
VARIABLE wth,INTEGER;
...
wth1,=arry1’L
KX
康芯科技
9.3 属性描述与定义语句
5,用户定义属性
ATTRIBUTE 属性名,数据类型 ;
ATTRIBUTE 属性名 OF 对象名,对象类型 IS 值 ;
LIBRARY synplify;
USE synplicity.attributes.all;
【 例 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
康芯科技习 题
9-1 进程有哪几种主要类型? 不完全组合进程是由什么原因引起的? 有什么特点? 如何避免?
9-2 给触发器复位的方法有哪两种? 如果时钟进程中用了敏感信号表,哪种复位方法要求把复位信号放在敏感信号表中

9-3 用 WITH_SELECT_WHEN语句描述 4个 16位至 1个 16位输出的 4选 1多路选择器 。
9-4 为什么说一条并行赋值语句可以等效为一个进程? 如果是这样的话,该语句怎样实现敏感信号的检测?
9-5 下述 VHDL代码的综合结果会有几个触发器或锁存器?
KX
康芯科技习 题程序 1:
architecture rtl of ex is
signal a,b,std?logic?vector(3 downto 0);
begin
process(clk)
begin
if clk = '1' and clk'event then
if q(3) /= '1' then q <= a + b;
end if;
end if;
end process;
end rtl;
KX
康芯科技习 题程序 2:
architecture rtl of ex is
signal a,b,std?logic?vector(3 downto 0);
begin
process(clk)
variable int,std?logic?vector(3 downto 0);
begin
if clk ='1' and clk'event then
if int(3) /= '1' then int,= a + b ; q <= int;
end if;
end if;
end process;
end rtl;
KX
康芯科技习 题程序 3:
architecture rtl of ex is
signal a,b,c,d,e,std?logic?vector(3 downto 0);
begin
process(c,d,e,en)
begin
if en ='1' then a <= c ; b <= d;
else a <= e;
end if;
end process;
end rtl;
KX
康芯科技习 题
9-6 比较 CASE语句与 WITH_SELECT语句,叙述它们的异同点 。
9-7 将以下程序段转换为 WHEN_ELSE语句:
PROCESS (a,b,c,d)
BEGIN
IF a= '0' AND b='1' THEN next1 <= "1101";
ELSIF a='0' THEN next1 <= d ;
ELSIF b='1' THEN next1 <= c ;
ELSE
Next1 <= "1011";
END IF;
END PROCESS;
KX
康芯科技习 题9-8 说明以下两程序有何不同,哪一电路更合理? 试画出它们的电路 。程序 1:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITYEXAP IS PORT ( clk,a,b,IN STD_LOGIC;
y,OUT STD_LOGIC );
END EXAP ;
ARCHITECTURE behav OF EXAP IS
SIGNALx,STD_LOGIC;
BEGIN
PROCESS
BEGIN
WAIT UNTIL CLK ='1' ;
x <= '0'; y <= '0';
IF a = b THEN x <= '1';
END IF;
IF x='1' THEN y <= '1' ;
END IF ;
END PROCESS ; END behav;
KX
康芯科技习 题程序 2:LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY EXAP IS PORT ( clk,a,b,IN STD_LOGIC;
y,OUT STD_LOGIC );
END EXAP ;
ARCHITECTURE behav OF EXAP IS
BEGIN
PROCESS
VARIABLE x,STD_LOGIC;
BEGIN
WAIT UNTIL CLK ='1' ;
x,= '0'; y <= '0';
IF a = b THEN x,= '1';
END IF;
IF x='1' THEN y <= '1' ;
END IF ;
END PROCESS ;
END behav;
KX
康芯科技实 验 与 设 计
9-1 VGA彩条信号显示控制器设计
(1) 实验目的,学习 VGA图像显示控制器的设计 。
(2) 实验原理,计算机显示器的显示有许多标准,常见的有
VGA,SVGA等 。 一般这些显示控制都用专用的显示控制器
(如 6845)。 在这里我们尝试用 FPGA来实现 VGA图像显示控制器,用以显示一些图形和图象,这在产品开发设计中有许多实际应用 。
常见的彩色显示器一般由 CRT(阴极射线管 )构成,彩色是由
R,G,B(红,Red,绿,Green,蓝,Blue)三基色组成,用逐行扫描的方式解决图象显示 。 阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生 R,G,B三基色,合成一个彩色像素 。
扫描是从屏幕的左上方开始的,从左到右,从上到下,进行
KX
康芯科技实 验 与 设 计扫描。每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间
,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。对于普通的 VGA显示器,其引出线共含
5个信号:
R,G,B,三基色信号
HS,行同步信号
VS,场同步信号注意,对于 VGA显示器的这 5个信号的时序驱动要严格遵循,VGA工业标准,,即 640× 480× 60Hz模式,否则会损害 VGA显示器 。 图 12-9是 VGA行扫描,场扫描的时序图 。
VGA工业标准要求的频率:
时钟频率 (Clock frequency),25.175MHz (像素输出的频率 )
行频 (Line frequency),31469 Hz
场频 (Field frequency ),59.94 Hz (每秒图像刷新频率 )
KX
康芯科技实 验 与 设 计
VGA工业标准显示模式要求:行同步,场同步都为负极性,即同步头脉冲要求是负脉冲 。
设计 VGA图像显示控制要注意两个问题:一个是时序驱动,这是完成设计的关键,时序稍有偏差,显示必然不正常,甚至会损坏彩色显示器;另一个是 VGA信号的电平驱动,详细情况可参考相关资料 。
在设计中可将要显示的彩色图像存于 FPGA内部的 EAB RAM中或外部的 ROM或
RAM中 。
为了节省存储空间,以下示例中仅采用 3位数字信号表达 R,G,B,三基色信号,因此仅可显示 8种颜色 。
KX
康芯科技实 验 与 设 计
RGB
HS
Ta
Tb
Tc
Td
Te
Tf
Tg
图像 行消隐 下一行图像行消隐行同步
RGB
VS
Ta
Tb
Tc
Td
Te
Tf
Tg
图像 场消隐 下一行图像场消隐场同步图 9-4 VGA行扫描,场扫描时序示意图
KX
康芯科技实 验 与 设 计行扫描时序要求,(单位:像素,即输出一个像素 Pixel的时间间隔 )
行同步头 行图像 行周期对应位置 Tf Ta Tb Tc Td Te Tg
时间 (Pixels) 8 96 40 8 640 8 800
场扫描时序要求,(单元:行,即输出一行 Line的时间间隔 )
行同步头 行图像 行周期对应位置 Tf Ta Tb Tc Td Te Tg
时间 (Lines) 2 2 25 8 480 8 525
KX
康芯科技实 验 与 设 计
EE PR OM

Flash ROM
D A TA8
ADDR
OE,CE
VGA
R,G,B
HS,VS
VGA ROMC
VGA 时序控制时钟二分频
ROM 读取控制模式控制
C LK
5 0 M H z 时钟
M O D F
图 9-5 VGA图像控制器框图
KX
康芯科技实 验 与 设 计图 9-6 FPGA模块实体
R
G
B
HS
VS
DATA8
ADDR
OE
CE
CLK
MODE
VGAROM
KX
康芯科技实 验 与 设 计图 9-5是 VGA图像显示控制器的原理框图,图 9-6是设计实体的接口,利用
FPGA的外部 ROM放置图象信息,方法是在 ROM中一个字节存储 2个相邻数据,
每个像素是 3位彩色,共有 8种颜色 。
行同步 HS和场同步 VS是两个重要的信号 。 显示过程中,HS和 VS的极性可正可负,显示器内可自动转换为正极性逻辑 。
现以正极性为例,说明 CRT的工作过程,R,G,B为正极性信号,即高电平有效 。 当 VS=0,HS=0时,CRT显示的内容为亮的过程,即正向扫描过程约为 26μs。 当一行扫描完毕,行同步 HS=1,约需 6μs; 其间,CRT扫描产生消隐,电子束回到 CRT左边下一行的起始位置 ( X=0,Y=1) ; 当扫描完
480行后,CRT的场同步 VS=1,产生场同步使扫描线回到 CRT的第一行第一列 ( X=0,Y=0) 处 ( 约为两个行周期 ) 。 HS和 VS的时序图如图 9-7所示 。
KX
康芯科技实 验 与 设 计图 9-7中,T1为行同步消隐 ( 约为 6μs) ; T2为行显示时间 ( 约为 26μs); T3为场同步消隐 ( 两行周期 ) ; T4为场显示时间 ( 480行周期 ) 。 例 9-
23设计的彩条信号发生器可通过外部控制产生如下 3种显示模式,共 6种显示变化:
1 横彩条 1:白黄青绿品红蓝黑 2,黑蓝红品绿青黄白
2 竖彩条 1:白黄青绿品红蓝黑 2,黑蓝红品绿青黄白
3 棋盘格 1:棋盘格显示模式 1 2,棋盘格显示模式 2
KX
康芯科技实 验 与 设 计颜色黑 蓝 红 品 绿 青 黄 白
R 0 0 0 0 1 1 1 1
G 0 0 1 1 0 0 1 1
B 0 1 0 1 0 1 0 1
颜色编码如下:
由于本项设计是对视频数据进行处理,对电路的工作速度和功能要求都比较高,实用传统的电子设计方法 (不使用专用芯片 )是难以实现的,但在 FPGA上就能十分容易地实现 。
KX
康芯科技实 验 与 设 计
(3) 实验内容 1,例 9-32是 VGA显示器 彩条发生器 VHDL设计 。
硬件验证实验步骤:向目标芯片下载例 9-23设计文件,选择实验电路结构图 NO.5,时钟信号 CLK接 clock9,接受 12MHz频率信号;显示模式 MD接键 1( PIO0) ; 根据电路结构图 NO.5图和图 9-8,HS接
PIO64,VS接 PIO65,R接 PIO60,G接 PIO61,B接 PIO63; 实验中,
插上 VGA显示器接头;每按动一次键 1,输出就改变一种方式,6次一循环,其循环显示模式分别为:横彩条 1,横彩条 2,竖彩条 1,竖彩条 2
,棋盘格 1和棋盘格 2 。
图 9-7 HS和 VS的时序图
KX
康芯科技实 验 与 设 计图 9-8 例 9-32电路连接图
KX
康芯科技实 验 与 设 计
(4) 实验内容 2,设计可显示横彩条与棋盘格相间的 VGA彩条信号发生器 。
(5) 实验内容 3,设计可显示英语字母的 VGA信号发生器电路 。
(6) 实验内容 4,设计可显示移动彩色斑点的 VGA信号发生器电路 。
【 例 9-32】
LIBRARY IEEE; -- VGA显示器 彩条 发生器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY VGAL IS
PORT ( CLK,MD,IN STD_LOGIC;
HS,VS,R,G,B,OUT STD_LOGIC ); -- 行场同步 /红,绿,兰
END VGAL;
ARCHITECTURE behav OF VGAL IS
SIGNAL HS1,VS1,FCLK,CCLK,STD_LOGIC;
SIGNAL MMD,STD_LOGIC_VECTOR(1 DOWNTO 0);-- 方式选择
SIGNAL FS,STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL CC,STD_LOGIC_VECTOR(4 DOWNTO 0); --行同步 /横彩条生成
SIGNAL LL,STD_LOGIC_VECTOR(8 DOWNTO 0); --场同步 /
SIGNAL GRBX,GRBY,STD_LOGIC_VECTOR(3 DOWNTO 1);-- X横彩条和 Y竖彩条
SIGNAL GRBP,GRB,STD_LOGIC_VECTOR(3 DOWNTO 1);
BEGIN
GRB(2)<=(GRBP(2) XOR MD) AND HS1 AND VS1;
GRB(3)<=(GRBP(3) XOR MD) AND HS1 AND VS1;
GRB(1)<=(GRBP(1) XOR MD) AND HS1 AND VS1;
PROCESS( MD )
BEGIN 接下页
IF MD'EVENT AND MD = '0' THEN
IF MMD = "10" THEN MMD <= "00"; ELSE MMD<=MMD+1; --三种模式
END IF;
END IF;
END PROCESS;
PROCESS( MMD )
BEGIN
IF MMD = "00" THEN GRBP <= GRBX; -- 选择横彩条
ELSIF MMD = "01" THEN GRBP <= GRBY; -- 选择竖彩条
ELSIF MMD = "10" THEN GRBP <= GRBX XOR GRBY; --产生棋盘格
ELSE GRBP <= "000"; END IF;
END PROCESS;
PROCESS( CLK )
BEGIN
IF CLK'EVENT AND CLK = '1' THEN -- 12MHz 13分频
IF FS = 12 THEN FS <= "0000";
ELSE FS <= (FS + 1); END IF;
END IF;
END PROCESS;
PROCESS( FCLK )
BEGIN
IF FCLK'EVENT AND FCLK = '1' THEN
IF CC = 29 THEN CC <= "00000";
ELSE CC <= CC + 1; END IF;
END IF;
接下页
END PROCESS;
PROCESS( CCLK )
BEGIN
IF CCLK'EVENT AND CCLK = '0' THEN
IF LL = 481 THEN LL <= "000000000";
ELSE LL <= LL + 1; END IF;
END IF;
END PROCESS;
PROCESS( CC,LL )
BEGIN
IF CC > 23 THEN HS1 <= '0'; --行同步
ELSE HS1 <= '1'; END IF;
IF LL > 479 THEN VS1 <= '0'; --场同步
ELSE VS1 <= '1'; END IF;
END PROCESS;
PROCESS(CC,LL)
BEGIN
IF CC < 3 THEN GRBX <= "111"; -- 横彩条
ELSIF CC < 6 THEN GRBX <= "110";
ELSIF CC < 9 THEN GRBX <= "101";
ELSIF CC < 12 THEN GRBX <= "100";
ELSIF CC < 15 THEN GRBX <= "011";
ELSIF CC < 18 THEN GRBX <= "010";
ELSIF CC < 21 THEN GRBX <= "001";
接下页
ELSE GRBX <= "000";
END IF;
IF LL < 60 THEN GRBY <= "111"; -- 竖彩条
ELSIF LL < 120 THEN GRBY <= "110";
ELSIF LL < 180 THEN GRBY <= "101";
ELSIF LL < 240 THEN GRBY <= "100";
ELSIF LL < 300 THEN GRBY <= "011";
ELSIF LL < 360 THEN GRBY <= "010";
ELSIF LL < 420 THEN GRBY <= "001";
ELSE GRBY <= "000";
END IF;
END PROCESS;
HS <= HS1 ; VS <= VS1 ;R <= GRB(2) ;G <= GRB(3) ;
B <= GRB(1);CCLK <= CC(4); FCLK <= FS(3);
END behav;
KX
康芯科技实 验 与 设 计
9-2 VGA图像显示控制器设计例 9-33和例 9-34是一个 VGA图象显示控制程序 。 例 9-33是顶层设计,其中 vga640480( 例 9-34) 是显示扫描模块,imgrom是图象数据 ROM,
注意其数据线宽为 3,恰好放置 RGB三信号数据,因此此图象仅能显示 8
种颜色 。
实验内容 1,设计与生成图象数据;根据例 9-33中 imgrom元件的接口,
定制放置图象数据的 ROM。
实验内容 2,硬件验证例 9-33/34,电路图选择和引脚连接方式同实验 9-
2,只是时钟输入 clk50MHz接 50MHz的时钟信号 。
实验内容 3,为了显示更大的图象,用外部 ROM取代 FPGA的内部 ROM,引脚方法参考图 9-8和 电路结构图 NO.5图中的 ROM 27C020与 FPGA的引脚连接情况 。
【 例 9-33】
LIBRARY IEEE
USE ieee.std_logic_1164.all;
ENTITY img IS
port( clk50MHz,IN STD_LOGIC;
hs1,vs1,r1,g1,b1,OUT STD_LOGIC );
END img;
ARCHITECTURE modelstru OF img IS
component vga640480
PORT(clk,IN STD_LOGIC;
rgbin,IN STD_LOGIC_VECTOR(2 downto 0);
hs,vs,r,g,b,OUT STD_LOGIC;
hcntout,vcntout,OUT STD_LOGIC_VECTOR(9 downto 0)
);
end component;
component imgrom
PORT(inclock,IN STD_LOGIC;
address,IN STD_LOGIC_VECTOR(11 downto 0);
q,OUT STD_LOGIC_VECTOR(2 downto 0));
end component;
signalrgb,STD_LOGIC_VECTOR(2 downto 0); 接下页
signalclk25MHz,std_logic;
signalromaddr,STD_LOGIC_VECTOR(11 downto 0);
signalhpos,vpos,std_logic_vector(9 downto 0);
BEGIN
romaddr <= vpos(5 downto 0) & hpos(5 downto 0);
process(clk50MHz) begin
if clk50MHz'event and clk50MHz = '1' then clk25MHz <= not clk25MHz;
end if;
end process;
ivga,vga640480 PORT MAP(clk =>clk25MHz,rgbin=> rgb,hs => hs1,vs =>
vs1,
r => r1,g => g1,b => b1,hcntout => hpos,vcntout => vpos);
irom,imgrom PORT MAP(inclock =>clk25MHz,address=>romaddr,q =>
rgb);
END;;
【 例 9-34】
LIBRARY IEEE
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity vga640480 is
port ( clk,in STD_LOGIC;
hs,vs,r,g,b,out STD_LOGIC;
rgbin,in std_logic_vector(2 downto 0);
hcntout,vcntout,out std_logic_vector(9 downto 0) );
end vga640480;
architecture ONE of vga640480is
signal hcnt,vcnt,std_logic_vector(9 downto 0);
begin
hcntout <= hcnt; vcntout <= vcnt;
process(clk) begin
if (rising_edge(clk)) then
if(hcnt < 800) then hcnt <= hcnt + 1;
else hcnt <= (others => '0'); end if;
end if;
end process;
process(clk) begin 接下页
if (rising_edge(clk)) then
if (hcnt = 640+8 ) then
if(vcnt < 525) then vcnt <= vcnt + 1;
else vcnt <= (others => '0'); end if;
end if;
end if;
end process;
process(clk) begin
if (rising_edge(clk)) then
if((hcnt>=640+8+8) and (hcnt<640+8+8+96 )) then hs<='0';
else hs <= '1'; end if;
end if;
end process;
process(vcnt) begin
if ((vcnt >= 480+8+2) and (vcnt<480+8+2+2)) then vs <= '0';
else vs<='1'; end if;
end process;
process(clk) begin
if (rising_edge(clk)) then
if (hcnt<640 and vcnt<480) then
r<=rgbin(2); g<=rgbin(1); b<=rgbin(0);
else r<='0'; g<='0'; b<='0'; end if;
end if;
end process;
end ONE;
KX
康芯科技实 验 与 设 计
9-3 循环冗余校验 (CRC)模块设计
(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校验码,接收有效信息;反之,则表示传输出错,纠错或请求重发 。
本设计完成 12位信息加 5位 CRC校验码发送,接收,由两个模块构成,CRC校验生成模块 (发送 )和 CRC校验检错模块 (接收 ),采用输入,输出都为并行的 CRC校验生成方式 。 图 9-9的 CRC模块端口数据说明如下:
KX
康芯科技实 验 与 设 计
C R C 校验生成模块
C R C 校验检错模块
sdata datacrcidatacrco rdata
clk clk
hsend hrecv
datafini
errordatald
图 9-9 CRC模块
sdata,12位的待发送信息 ; datald,sdata的装载信号;
error,误码警告信号 ; datafini,数据接收校验完成;
rdata,接收模块 (检错模块 )接收的 12位有效信息数据;
clk,时钟信号;
datacrc,附加上 5位 CRC校验码的 17位 CRC码,在生成模块被发送,在接收模块被接收;
hsend,hrecv,生成,检错模块的握手信号,协调相互之间关系;
【 例 9-35】
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,hrecv,datald,IN std_logic;
sdata,IN std_logic_vector(11 DOWNTO 0);
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;
ERROR0,hsend,OUT std_logic);
END crcm;
ARCHITECTURE comm OF crcm IS
CONSTANT multi_coef,std_logic_vector(5 DOWNTO 0),= "110101";
-- 多项式系数,MSB一定为 '1'
SIGNAL cnt,rcnt,std_logic_vector(4 DOWNTO 0);
SIGNAL dtemp,sdatam,rdtemp,std_logic_vector(11 DOWNTO 0);
SIGNAL rdatacrc,std_logic_vector(16 DOWNTO 0);
SIGNAL st,rt,std_logic;
接下页例 9-35中采用的 CRC生成多项式为 X5+X4+X2+1,校验码为 5位,有效信息数据为 12位 。
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 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);
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');
ERROR0 <= '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
ERROR0 <= '1'; END IF;
END IF;
END IF;
END PROCESS;
END comm;
KX
康芯科技实 验 与 设 计
(3) 实验内容 1,编译以上示例文件,给出仿真波形 。
(4) 实验内容 2,建立一个新的设计,调入 crcm模块,把其中的 CRC校验生成模块和 CRC校验查错模块连接在一起,协调工作 。 引出必要的观察信号,锁定引脚,并在 EDA实验系统上实现之 。
(5) 思考题 1,例中对 st,rt有不妥之处,试解决之 (提示:复位 reset
信号的引入有助于问题的解决 )。
(6) 思考题 2,如果输入数据,输出 CRC码都是串行的,设计该如何实现
(提示:采用 LFSR)。
(7) 思考题 3,在例子程序中需要 8个时钟周期才能完成一次 CRC校验,
试重新设计使得在一个 clk周期内完成 。
(8) 实验报告,叙述 CRC的工作原理,将设计原理,程序设计与分析,
仿真分析和详细实验过程 。
KX
康芯科技实 验 与 设 计
9-4 EDA技术在步进电机细分驱动控制中的应用
(1) 实验目的,学习用 FPGA实现步进电机的驱动和细分控制 。
(2) 实验原理,步进电机作为一种电脉冲 —— 角位移的转换元件,由于具有价格低廉,易于控制,无积累误差和计算机接口方面等优点,在机械,仪表,工业控制等领域中获得了广泛的应用 。
采用 FPGA控制步进电机,利用 FPGA中的嵌入式 EAB,可以构成存放电机各相电流所需的控制波形数据表 。 利用 FPGA设计的数字比较器可以同步产生多路 PWM电流波形,对多相步进电机进行灵活的控制 。 当改变控制波形表的数据,增加计数器的位数,提高计数精度,从而可以对步进电机的步进转角进行任意细分,实现步进转角的精确控制 。 用 FPGA实现多路 PWM控制,无须外接 D/A转换器,使外围控制电路大大简化,控制方式简洁,控制精度高,控制效果好 。 用单片机控制是难以达到同样的控制效果的 。
KX
康芯科技实 验 与 设 计
1,步进电机细分驱动原理
2,步进电机细分驱动电路
3,步距细分的系统构成图 9-10四相步进电机 8细分电流波形图 9-11 步进电机细分驱动结构图图 9-12步进电机 PWM控制实验电路图
4,细分电流信号的实现
KX
康芯科技实 验 与 设 计
5,细工作时序分析图 9-13步进电机 PWM仿真波形图
【 例 9-36】 --元件 CNT8
LIBRARY IEEE; -- 8进制计数器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT8 IS
PORT ( CLK,IN STD_LOGIC;
CQ,OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END CNT8;
ARCHITECTURE behav OF CNT8 IS
SIGNAL CQI,STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN CQI <= CQI + 1; END IF;
END PROCESS;
CQ <= CQI;
END behav;
6,实验设计
【 例 9-37】 --元件 CNT24
LIBRARY IEEE; -- 24进制计数器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT24 IS
PORT ( CLK,EN,U_D,IN STD_LOGIC;
CQ,OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END CNT24;
ARCHITECTURE behav OF CNT24 IS
SIGNAL CQI,STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS(CLK,EN,U_D)
BEGIN
IF EN = '1' THEN CQI <= CQI;
ELSIF CLK'EVENT AND CLK = '1' THEN
IF U_D = '1' THEN CQI <= CQI + 1;
ELSE CQI<= CQI-1; END IF;
END IF;
END PROCESS;
CQ <= CQI;
END behav;
【 例 9-38】 --2位地址线 ROM中的数据,rom_4.mif
WIDTH = 4;
DEPTH = 4;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT BEGIN
0,03; 1,06; 2,
0c; 3,09;
END;
【 例 9-39】 -- --5位地址线 ROM中的数据,pwm_1.mif
WIDTH = 12;
DEPTH = 32;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT BEGIN
0:0800; 1:0840; 2:0880; 3:08c0; 4:0900; 5:0700; 6:0500; 7:0300; 8:0100;
9:0108; a:0110; b:0118; c:0120;d:00e0; e:00a0; f:0060;10:0020; 11:0021;
12:0022; 13:0023; 14:0024; 15:001c; 16:0014; 17:000c; 18:0004; 19:0204;
1a:0404;
1b:0604; 1c:0804; 1d:0803; 1e:0802; 1f:0801;
END;
KX
康芯科技实 验 与 设 计
(3)实验内容 1,完成以图 9-12为步进电机控制电路的验证性实验 。 首先引脚锁定:
用模式键选模式 No.5,CLR( 即 EN) 接键 2,作步进电机工作 /停止控制,低电平运转,
高电平停止; U_D接键 3,用于步进电机旋转方向的控制:正转或反转; S接键 1,作细分控制,KEY1=0时无细分,18度 /步; KEY1=1时作 1/8细分,2.25度 /步; CLK接 clock0
,选择频率,16394Hz; CLK2接 clock2,频率选择 8Hz; Y[3..0]分别接步进电机的 4个控制端,A,B,C,D。 给出电机的驱动仿真波形,与示波器中观察到的电机控制波形进行比较 。
(4)实验内容 2,设计 2个电路,1,要求能按给定细分要求,采用 PWM方法,用 FPGA对步进电机转角进行细分控制; 2,用 FPGA实现对步进电机的匀加速和匀减速控制 。
(5)实验内容 3,为使步进电机能平稳地运行,并尽快从起点到达终点,步进电机应按照以下控制方式运行:启动 → 匀加速 → 匀速 → 匀减速 → 停止 。 当给定终点位置 ( 转角 )
以后,试用 FPGA实现此控制 。
(6)实验内容 4,步进电机在步距角8细分的基础上,试通过修改控制电路对步距角进一步细分 。
KX
康芯科技实 验 与 设 计
(7)思考题,
1,简述步进电机转角细分的工作原理,有哪些方法可以实现步进转角细分控制?
2,步进电机相电流的细分与步进转角细分是一回事吗? 有何区别? 要提高步进电机转角细分的控制精度,可以采取哪些方法?
3,要使步进电机按预先设定的角度转动,控制电路应如何设计?
KX
康芯科技实 验 与 设 计
9-5 直流电机 PWM控制的 FPGA实现
(1) 实验目的,学习直流电机 PWM的 FPGA控制 。
掌握 PWM控制的工作原理,对直流电机进行速度控制,旋转方向控制
,变速控制 。
(2) 实验原理,直流电机 PWM调速工作原理目前,最常用的开关型驱动电路有斩波式和脉宽调制 (PWM)式两种 。 斩波式细分驱动电路的基本工作原理是对电机绕组中的电流进行检测,和 D/ A输出的控制电压进行比较,
若检测出的电流值大于控制电压,电路将使功放管截止,反之,使功放管导通 。
这样,D/ A输出不同的控制电压,绕组中将流过不同的电流值 。 脉宽调制式细分驱动电路是把 D/ A输出的控制电压加在脉宽调制电路的输入端,脉宽调制电路将输入的控制电压转换成相应脉冲宽度的矩形波,通过对功放管通断时间的控制,改变输出到电机绕组上的平均电流 。 由于电机绕组是一个感性负载,对电流有一定的滤波作用,而且脉宽调制电路的调制频率较高,一般大于 20kHz,因此,虽然是断续通电,但电机绕组中的电流还是较平稳的 。 和斩波式细分驱动电路相比,脉宽调制式细分驱动电路的控制精度高,
工作频率稳定,但线路较复杂 。 因此,脉宽调制式细分驱动电路多用于综合驱动性能要求较高的场合 。
KX
康芯科技实 验 与 设 计
1,微机与单片机常用的 PWM控制
2,用 FPGA 的 PWM
控制
3,FPGA电机控制电路构成图 9-14 FPGA直流电机控制电路图 9-15 FPGA中 PWM控制电路
【 例 9-40】
LIBRARY IEEE;
LIBRARY IEEE; -- 24进制计数器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNTA IS
PORT ( CLK,IN STD_LOGIC;
U_D,IN STD_LOGIC;
CQ,OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END CNTA;
ARCHITECTURE behav OF CNTA IS
SIGNAL CQI,STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF U_D = '1' THEN
IF CQI = 31 THEN CQI <= "11111"; -- 模为 32
ELSE CQI <= CQI + 1; END IF;
ELSIF CQI=0 THEN CQI<= "00000";
ELSE CQI<= CQI-1; END IF;
END IF;
END PROCESS;
CQ <= CQI;
END behav;
图 9-16 PWM控制仿真输出波形图
KX
康芯科技实 验 与 设 计思考题
1,有哪些方法可以对直流电机进行调速控制? 如何用 FPGA
对直流电机进行调速控制?
2,若要使电机转速设置更精确,可以采取哪些措施,控制电路应如何修改?
3,要使直流电机精确地达到设定转速,可以通过检测电机的转速,采用速度闭环控制 。 如何通过实验台上的光电检测装置检测电机转速,测速电路如何设计,如何用 FPGA实现速度闭环控制?
4,若要使电机转速设置更精确,可以采取哪些措施,控制电路应如何修改?