文档库 最新最全的文档下载
当前位置:文档库 › VHDL代码规范

VHDL代码规范

VHDL代码规范
VHDL代码规范

用FPGA实现的七段数码管vhdl代码

Output(7 downto 0)

具体设计: Vhd代码: library IEEE; use Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use sevenled_vhd is Port ( input : in STD_LOGIC_VECTOR (3 downto 0); led : out STD_LOGIC_VECTOR (7 downto 0)); end sevenled_vhd; architecture Behavioral of sevenled_vhd is begin led<= "" when input="0000" else -- 0 "" when input="0001" else -- 1 "" when input="0010" else -- 2 "" when input="0011" else -- 3 "" when input="0100" else -- 4 "" when input="0101" else -- 5 "" when input="0110" else -- 6 "" when input="0111" else -- 7 "" when input="1000" else -- 8 "" when input="1001" else -- 9 "" when input="1010" else -- A "" when input="1011" else -- b "" when input="1100" else -- c "" when input="1101" else -- d "" when input="1110" else -- E ""; -- F end Behavioral; 管脚约束: Net "led<7>" LOC=N19; Net "led<6>" LOC=N15; Net "led<5>" LOC=R20; Net "led<4>" LOC=R18; Net "led<3>" LOC=U20; Net "led<2>" LOC=T18;

电子秤VHDL代码

