1、 掌握 QuartusII 宏功能模块的设计方法。 2、 掌握 VHDL 设计 ROM 和 RAM 的方法。 3、 掌握三态总线的设计与使用方法。 4、 掌握4X 4键盘扫描模块设计方法。 5、 掌握 PS2 接口电路设计方法。
6、 了解0X 480VGA显示控制电路的原理和设计方法。 二、 实验的硬件要求: 1、 EDA/SOPC 实验箱。 2、 计算机。 三、 实验原理
1、 QuartusII 宏功能模块应用
Altera 提供多种方法来获取 Altera Megafunction Partners Program(AMPP ?)和
MegaCore? 宏功能模块, 这些函数经严格的测试和优化, 可以在 Altera 特定器件结构中 发挥出最佳性能。可以使用这些知识产权的参数化模块减少设计和测试的时间。 制器中的宏功能模块。
Altera 提供的宏功能模块与 LPM 函数有:
① 算术组件: 包括累加器、加法器、乘法器和 LPM 算术函数; ② 门电路: 包括多路复用器和 LPM 门函数。
③ I/O组件:包括时钟数据恢复(CDR)、锁相环(PLL)、双数据速率(DDR)、千兆位 收发器块 (GXB) 、 LVDS 接收器和发送器、 PLL 重新配置和远程更新宏功能模块。 ④ 存储器编译器:包括 FIFO Partitioner、RAM和ROM宏功能模块。 ⑤ 存储组件: 包括存储器、 移位寄存器宏模块和 LPM 存储器函数。
宏功能模块应用可以通过元件库中的“ Megafunctions/LPM ”或“ MegaWizard Plug-In Manager”进行参数化设置并使用。其操作方法请参考\"
2、 ROM 和 RAM 存储器设计
用 FPGA 实现 ROM 和 RAM 存储器可以用逻辑单元, 用 VHDL 直接构造存储器时用的是逻辑单元,对于内含 逻辑单元。
一般较大规模的 ROM 和 RAM 使用“ MegaWizard Plug-In Manager” 定制,而较小规 模,且有特殊特性要求时用 VHDL 直接构造。 3、
四、实验内容:
1、 QuartusII 宏功能模块实现 ROM 存储器模块 ① 新建一个原理图文件。
② 使用“ MegaWizard Plug-In Manager ”向导,按图3.1的步骤定制一个 32 X 8bit的ROM
也可以用内含的 EAB/ESB ,一般 EAB/ESB 的 FPGA 芯片,使用 QuartusII基于宏功能模块的设计 ”。
MegaCore
和 AMPP 宏功能模块包括应用于通信、数字信号处理 (DSP) 、 PCI 和其它总线界面,以及存 储器控
“MegaWizard Plug-In Manager ”定制存储器,可选择使用 EAB/ESB ,这样可以节约大量的
模块。
③ 建立内存初始化文件
Quartusll能接受的LPM_ROM 中的初始化数据文件的格式有2种:Memory
In itializatio n File (.mif)格式和 Hexadecimal ( I ntel-Format)File (.hex)格式。内存初始化 文件可以手工编写, 也可以用其它软件生成。 本例数据量较小, 可以在QuartusII中直接file
T
newT .......... Memory File Memory Initialization File ,然后填写每个存储单元的数据(如:
iDCaTiiard Pluf-Ln I^a:a雷x Tpa J Aalhretc N CcrnruiE stiEni Which decree la~ni I,))JUIbe nW 戶iu r iHDt s 适用的 芯片系列 3 L__ 8 /a tei^SO/iyaru::/ M D=-P ifl -ma I L . M啊 言 Irtafscet JtA£ s 二呑洱 bb =ritEn=tjm Biowce... 、 生成的 VHDL 源文件名 Noir T c ccr nk: y p-qw-' r lie Oiwiij >uui !_urt n iFfe? P'-ISLILdiedui^,inti- IhlAfi^ I^HEFBCI F UfFQp'QnT dkiopbGBi (Tai^E rnpri-p u n a T bi^fr'Spddli^d ir the」爼顿 Lit归口也总捌 lhE:Se:'lingE:dd\\>j bra |4射缈 rurH ES 刖| i DU* ojmert JSKI IltnaydieclDiie: die 启动\"Mega Plug-In Manager A3M- 2-FGRr Shlf^giffeftRAM-b ai id IPM-KHSXOIS Fki^InPaisgc -.. DK Ca™i 0~31依次递增)即可。 nliel ien 图 3.1 使用\"MegaWizard Plug-In Manager ”定制 ROM 1-F9RT Fl^Q [^ilfciQn^r Merxrji 2TORT WIRT Whic+i MB tf WJTDUi ik) Oo 跑 u 礙nt 广 选择VHDL 语言设计 Wi \"t nene ?O?CLJ lit7 - iri:hcj]itpir •工胡椰持年対」 ④ 生成图3.2所示的ROM模块添加管脚,编译并仿真测试。 图3.2测试ROM模块 2、Quartusll宏功能模块实现RAM存储器模块 RAM 与ROM定制方法相似,按图 3.3定制一个 32X 8bit —端口 RAM,该RAM 读写 共用一 个地址总线,“wren”为写入信号,高电平有效。除了一端口 RAM,还有二端口、三 端口 RAM,也可以采用读写地址总线分开的形式。还有一种形式,读写数据采用同一条总 线,应使用三态总线,且读写控制必须分开进行。 --dst戒工1 -L- RAW 1 port :'doc(< :丽乖可… -:如歸轴 a XSVTVWVTWWWTrWWWV ,:wren :wieh ird 叭味协聘属UTO 7 2£咄『&£5:何叮I 2D刖也 寸片>Wcr 開IB晤 44.12 M End ■ ..................................... S』 图 3.3 32 X 8bit 一端口 RAM 图3.4为仿真波形,注意观察哪些地址位写入了什么数据? 图3.4 一端口 RAM仿真波形 3、用 ■ 3IA D u H.D K LU p :M SS D bE ZHL D u 3lj]. D M jgaw网河砌 VHDL 设计 ROM 和 RAM 户會 ■GiTQ 41 >E HDD UK m. □ XA :M jgll TLTLrJLinrmnnnimnnnnrmZLrLrLrLrLrLrmrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLnr 用VHDL可以非常灵活地设计各种特性的存储器。图 RAM的VHDL代码。 3.5和图3.6分别是实现 ROM和 use iecc.Bt.d_lcgis_L16i19allr u=i- I eP 31 d 1 cgi匚 uiLS id.r a 11 ~ EtiXity term IE port ( Ed匚; in std Loijic_vrc:t□匚 t斗 dcncmto Oj ; CLE OUX St 0^Log 1 C_V£Ctat: (7 HOUffi\" 0 (J) cchitccturc bch 口 f krmn isi . -定义存储字子类型和数组类 耳山口£亍单VQZ<3 Is sc.d ggg vectQr (\"T doirncQ Q); type zuoro匚y array (□ to 31) o± -型用于存储数据 一…—一一一一袂用数组垛型常呈初竹比44存储粥 x,pi04*,rxrD5ff^H,0fi,,,iP sfa?^ 1 旷呃 J 汕D9J 泸口矗 J 汕QBJ K V JCFDJ xPEh xSF% KrTlAir1|i HrrLB,nirKBTlC,r1,Mrr ID\"』”斤二也“(3{「丄jrnj - adtr_ifi hcgiLii 图3.5 一端口 ROM存储器VHDL代码 图3.5的ROM存储器采用组合逻辑电路方式设计,从下面的功能仿真波形可以看到, 输出“ d”与地址“ adr”同步变化。请改用时序逻辑电路方式实现,该怎么描述?输出“ L70.C 忙 d” MSEIW TmsE-ac ・、血12 311.?! n? Into*---at Enl Jll.U 31 与地址“ adr”的时序关系是怎样的? i2t 卩 已$ 1也 p UT 创,p ■三 创0 :£ “弓 中是如何描述三态总线的? 图3.6的RAM读写数据采用一条总线“ d”,“ d”应使用“ inout”类 型端口,注意代码 (要点:没有数据输出的时候 (只有wr=0并且cs=1时才输出数 据),“d”应设置为高阻态,即释放总线,允许总线输入数据。 llt)rarv leee; ) use ie-e■3 td logic 11 ・厲丄丄; use j_e±e ・£t*cl 1 c«gic uza.3 rgned.・u丄丄; entity is oort ( clR^wr^&s: m sT-tt_loi3ic; SLdr: Ln sta_io5ric:_vector(4 do war o o): 1: 1 nout Htd_loglc_Yectar (7 douncti DJi ); 亡 nd ter amj architecTure beh of kraw is 3 us type 财口上口 is s c d_ i o a 1 c^_vec t □ r( 7 do unco oj: EMfinu^y 丄凸 Lay |0 LG 3丄)uf word; adt_丄us in&cgcr JL auge 0 bo 3 3i3rnal orouswcMary? ir!..i_ir,i -,i ,, r nv=1 M j ] (>.-. = ' 11 j 1 else |otbers->* Z'| ; pE3Ced3|clk) begin if (elk1 event Rnd clk» 1 I1 ) ch.en if (wr»' 11 and cy®111) th^ri| --其余时假亦干音阻态,此时可歐Ml入数据 --wr- O' and cs-1 11 曹上朋 (adr in) tnd 1£; cud ; snd process; «nd b«ih? 图3.6 一端口 RAM存储器VHDL代码 在仿真设置时,双向端口“ d ”设置的值是外部电路输入值,而“ d”总线最终的值显示 在d[i]~result上。在数据输出的时候(wr=0并且cs=1),“d”应设置为高阻态(即外部电路 应释放总线)。图3.7为一端口 RAM存储器仿真波形。图中,当 cs=1、wr=1时(对应地址 04〜11 )写入数据,此时应设置\"d”总线的值(如04~11依次递增),数据被写入相应地址。 其余时候“ d”设置为高阻(“Z”)。cs=1、wr=0时读出数据,后面一段显示读出的各个地址 位的数据(未写入数据的地方保持初始化的“ 0”),数据输出“ d”与地址“ adr”是否有延 时?为什么? 。 cs=0 (片选无效),无论wr的值是什么,总线都保持高阻态 “Z”。 4、用ROM作为流水灯数据输入,并测试 用16个LED灯可以显示出各种奇妙的显示效果,实际上是在每个时钟节拍输出 16位 的数据显示在LED上。需要显示的数据预先写好存储在 ROM中,设置ROM中的数据就可 以显示任意的图案。 按图3.8设计一个ROM存储器和一个计数器。 ROM存储器位宽:16bit,容量:256个 字,用LED.MIF作为初始化文件(下载 LED.TXT 改名为LED.MIF )。计数器(counter)也 可以用宏功能模块(在“ Arithmetic ”中的“ LPM_COUNTER ”),采用 “q”为8位输出的 默认设置,即可得到一个 0〜255的加法计数器。计数器输出作为 ROM地址输入,这样可 以按时钟节拍依次输出 0〜255各个地址的数据。 将图3.8的原理图作为顶层文件编译后下载到实验箱。时钟频率使用 10HZ,输出端连 UDLnHr LU 汕」R0NII* 1 【a巧Q!廿血1!卄”…'尸_干■■■ ■训罚『 --- 接 16个LED灯。 图3.8 ROM作为流灯的输入测试电路 5、4X 4键盘扫描模块设计 -FD ① 图3.11是4X 4键盘阵列电路原理图。行字符 ROW[3..0]表示一行的状态,COL[3..0] 表示一列的状态。使用时采用行扫描方式检测按键, 即设置 COL[3..0]中某一位为“ 0”,其 ■pnJjB- P1MJ99 — PIMJOO P1HJ01 PN 102 PWJ03 : PfN 104 PINJ0S PIN lJt PiN 1Q7 PIN 103 PWJ13 MN 114 P1M 11S ' PWJIfl PW 117 余为“1”,女口 COL= “1011 ”(COL[2]=''表示选择第三 行(COL[2]对应一行);然后检测 ROW[3..0]的值,全“ 1”说明没有任何键按下,为“ 0” 一位表示该 列有键按下,如 ROW= “0101 ”表示第二和第四列(R0W[2] 、R0W[4]对应列)被按下;结合 COL和ROW即可 确定按键值(如“ 8”和“ C”)。 ROW| i}| ■ ROlVp] REVPJ ROWp| — i * ------ 0 ------- O ------- 1* ----- 1> 1 1 彳 o -------- 1 6 ~ o ------- A ■ P 1 O ------ G 4 O ------- -- O O - 1 1 ---- o i —Mi— • o ------- B COL|1J ■ O ------ G O ------- 1 1 i— ----------------------- 1 i O 1 O - 1► --- ©~ ---------------- c • 1 COLL\\ > ----- 0 O ------- i ------ O O ------- 1| 申 Hr - o o ------- 1 l > o o ------- 1 D COL[3]J10Krte r 盘K [ nos L J [ vcc L vcc vcc vcc 图3.11 4X 4键盘阵列电路原理图 ② 图3.12是键盘扫描模块 VHDL源码。注意:是如何判断键盘按下时刻的? : LLtorary leee; use iee®.std_logic_11 •氧】1; lece • md_】ogic_ a匚 i th.al 1 ; us* logic unsigned.all: entity RcadKeybcard io port( ciriKHc : m stn_joaic;―叶钳信号 □td logic vcctor(3 dovKto 0); sLa_ioaic_vector(3 P:r :in downvo 0); std^logic; ―当前茨锻逍示 Kc :baXXer □ td^loqic; ―上一刘按键厚不 : out P:E7_State FRS^KET^Sta^e <5td lcfjic? vector (4 downto 0) ■-谚取的锂盘数芋, 一将B6玛F民一住: : out BCDOUT ' 最哥位为、、了正牯显示原来的-O-F-r 一虽蒿位为r•足示埒殊符号,T::LL夫:buffer 示非主输入或没有键砂按下 ); enJ Read_Keyfcoard; 0± Read_Keyboard LS Architecture toena\\re keyr / k=yc Ircount kf : ntd_logic_vcctor(3 dovntc 0); signal :std_iogic_veccor (1 aounrc o); 一律31 彳亍扫摊讨数瞬 lcgl^ klLag2 3ignal :rtdZlogic;・-kflagZid录上一刻缱盘秋态,kf “gl记亲当\"魂盘伏态 □ignal beam KEY_Statc<^kflagl; P RE^KE T_S t ate<-k.£lau2; process (ClklKHzl ■■扫搖虢盘 be^in ir (CiiciKHz・ava“t: and CIJC1KH?:=, 1*) th^n if (Kr=rfllllM) chcn 一琢行扫挣钵盘,官机扫梅到射某一行有特镭按下. 一此时Jcc 中为O的位即力行数,肚中为O的社即力乳数 kflaaK-'O1 ; if (kcoimt=Q) then kc<-r1110R; eisir(Kcount=i| -扫描第_行 kc<=p1101r; then elsll(kcounc=2 I 一扫拦黑二行 kc^^LOll1-; Chen else r fcc<«0111r: 一扫提第匹行 end if; tcount<«Kcount4-i; else gm® L» ; keyr<»Zr; keyc<-Kc; pnd if; kflag3<-kf LagL;--存倚上一刻的技键状态 eno ir; end process; 11 (ClklKHz 1 event and CltlKHs-' 1' ) men if nkflagl-'1 and fcflag2-10' then 一按键期芒肆放\"状态转鼻广按下詛转惑时读取搔键值 it(feethen elsii (fteyr-^lioi1*) tnen case iceyc is When wnen Ww 110rr=>BCDOUT< = \"OOOLDrr; w iioirr=>BCPOiJT<=,rDO]iaiirr; ; ; = \",OOOOOpr when Wben wen ionpr=?-BCPOUT<=,POLOOOM 011Lpr=>BCPOUT% ouners=>ECDOUT%=,piinipr; end case; elsll (Keyi:sirLOllff) ID Hen c目区宫keyc is Wil旨U \"lliOir=^BCDOUT-; = ,pOOOLl\"; when w -為入非法 lLOLBr = ^BCDOUT% = ,pCiOLLOM; WL&LL \"1011^ = >ECDOUT< = ,POLO01M; WILEU woiiiBr 时hull QtL=E^ = >DCDOUT<*,BlllllM-; Elid eldiX (JleyE*pt01Llff) ca^E keyu 丄凸 wlicii *lilO^->DCDOUT<-,p01.010ip; ttfliEii *1101^->DCDOUT<-,p0L011-p; when *101L^->DCDOUT<-,pOL10OM; wheii *Olllp*->DCDOUT<-,pOL101-p; wheii otli£r3->BCDOUT<-!,,lLllll,p; end. caLse.; e BCEOtTT<-''lllll''; end zi£ 备 一备入非法 --输入半法 一站入丰法 case Jceyc is when W 111U^ r ・》 wneii \"1 loi* vhen *1011ir when *amir when end case; end if; end z±; uud process; □匸 cu utrrt •\" u □丄 uu \": >iCUOUT< = 'fU0111,r; >£CUuUT< = ,,Ul±Ll,r; ir >FCDOUT<«ll-lLlrt; BeDOUTQ\"UDUDJ.\": 一丄 一 4 一了 二二 « 号 一一 输入*法 图3.12 键盘扫描模块 VHDL源码 图3.13键盘扫描模块仿真波形 ③ 图3.13是键盘扫描模块仿真波形,注意:如何设置 Kr的值? ④ 在实验箱上测试 4X 4键盘扫描模块,可按图3.14连接,为便于观察,使用1Hz频率 时钟信号,Kr、Kc连接FPGA引出线ROW[3..0]和COL[3..0],同时将其分别输出到 4个 LED显示,BCD_OUT通过译码器显示在数码管上。 图3.14 4X 4键盘扫描模块测试电路 6、PS/2接口键盘读取模块设计 ① 拉到低电平。 PS2控制接口仅使用到两条传输端口,一为频率端口,另一则为数据端口如图 3.15所 示,且此传输埠必为三态(Tri-State)并具有双向(bidirectional)特性。PS2传输产品上,常见为 鼠标与 PS2通信协议是一种双向同步串行通迅协议。通迅的两端通过CLOCK (时钟信号端) 同步,并通过DATA (数据端口)交换数据。任何一方如果想要抑制另外一方的通迅时,只 需要把CLOCK Male Female 6-pm Mini-DIN (PS2): 1 - DaUi 2 - Not Implemented 3 - GroLind 4 - Vcc (+W) 5 - Clock (Plug) (Sockel) 6 - \\ot Implemented 键盘,两者的驱动原理均相同,仅扫描码 (sca n code)不同。因此我们以 PS2键盘为例 进行说明。 圏3.15 PS2端口脚位宦义 ② PS2标准,规范每笔数据传输包含起始位(start bit)、扫描码(scan code)、奇同位检查(odd parity)、以及终止位(stop bit)共计11位,并以双向串行数据传输的方式,达到通信的目的。 且当主机端(host)或从机端(slave)并无传送或接收数据时,数据传输端口及频率均将升为高 电位。图3.16所示为每一笔数据传输所包含之内容如下: a. 起始位(“ 0”) b. 8位数据宽度的扫描码 (scan code )。 c. 奇同位检查,使扫描码与奇同位加起来 1的数字为奇数个。 CLOCK d. 终止位(“1 ”) nrLrumnjiru 9 re?tooara 丄 m FORT ( KH7faC: 图3.16 PS/2接口时序 ③ 键盘其实就是一个大型的按键矩阵, 它们由安装在电路板上的处理器 (叫做“键盘编 码器”)来监视着。虽然不同的键盘可能采用不同的处理器,但是它们完成的任务都是一样 的,即监视哪些按键被按下, 哪些按键被释放了,并将这些信息传送到主机。 每个键盘被分配了唯一的通码(键盘按下时发送的编码)和断码(键盘释放时发送的编 码),这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。 PS2键盘扫描码见“键盘扫描码表” ④ 图3.16是PS/2接口键盘接收模块的 VHDL源码,在对其进行仿真时,可以将 “keyboard_clk_filtered ”信号输出查看。 pH'ERARY rrEE;^ TEEE t 3TTi_L.05I C_ll .^11; USE IEEE ・ £TI 匸 LOCH 匸 AR ITH,ahl; USE IEEE ・ SW^LOCFI C ~UKJS IGMED ・ all; Jee?too-3Lr l_lai: e iccjc_ZfeJiti E * l7 呼 r 时 4 d ARCH1TECTMRE 旨 rtl OF kevhca-rd IS £IGfJAl 曹工规£ :N ~冃ej»gg 「一快应住电干有敢& 阳/ 惡摇.系航时畀.读信弓 1氐电手帀IMCffT IBJAX SHIFTIN GE】JLL 出 :OCTT 9W_LOGTC_VZCTOP. :OCT BTO^匚皿\"〒;|7 一POTNTO 输出Q|F|— 键盎扫揃宵诞JLL REJJE'^CHAR 1&亍 raad^aet 吉 HGCuLL yha at d_^ 1 k_£ 1 It^L eJ STi^TlAL filLsc EMTK n logic_vect-3ir 13 do^ntc- 0| -:臻奇寄有器!樣牧学丰亍誉-鲨需-fit 计散橋 loaic vector Is aoijtiEC 磁ggwj —拱收致据猎示按成贰.I -loqLcJ---AMffe 正在接收鼻。未接收我撲收■框 g log Lc ;—咖即2时钟JS姣井战相 legie_v=c甘相 :t.3r |1 dsvn.tb C| r \"疏吱言存器“对\"皿册餐嗽放討PPtiCI^S; \\T亡小人 rtady ^et 3EGIK Lt r^ad = '!■ THE^ C*OCLfi_匚亡 AMY 4= \" 01 f IL3XF rw&a^Aac4 KVKKT 自曲 = p i1 THEIJ scau^ealy' <= p 1'- =nr rr\" EMD FRCCESS.: 目曲鸭以时讪信号中的尖职冲I宴低屯平特雀时间怕个貳規阿赭周羽〉■ 同时,梅共延时E个京琉时钗冏朋.坯悻可防止舌兀暫祸线廷时过兀可|起谑数宿烷. CLPCJC_Iliver: PROCESS B£G IK TCAIT TirrrZL 匚丄口f £占凸忑 EVEI-IT HID clDCk_25Bhz= ! I1 ; flltar (S DOMkTO 0) filter H COriJTO Lj ; filter |l)i <- keyfaEhatd__EIk; TF fiLter • H111111U,F THEM kryh^ard_c]k_f11 t PROCESS BECBJ , IXIT UNTIL (EEyBOitP^_CLK_iiltered, I VENT XND KETBOARD_CLK_±iLterei« 1'); IF RESET-'1' THE硏 INCW7 <= PWOD*; REAI>_CHAF 好 1 01 ; ELSE IF KETBOAFD DATA- 1 0 ' AND REO CHiR- ' □' THEN —谨取位飞低电平厂 并设苣云EM_CHA附和7嗣旳」就「指示正在谨取有效数错心 READ CHiLkC= 1 11 ; r&ady_set<= 1 ; ELSE IF REAl CHAR - 111 THEN JT INCNT W w1001r, THEN-- PATAiD-DkTA\" i17〈校验位〉 IWCNT <- INCWT 十 1; SHIFTIN (7 EOWNTO D | <= SEIFTIN(8 &OWKTO 1) j SHTFTIM (S J <= EEVBOiRD DJLTl; reacly_set <= 1 O': ELSE--STOP (侍止也?裔电乖】 scan^code REM CHAR <- 3EIFTIN(7 <- \" O ■; <= 1 POWTO □): readLy set INiCNir\" 1'; <= nOOOO™; ENti IF; END IF; END 匸F; END IF; ENT- PROCESS; EKT- rtlj? 图3.16 PS/2接口键盘接收模块 VHDL源码 ⑤ 开始位0 图3.17是PS/2接口键盘接收模块仿真波形,为便于分析,把“ keyboard_clk_filtered ” J _ 信号和“ SHIFTIN ”信号连接到端口“ filtered_out ”和“ SHIFTIN _out ”输出显示。 图3.17 PS/2接口键盘接收模块仿真波形1位 2位 3位 4位 6位 ⑥ 时钟信号中的干扰信验箱的数码管上显示键盘的扫描码。 验二中的数码管扫描模块修改一下即可(只是用 F»E*t 按图3.17设计,即可在实 “Sel_time2 ”模块用实 2个数码管,SEL绑定到SEL[0]管脚),代 码如图3.18: 一 書寸■单bE那 fglkdFA^.-vuL 3迓江耳曲 hrrtfl 1 11 1 « 1 E LJi JJ 1 .r X 卯伯0> i juif.iri Q3 :Cd :(n I:IJ- 扫描码 5位 I, _________ J 7位 k, ________ J 图3.17 PS/2接口键盘接收模块测试电路 1ibrary ree已; use i.eee .std logic 11™all; entity se 1 tiioeS la port( Clk lKHz scan code BCD OUT : out SEL : buffer end sei T, im已2 : logic; —IKHE时钟输入 : in : in std logic vector(7 deunto 0); 一键盘扫描码 std logic vector (3 downto 0) ; ■-码输出 std logic 一七段码管扫描驱动 ): arcJiitecture display o£ gel tiine2 is loegin process(ClklKHs) if (Clk_lKHz '皀v皀nt and CL^lKHz-* l1 ) then SEL<«not. 5EL; end if;| end precess; process(SEL) case (SEL) is when 101 -> BCD_OUT<»scan_ccde (7 downto 4); 一键盘扫描码高位 when 1 11 ■> BCD_^OUT<=3can^_code (3 downto 0); ―键盘扫描码低位 when. others->nu 11; end case; end process; 目nd display; 图3.18修改后的数码管扫描模块 7、VGA显示控制 VGA显示器在显示过程中主要由五个信号来控制,分别是 中R、G、B分别用来驱动显示器三个基色的显示,即红、绿和蓝, R、G、B、HS和VS。其 HS是行同步信号,VS 是场同步信号。在做本实验时,由于没有任何显示器驱动,所以显示器工作在默认状态,分 辨率:0X 480,刷新率:60Hz。在此状态下,当 VS和HS都为低电平时,VGA显示器 显示亮的状态,其正向扫描过程约为 当扫描完一场后,也就是扫描完 26us。当一行扫描结束后,行同步信号 HS置高电平, 持续约6us后,变成低电平,在 HS为高电平期间,显示器产生消隐信号,这就是显示器回 扫的过程。 480行以后,场同步信号 VS置高电平,产生场 显示器显示的时序图如图 同步,此同步信号可以使扫描线回到显示器的第一行第一列位置。 3.19所示: 行柯描帖序姜戒皿索•(即輪出一个宦嘉眄邓I曲时闾価1隔): 為(布同步头h爾 吟4U 7;; K 儿(行图像八附。心U Tp S 兀(行周期> :8« GRJ场満臨 vs ■為 v ------------- 吊一 --- i| 7 1X卜一场函像 A fcu 1 场打描时序鑒求#行池即输出一行line的时耶]隔> ■ T;〔场恫步头h2 Tbi 25 心!1 r£ (场周期):525 T八场ai像)皿即Tti K 3^ 2 水平斤向 UU禅JHIfD 硯左方 lil(nfiiiKf) 品示模武 时除MHz 邺.175 ■*),000 65.1XX) 0 800 1024 同少前 冋卅 時同步旨 号 16 40 24 96 同环 4K0 600 同涉 f40x4W>,6()IL 4H 11 2 4 6 31 800XNX>.60 HJ 1024 J*76».6O Hz 128 K6 1) \\ 3 23 嗣 图3.19 VGA时序 以0*480@60Hz模式为例,图中 Ta为同步头信号(行同步头 96像素、场同步头 2 行),Tb+Tc为同步后信号(行 40+8像素、场25+8行),Td为图像显示时间(行 0像素、 场480行),Te+Tf为同步前信号(行 8+8像素、场8+2 行)。 总共一行800像素(约32us,其中行显示过程约为 26us,行同步脉冲加上同步前后约 45行)。 6us); 一帧图像525行(其中显示过程约为 480行,场同步脉冲加上同步前后 图3.20为VGA显示控制模块 VHDL代码,通过FPGA在显示器上显示一些条纹或图 案,由key[1..0]两个开关的组合控制 CRT显示器上能够显示横条纹、竖条纹以及棋盘格子 图案。稍微修改代码即可由本模块实现 置的图像。 VGA扫描控制,将屏幕行列位置 hcnt,vcnt输出,由 外部电路计算当前颜色值, 通过imag_GRB端口返回,即可显示由ROM提供或外部模块设 library leee; use leee・std_JLO0ic_l:i・RJL丄: us色 L❷・grd_Lcyxu_afi.th・ use ieee・ std_Logic_unsigtied・all; entity VGA io porc( elk : m sCd_Lugic; key : in stci_Loalc_veccor (1 dovnvo D); ■- iwaa_RGB • in st.d_iooic_veccor (Z dovneo hent,vent ■• buffer std Irqic vector (9 dewntzo HS.VS : •out std_Logic; FCB s out ctd Logic vector(2 devnto D) ); end V3A; arcnic»criire ONE CT VGA is rghx ■ ■ mtrd logic? vFrtor (2 ctovnto 0): signal rgby ■ • std logic? vector (2 devnto 0); fccgin 一抒扫播 process |clie) be^ir; if |cLk'EVENT AMD clk= 1 1' ) then if(hcnt < GOO) then Kent <- hent -t 1; eLae hent <■ (others a> 'O'): 色nd if; end Lf; end froce□□: \"行计数 pcjcess icLK) beain if Iclk'EVFNT AMD clk» ' 1' ) th^n if (bent = 04€ ) then if (vent < 52S) then vcnr <- vent t 1; else venz <= (others => '0*l end if; end if; end if; end process; —行同步册冲昭输出 process(elk) begin ii (elk1EVENT AND clk= 1 1' ) then if ( (hont>« 0 >808) and (hant <610*8484-96 )) then H3 V・'O'; else H5 <- '1'; end 1£; end if; end process; ―场冋赞脱冲府输出 proocos(vent) beain if ((vent >= 480+8+2) and (vent < 480+842+2)) then VS <= 'O';else vs <= •i •; end if; end process; C):一外部曰路瑜入的当乳颉色值 >0): —将屏華行列位宜输出,由外前电菇计劳岂前頰色值 一竖参频色 process (hcnt/vcm:)--根据:i〒列位査确定扫捲点的煎色信 begin if i:hcnt<610 and vcnt-c^SO) then if (key=rrClF,)then— RGB<-rgtox; ® lsif (k*s,-f*10rr) then■-橫臬 RGB<-rghy; elsif(feev-R,llr,) then—棋盘槁于 RGB<*rabw xor roby else RG£J<=hrUUUhr; end if: RGE<=imac RGB;--点外邨电路计算当諭颜色值 else --消隐 RGB<=T,OOCpr; end if; ei;d process; process (hcnt) 一很捉彳亍扫捲位直将屏释划分为8平竖条亀块 If(hcnt<30)then rgbx<«,,l]lF, ; *■ 1 Rif (hent els jf (hcnt<400) ther. rgl:x<=^011rt; e±3if (h.cn.t<4e0) tlien rgkx<=,r010IT; elsif(hcnt<5f0)ther rg^kx<= ,r0C 1\"; else rgbx<=rrO 匚口 \"; pnrt if; erd process; process (vent)--根据扫描行数将屏幕划分为8个水平色块 begin if(vcnt<60)then rgtoy<=f,lll,f; elsif (vcnt<120) then rgby< = ,Fliaf,; elsif (vcnt<180) then rgby<=irr101,r; elsif (vcnt'x^^O) then rgtoy<-,r100rr; elsif (vcnt<300) then rgby<-F,011\"; elsif (vent<3 60) then rgby< = tf010,r; elsif(vcnt<420)then rgby<=rr001rr; else rg:byV・\"DCiD,仃 end if; end process; end ONE; 图3.20 VGA显示控制模块VHDL代码 五、实验步骤: 1.首先打开 Quartus II 软件,新建工程。 2.按照自己的想法,编写原理图或 VHDL 文件程序。 3.对自己的设计进行编译并仿真。 4.仿真无误后,根据附录一的引脚对照表,对实验中用到的输入输出进行管脚绑定, 然后再重新编译一次。 5.用下载电缆通过 JTAG 接口将对应的 sof 文件下载到 FPGA 中。 6.观察实验结果是否与自己的预期想法相吻合。 六、实验报告要求 1.总结几种方法设计 ROM 和 RAM 的心得体会。 2.如何使用三态总线? 3. 如何检测一个信号(非时钟信号)的跳变? 4. 其它电路模块如何读取 4X 4键盘扫描模块输出的按键编码? 取一个键值) 5. 其它电路模块如何读取 PS/2 接口键盘读取模块输出的扫描码? (注意: 按一次键只 读取(注意:按一次键只读 一个键值) 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务