字符发生器的设计一、实验目的:1、掌握字符发生器原理;2、通过自己完成程序设计,掌握字符发生器的设计方法;3、通过自己完成程序设计,掌握VHDL的编程方法;二、设计要求:1、自己完成各模块的程序编写;2、设计的字数必须超过9个字以上(包含9个字);3、字符中包含自己的名字;三、使用硬件:16×16LED点阵,FPGA芯片(CycloneEP1C12Q240C8)及连线;四、设计原理1、LED显示原理16X16的点阵显示是传统的点阵显示的基本应用,它是很多复杂的显示的基础。这种点阵的显示可以使用多种方法来实现,其中所用到的期间也不尽相同,但是很多基本的算法和思想都是相同的,只是根据不同的硬件,具体的方法有所区别。目前这种简单的显示方法已经很成熟了,很多地方会用到它。例如在火车站、机场、银行、证券公司等公共场所的信息显示都是用的点阵显示。有些场所使用了一些更为复杂的点阵。随着硬件水平的提高,显示的效果会更加美观。现设计一个16X16点阵。要求汉字可不断地循环显示,并且使每个汉字之间有停顿。一个汉字,常见的是16×16的点阵,256个发光点。这些点,并不是同时发光的。如果每一瞬间,只有一行发光,那就需要把整个的汉字“横向取模”,送到显示屏;如果每一瞬间,只有一列发光,那就需要把整个的汉字“纵向取模”,送到显示屏。16×16扫描LED点阵的工作原理同8位扫描数码管类似。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯。所以其扫描译码地址是4位信号线。其汉字扫描码由16位段地址(l0-l15)输入。通过时钟的每列扫描显示完整汉字。2864E2PROM存储器是电擦除/编程的只读存储器,容量为8K×8Bit,有13位并行地址线和8位并行数据线,而一个完整的字符所需的存储空间为32字节即32×8Bit,也就是说2684最多可连续存256个16×16点阵字形。存储方式可事先约定好。本设计就是要通过CPLD芯片产生读时序,将字形从2864中读出,然后产生写时序,写入16×16的点阵,使其扫描显示输出。2、字库格式说明这是一16×16点阵字库,一个字占32个字节,例如“正”:◎所对应的32个字节是:W0“00000000”,W1“00000000”,W2“00000000”,W3“00000000”,W4“00010000”,W5“00001000”,W6“00010000”,W7“00001000”……五、设计程序及仿真图libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydots_testis图4-2-1port(clk:instd_logic;dotout:outstd_logic_vector(15downto0);selout:outstd_logic_vector(3downto0));enddots_test;architectureaofdots_testissignalsel_tmp:std_logic_vector(3downto0);signaldot_tmp:std_logic_vector(15downto0);typedot_typeisarray(0to15)ofstd_logic_vector(15downto0);--定义16个长度为16位的数组,用来存放每一行的显示值signaldotout_tmp:dot_type;constantdotout_tmp1:dot_type:=--自(x0000,x0000,x0000,xFFF8,x4448,x4448,x4448,x444A,x444B,x444C,x4448,x4448,xFFF8,x0000,x0000,x0000);constantdotout_tmp2:dot_type:=--动(x0000,x0000,x3FF0,x4010,x2010,x03FF,x0C10,x1010,x2420,x4E24,x0524,x0C24,x08E4,x0B24,x1C24,x0820);constantdotout_tmp3:dot_type:=--化(x0000,x0000,x7880,x401C,x4030,x4060,x40C0,x3FFF,x0100,x0200,x0402,x0007,x7FF8,x0020,x0040,x0080);constantdotout_tmp4:dot_type:=--二(x0000,x1000,x1800,x1004,x1006,x1004,x1004,x1004,x1004,x1004,x1004,x1004,x1004,x1004,x1000,x0000);constantdotout_tmp5:dot_type:=--班(x0000,x2042,x2042,x2042,x3FFE,x2042,x2042,x2000,x07FF,x1800,x20E0,x4942,x8842,x0FFE,x1042,x1042);constantdotout_tmp6:dot_type:=--白(x0000,x0000,x0000,x7FF8,x2108,x2108,x2108,x2108,x2108,x210B,x210C,x2108,x2108,x7FF8,x0000,x0000);constantdotout_tmp7:dot_type:=--红(x0000,x4008,x600C,x4008,x4008,x7FF8,x4008,x4008,x4008,x4000,x5218,x1260,x12A3,x232C,x6630,x2220);constantdotout_tmp8:dot_type:=--梅(x0000,x1104,x1104,x7FF4,x9114,x5594,x1354,x1114,x1FF7,x0118,x01A0,x0050,xFFFF,x00D0,x0310,x0410);constantdotout_tmp9:dot_type:=--和(x0000,x0000,x3FF8,x1008,x1008,x1008,x3FF8,x0000,x0422,x0E22,x0122,xFFFC,x01A4,x0624,x0824,x1000);constantdotout_tmp10:dot_type:=--(x0000,x0400,x4400,xC480,x64BE,x24A2,x14A2,x0CA2,x07A2,x0CA2,x14A2,x24A2,x44BE,x4480,x8400,x8400);constantdotout_tmp11:dot_type:=--(x0000,x0000,x7FFF,x8111,x4111,x0111,x0111,x07FF,x1800,x2000,x43FE,x0222,x0222,x0222,x03FE,x0000);constantdotout_tmp12:dot_type:=--(x0000,x0040,x0840,x0940,x0922,x0926,x091A,xFF92,x092A,x0946,x0942,x0818,x00E2,xFF01,x0460,x0410);signalscan_sel:std_logic_vector(3downto0);signalclk_value:std_logic_vector(3downto0):=(others='1');constantclk_value_store:std_logic_vector(3downto0):=(others='1');signalkey_tmp:std_logic_vector(3downto0);beginconnection:blockbegindotout=dotout_tmp(conv_integer(scan_sel));selout=scan_sel;endblockconnection;scan_display:block--扫描显示及时钟分频beginclock_divisor:process(clk)beginifrising_edge(clk)thenif(clk_value=clk_value_store)thenscan_sel=scan_sel+1;endif;clk_value=clk_value+1;endif;endprocessclock_divisor;endblockscan_display;Free_Counter:Block--计数器--产生扫描信号SignalQ:STD_LOGIC_VECTOR(40DOWNTO0);SignalS:STD_LOGIC_VECTOR(3DOWNTO0);Begint1:PROCESS(clk)--计数器计数BeginIFclk'EventANDclk='1'thenQ=Q+1;ENDIF;S=Q(27DOWNTO24);if(s=0)thenforiin0to15loopdotout_tmp(i)=dotout_tmp1(i);endloop;elsif(s=1)thenforiin0to15loopdotout_tmp(i)=dotout_tmp2(i);endloop;elsif(s=2)thenforiin0to15loopdotout_tmp(i)=dotout_tmp3(i);endloop;elsif(s=3)thenforiin0to15loopdotout_tmp(i)=dotout_tmp4(i);endloop;elsif(s=4)thenforiin0to15loopdotout_tmp(i)=dotout_tmp5(i);endloop;elsif(s=5)thenforiin0to15loopdotout_tmp(i)=dotout_tmp6(i);endloop;elsif(s=6)thenforiin0to15loopdotout_tmp(i)=dotout_tmp7(i);endloop;elsif(s=7)thenforiin0to15loopdotout_tmp(i)=dotout_tmp8(i);endloop;elsif(s=8)thenforiin0to15loopdotout_tmp(i)=dotout_tmp9(i);endloop;elsif(s=9)thenforiin0to15loopdotout_tmp(i)=dotout_tmp10(i);endloop;elsif(s=10)thenforiin0to15loopdotout_tmp(i)=dotout_tmp11(i);endloop;endif;ENDPROCESSt1;EndBlockFree_Counter;enda;仿真图自(x0000,x0000,x0000,xFFF8,x4448,x4448,x4448,x444A,x444B,x444C,x4448,x4448,xFFF8,x0000,x0000,x0000);;六、心得体会通过这次CPLD实验我不但对理论知识有了更加深的理解,对于实际的操作和也有了质的飞跃。试验中,反复摸索老师给出的程序后,逐渐认识了整个程序,搞清楚了原理,做出相应的修改,通过反复调试,终于能成功的在16X16的点阵显示上显示11个字以及更多字,再次过程中,还第一次用到字模软件,并且摸索之,使得试验中可以出现正立的汉字,经过这次的实验,整体对各个方面都得到了不少的提高,如团队精神、交流能力、独立思考、信息的捕获能力以及分析问题和解决问题的能力方法等,提高了自己动手能力得到很好的锻炼。