-- 输入电压范围0-5V,显示0-255数位 --------------------库定义、包定义-------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --------------------实体定义-------------------- ENTITY balance IS port ( clk : IN STD_LOGIC; -- 全局时钟输入,12Mhz晶振产生 reset : IN STD_LOGIC; -- 复位输入 intr : IN STD_LOGIC; -- AD转换结束产生的中断输入 data_i : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- ADC转换后的数据输入 data_o : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 数码管数据输出 l : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- 输出数码管位选 cs : OUT STD_LOGIC; -- ADC使能 wr : OUT STD_LOGIC; -- ADC写控制 rd : OUT STD_LOGIC -- ADC读控制 ); END balance; --------------------结构体-------------------- ARCHITECTURE bhv OF balance IS TYPE state IS (start, convert, read1, read2);-- 状态机定义 SIGNAL current_state, next_state : state; -- 状态定义 SIGNAL read_data : STD_LOGIC;-- 读数据寄存器 SIGNAL clock : STD_LOGIC;-- 扫描时钟 SIGNAL p : INTEGER RANGE 0 TO 255;-- 数据寄存器 SIGNAL b0,b1,b2 : INTEGER RANGE 0 TO 9;-- 3位数码管显示数据寄存器 SIGNAL cnt : INTEGER RANGE 0 TO 3 := 0;-- 扫描寄存器 BEGIN --------------------显示进程-------------------- PROCESS(p, clk) BEGIN CASE p IS WHEN 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170|180|190|200|210|220|230|240|250 => b0 <= 0; WHEN 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171|181|191|201|211|221|231|241|251 => b0 <= 1; WHEN 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172|182|192|202|212|222|232|242|252 => b0 <= 2; WHEN 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173|183|193|203|213|223|233|243|253 => b0 <= 3; WHEN 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174|184|194|204|214|224|234|244|254 => b0 <= 4; WHEN 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175|185|195|205|215|225|235|245|255 => b0 <= 5; WHEN 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176|186|196|206|216|226|236|246 => b0 <= 6; WHEN 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177|187|197|207|217|227|237|247 => b0 <= 7; WHEN 8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178|188|198|208|218|228|238|248 => b0 <= 8; WHEN 9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179|189|199|209|219|229|239|249 => b0 <= 9; WHEN OTHERS => NULL; END CASE; CASE p IS WHEN 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109|200|201|202|203|204|205|206|207|208|209 => b1 <= 0; WHEN 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117|118|119|210|211|212|213|214|215|216|217|218|219 => b1 <= 1; WHEN 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127|128|129|220|221|222|223|224|225|226|227|228|229 => b1 <= 2; WHEN 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137|138|139|230|231|232|233|234|235|236|237|238|239 => b1 <= 3; WHEN 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147|148|149|240|241|242|243|244|245|246|247|248|249 => b1 <= 4; WHEN 50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157|158|159|250|251|252|253|254|255 => b1 <= 5; WHEN 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167|168|169 => b1 <= 6; WHEN 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177|178|179 => b1 <= 7; WHEN 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187|188|189 => b1 <= 8; WHEN 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197|198|199 => b1 <= 9; WHEN OTHERS => NULL; END CASE; IF (p < 100) THEN b2 <= 0; ELSIF (p >= 100 and p < 200) THEN b2 <= 1; ELSIF (p >= 200) THEN b2 <= 2; END IF; END PROCESS; --------------------分频进程-------------------- PROCESS(clk) VARIABLE cnt1 : INTEGER RANGE 0 TO 100; VARIABLE cnt2 : INTEGER RANGE 0 TO 20; BEGIN IF (clk'EVENT AND clk = '1') THEN IF (cnt1 = 100) THEN cnt1 := 0; IF (cnt2 = 20) THEN cnt2 := 0; clock <= NOT clock; IF (cnt = 3) THEN cnt <= 0; ELSE cnt <= cnt + 1; END IF; ELSE cnt2 := cnt2 + 1; END IF; ELSE cnt1 := cnt1 + 1; END IF; END IF;

EDA-常见实例源程序代码vhdl

第4章用VHDL程序实现常用逻辑电路4.1 组合逻辑电路设计 4.1.1 基本逻辑门 library ieee; use iee.std_logic_1164.all; entity jbm is port(a,b: in bit; f1,f2,f3,f4,f5,f: out bit); end jbm; architecture a of jbm is begin f1<=a and b; --构成与门 f2<=a or b; --构成或门 f<=not a; --构成非门 f3<=a nand b; --构成与非门 f4<=a nor b; --构成异或门 f5<=not(a xor b); --构成异或非门即同门 end; 4.1.2 三态门 library ieee; use ieee.std_logic_1164.all; entity tri_s is port(enable: in std_logic; datain: in std_logic_vector(7 downto 0); dataout: out std_logic_vector(7 downto0)); end tri_s; architecture bhv of tri_s is begin process(enable,datain) begin if enable='1' then dataout<=datain; else dataout<="ZZZZZZZZ"; end if; end process; end bhv; 4.1.3 3-8译码器 library ieee; use ieee.std_logic_1164.all; entity decoder3_8 is port(a,b,c,g1,g2a,g2b: in std_logic; y: out std_logic_vector(7 downto 0)); end decoder3_8; architecture a of decoder3_8 is signal dz:std_logic_vector(2 downto 0); begin dz<=c&b&a; process (dz,g1,g2a,g2b) begin if(g1='1'and g2a='0'and g2b='0')then case dz is when "000"=> y<="11111110"; when "001"=> y<="11111101"; when "010"=> y<="11111011"; when "011"=> y<="11110111"; when "100"=> y<="11101111"; when "101"=> y<="11011111"; when "110"=> y<="10111111"; when "111"=> y<="01111111"; when others=>y<="XXXXXXXX"; end case; else y<="11111111"; end if; end process; 4.1.4 优先编码器

vhdl各种实验程序代码

1.三与门 library ieee; use ieee.std_logic_1164.all; entity yumen is port(a,b,c : in std_logic; f : out std_logic); end yumen; architecture and3_1 of yumen is begin f<=a and b and c; end architecture and3_1; 2.三八译码器 library ieee; use ieee.std_logic_1164.all; entity jg is port(a,b,c,g1,g2a,g2b:in std_logic; y:out std_logic_vector(7 downto 0)); end entity jg; architecture rt1 of jg is signal indata:std_logic_vector(2 downto 0); begin indata<=c&b&a; process(indata,g1,g2a,g2b)is begin if(g1='1' and g2a='0' and g2b='0')then case indata is when"000"=>y<="11111110"; when"001"=>y<="11111101"; when"010"=>y<="11111011"; when"011"=>y<="11110111"; when"100"=>y<="11101111"; when"101"=>y<="11011111"; when"110"=>y<="10111111"; when"111"=>y<="01111111"; when others=>y<="xxxxxxxx"; end case; else y<="11111111"; end if; end process; end rt1; 3.同步复位/置位、下降沿触发的d触发器ibrary ieee; use ieee.std_logic_1164.all; entity adff is port(clk,d,r,s:in std_logic; q:out std_logic); end adff; architecture rtl of adff is signal q_temp,qb_temp:std_logic; begin process(clk,r,s) begin if(clk'event and clk='0')then if(r='0' and s='1')then q_temp<='1'; if(r='1' and s='0')then q_temp<='0'; else q_temp<=d; end if; end if; end if; end process; q<=q_temp; end rtl; 4.异步复位/置位、上升沿触发的d发器ibrary ieee; use ieee.std_logic_1164.all; entity adff is port(clk,d,r,s:in std_logic; q:out std_logic); end adff; architecture rtl of adff is signal q_temp,qb_temp:std_logic; begin process(clk,r,s) begin if(r='0' and s='1')then q_temp<='1'; elsif(r='1' and s='0')then q_temp<='0'; elsif(clk'event and clk='1')then q_temp<=d; end if; end process; q<=q_temp; end rtl;

VHDL代码书写规范

VHDL代码书写规范 (定稿) 文件编号: 编制: 审核: 可靠性审核: 标准化: 批准:

文件会签页 文件历史记录 文件编号 现行版本V1.0 文件标题VHDL代码书写规范 文件履历 版次编制日期更改内容(条款) V1.0 V1.0

目录 1.目的 (1) 2.范围 (1) 3.术语说明 (1) 4.书写规范 (1) 4.1命名规范 (1) R1.一个文件只包含一个模块,文件命名和实体命名必须相同。文件名大写,其后缀小写。 (1) R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称) (1) R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。 (2) R4.命名要有实际意义。 (2) R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。 (2) R6.模块、信号、变量等的命名不大于64个字符 (2) R7.实体、结构名、端口信号、常量用大写标识 (2) R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。 如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。 (3) R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀; FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。 (3) R10.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。 (3) R11.模块内部定义的信号、变量采用首字母大写命名。首字母符合说明的要求。 (3) R12.非顶层模块端口信号命名方式采用I_portname、O_portname和IO_portname分别对应输入、输出和双向端口信号。 (3) R13.时钟信号必须用后缀“_clk”进行命名。 (3) R14.对于微处理器接口的寄存器,必须包含reg标志。用下划线分开该寄存器功能特征。 (4) R15.对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。多次采样加数字区分。 (4) R16.一些常用的基本信号按说明统一后缀命名。 (4) R17.多比特信号,应该使用相同的比特顺序,都采用downto描述。 (5) R18.VHDL的保留字用小写。 (5) R19.调用IEEE 标准库时,“IEEE”用大写,其它用小写。 (5) 4.2注释规范 (5) R20.每个VHDL源文件应该在文件头注释文件的基本信息。 (5) R21.每个信号、变量、常量和端口的定义都要有注释。 (5) R22.每个进程使用“--------”隔开。如果一个功能模块由几个进程组成,使用”--*****”隔开。 (5) R23.对于内部表,注释说明表的组成、表的内容及作用。 (6) 4.3其它书写规范 (6) R24.用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格。 (6) R25.每行字符数,最大不能超过120。 (6)

VHDL源代码-计数器

十五计数器 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY fiveteencout IS PORT(clk,reset,enable : IN std_logic; count : OUT std_logic_vector(3 downto 0)); END fiveteencout; ARCHITECTURE counter OF fiveteencout IS SIGNAL count_int:std_logic_vector(0 to 3); BEGIN PROCESS(clk,reset) BEGIN WAIT UNTIL rising_edge(clk); IF reset = '1' THEN count_int <= (OTHERS => '0'); ELSIF enable = '1' THEN IF(count_int="1110") THEN count_int<="0000"; ELSE count_int <= count_int 1; --ELSE -- NULL ; --IF (count_int="1001") THEN --count_int<="0000"; END IF; END IF; END PROCESS; count <= count_int; -- IF (reset='0') then --q<="0000"; ---ELSIF(clk'event and clk='1') THEN --q<=q 1; --IF (q<="1001") then --q<="0000"; ---END IF;

EDA 常见实例源程序代码vhdl

第4章用VHDL程序实现常用逻辑电路 4.1 组合逻辑电路设计 4.1.1 基本逻辑门 library ieee; use iee.std_logic_1164.all; entity jbm is port(a,b: in bit; f1,f2,f3,f4,f5,f: out bit); end jbm; architecture a of jbm is begin f1<=a and b; --构成与门 f2<=a or b; --构成或门 f<=not a; --构成非门 f3<=a nand b; --构成与非门 f4<=a nor b; --构成异或门 f5<=not(a xor b); --构成异或非门即同门 end; 4.1.2 三态门 library ieee; use ieee.std_logic_1164.all; entity tri_s is port(enable: in std_logic; datain: in std_logic_vector(7 downto 0); dataout: out std_logic_vector(7 downto0)); end tri_s; architecture bhv of tri_s is begin process(enable,datain) begin if enable='1' then dataout<=datain; else dataout<="ZZZZZZZZ"; end if; end process; end bhv; 4.1.3 3-8译码器 library ieee; use ieee.std_logic_1164.all; entity decoder3_8 is port(a,b,c,g1,g2a,g2b: in std_logic; y: out std_logic_vector(7 downto 0)); end decoder3_8;

VHDL+Verilog良好的代码编写风格

VHDL+Verilog良好的代码编写风格(二十五条) 田Sir 发表于: 2010-4-28 13:56 来源: 湖北师范学院电工电子实验教学示范中心良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;(13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals; (16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误; (17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性; (18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数; (19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复; (20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准; (21)在设计中不要直接使用数字,作为例外,可以使用0 和1。建议采用参数定义代替直接的数字。同

交通灯控制器-VHDL语言编写代码

------------------------------------- -- Title:交通灯控制器-- -- Author:Pan Hongtao -- -- Data: 2006-10-1 -- ------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; -------------------------------------------------------------------- entity exp18 is port( Clk : in std_logic; --时钟输入 Rst : in std_logic; --复位输入 R1,R2 : out std_logic; --红灯输出 Y1,Y2 : out std_logic; --黄灯输出 G1,G2 : out std_logic; --绿灯输出 Display : out std_logic_vector(6 downto 0); --七段码管显示输出 SEG_SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动 ); end exp18; -------------------------------------------------------------------- architecture behave of exp18 is signal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(6 downto 0); signal SEC1,SEC10 : integer range 0 to 9; signal Direction : integer range 0 to 15; signal Clk_Count1 : std_logic_vector(9 downto 0); --产生0.5Hz时钟的分频计数器signal Clk1Hz : std_logic; signal Dir_Flag : std_logic; --方向标志 begin process(Clk) begin if(Clk'event and Clk='1') then if(Clk_Count1<1000) then Clk_Count1<=Clk_Count1+1; else Clk_Count1<="0000000001"; end if; end if; end process;

CPU VHDL代码及详细注释

一个TISC的模拟cpu代码,一共有200多行,不过麻雀虽小,却五脏俱全,而且作者对每行代码都做了详细的说明,下面仔细的分析一下。 先看看作者写的指令说明: -- Vins VHDL Tisc CPU Core, 15th Nov 2001 -- My first attempt at processor design, thanks to :--- Tim Boscke - CPU8BIT2, Rockwell - 6502, Microchip - Pic -- Jien Chung Lo - EL405 , Steve Scott - Tisc, -- Giovanni Moretti - Intro to Asm -- Uses 12 bit program word, and 8 bit data memory -- 2 reg machine,accumulator based, with akku and index regs -- Harvard architecture, uses return x so as to eliminate need of pmem -- indirect instructions like 8051. -- pc is 10 bits, akku and idx are 8 bit. -- Has carry and zero flags, -- three addressing modes:- immediate, indirect and reg. -- seperate program and data memory for pipelining later... -- Instructions coded as thus:- -- Long instructions first - program jump. -- Both store return address for subroutine calls, 1 deep stack. -- 0 0 xxxxxxxxxx jc pmem10 ; if c==1, stack = pc, pc <- pmem10, fi -- 0 1 xxxxxxxxxx jz pmem10 ; if z==1, stack = pc, pc <- pmem10, fi -- Immediate ops -- bits 9 and 8 select what to do -- 1 00 0 xxxxxxxx lda #imm8 ; a= imm8, c=0, -- 1 00 1 xxxxxxxx ret #imm8 ; a= imm8, pc = stack -- 1 01 0 xxxxxxxx adc #imm8 ; add with

基于FPGA的VGA显示详解(附VHDL代码)

基于FPGA的VGA显示(后附VHDL代码) 整个VGA的时序操作很简单,就是形成一个具有一定占空比的电平周期。只是整个VGA的操作涉及到一些专有名词,理解上比较困难,一旦明白了这些是什么意思后,操作即将变得很简单。 VGA工作流程: 常见的彩色显示器,一般由CRT (阴极射线管)构成,彩色是由R、G、B(红、绿、蓝)三基色组成,CRT用逐行扫描或隔行扫描的方式实现图像显示,由VGA控制模块产生的水平同步信号和垂直同步信号控制阴极射线枪产生的电子束,打在涂有荧光粉的荧光屏上,产生R、G、B三基色,合成一个彩色像素。扫描从屏幕的左上方开始,由左至右,由上到下,逐行进行扫描,每扫完一行,电子束回到屏幕下一行的起始位置,在回扫期间,CRT对电子束进行消隐,每行结束是用行同步信号HS进行行同步;扫描完所有行,再由场同步信号VS进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。行同步信号HS 和场同步信号VS是两个重要的信号。 注意点: 什么时候消隐?为什么要消隐?当一行扫描完毕后然后电子枪又转到下一行的这段时间或是扫描完所有的行后电子枪回到第一行的这段时间,这两段时间都要消隐。在消隐的时间内,数据是无效的。这样就保证电子枪的回扫的个动作不干扰显示,因为回扫这个动作是很频繁的,若在这个时间段内数据有效,那么就回在显示屏上出现电子枪回扫的轨迹。 消隐的时候我们干什么?消隐这个动作是显示屏(CRT)执行的,我们在编程时只要注意有这么个东西就行。 同步信号(包括HS和VS)是什么?这个就相当于一个数据起始信号,表明数据马上就要开始了。如果撇开具体的设备,那么这个信号和AD、DA中常用的Sync(同步)、CS(片选)信号相当。该信号一般为负电平,但对于有的显示器可不关心该信号的极性,因为它内部可自动转换正负逻辑。 对于普通的VGA显示器,需要引出5个信号:R,G,B:三原色;HS:行同步信号;VS:场同步信。对于VGA 显示器的上述五个信号的时序驱动要严格遵循“VGA工业标准”,即640×480×60HZ模式,否则无法显示正确地图象。 VGA工业标准要求的频率: 时钟频率:25.175MHz(像素输出的频率) 行频:31469Hz(即行信号HS的频率) 场频:59.94Hz(即场信号VS的频率)(每秒图像刷新频率) 行扫描时序图: 各个参数的意义和时间长度(时钟频率为25MHz) Ta:水平同步脉冲,这里为负电平,96个时钟周期 Tb+Tc:行消隐后沿时间,高电平,48个时钟周期 Td:视频数据有效时间,高电平,646个时钟周期 +Tf:行消隐前沿时间,高电平,16个时钟周期 Te

VHDL实现分频器

在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。我们知道,在硬件电路设计中时钟信号时非常重要的。 下面我们介绍分频器的VHDL描述,在源代码中完成对时钟信号CLK的2分频,4分频,8分频,16分频。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY clkdiv IS PORT(clk : IN STD_LOGIC; clk_div2 : OUT STD_LOGIC; clk_div4 : OUT STD_LOGIC; clk_div8 : OUT STD_LOGIC; clk_div16 : OUT STD_LOGIC); END clk_div; ARCHITECTURE rtl OF clk_div IS SIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(clk) BEGIN IF (clk’event AND clk=’1’) THEN IF(count=”1111”) THEN Count <= (OTHERS =>’0’); ELSE Count <= count +1; END IF ; END IF ; END PROCESS; clk_div2 <= count(0); clk_div4 <= count(1); clk_div8 <= count(2); clk_div16 <= count(3); END rtl; 对于分频倍数不是2的整数次幂的情况,我们只需要对源代码中的计数器进行一下计数控制就可以了,如下面源代码描述一个对时钟信号进行6分频的分频器。 ENTITY clkdiv IS PORT(clk : IN STD_LOGIC; clk_div6 : OUT STD_LOGIC); END clk_div;

VHDL语言编写规范

VHDL语言编写规范 目录 目录 (1) 1 目的 (2) 2 范围 (2) 3 定义 (2) 4 规范内容:VHDL编码风格 (2) 4.1 标识符(Identifiers)命名习惯 (2) 4.2 数据对象和类型 (4) 4.3 信号和变量 (5) 4.4 实体 (5) 4.5 语句 (7) 4.6 运算符(Operator) (10) 4.7 function (10) 4.8 procedure (11) 4.9 类属( generics) (11) 4.10 package (12) 4.11 FSM(有限状态机) (12) 4.12 Comments (12) 4.13 TAB键间隔 (12) 4.14 语句书写规范规定 (13) 5 程序中的注释 (13) 6 代码模块划分 (14) 7 代码编写中容易出现的问题 (15) 7.1 资源共享问题 (15) 7.2 组合逻辑描述的多种方式 (15) 7.3 考虑综合的执行时间 (16) 7.4 避免使用Latch (16) 7.5 多赋值语句案例:三态总线 (16) 附录一VHDL保留字 (18) 附录二函数书写实例 (19) 附录三参数化元件实例 (20) 附录四程序包书写实例 (21)

1 目的 编写该规范的目的是提高书写VHDL代码的可读性、可修改性、可重用性;优化代码综合和仿真结果,指导设计工程师使用VHDL 规范代码和优化电路,规范化公司的ASIC/FPGA 设计输入,从而做到: a、逻辑功能正确; b、可快速仿真; c、综合结果最优; d、可读性最好。 2 范围 该规范设计VHDL编码风格、规定,编码中应注意的问题,VHDL代码书写范例等,适用于所有的采用VHDL代码进行设计的项目。 3 定义 VHDL:Very high speed IC Hardware Description Language,甚高速集成电路的硬件描述语言。 FSM:Finite Status Machine,有限状态机 Simulate:仿真,通过输入激励在计算机上验证设计是否正确。包括RTL仿真和门级仿真。 模拟:是指对一个物理器件的结构、功能或其他特性如延时特性等用抽象的语言或高级语言(如用C语言进行算法描述)所进行的建模。 4 规范内容:VHDL编码风格 设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态,便于对程序代码的修改、学习。 本文中提到的VHDL编码规则和建议适用于VHDL的任何一级(RTL,behavioral,gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 4.1 标识符(Identifiers)命名习惯 标识符用于定义实体名、结构体名、信号和变量名等,选择有意义的命名对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则,包括VHDL语言的保留字。 1. 标识符定义命名规定

相关文档