本(běn)文(wén)为(wèi)明(míng)德揚原創及(jí)录(lù)用(yòng)文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!
1.1 總(zǒng)體(tǐ)設計(jì)
1.1.1 概述
1.1.2 設計(jì)目标(biāo)
1.1.3 系(xì)統結構框图(tú)

1.1.4模块(kuài)功能(néng)
mdyPllAltera模块(kuài)实現(xiàn)功能(néng)
mdyRom模块(kuài)实現(xiàn)功能(néng)
mdyCfg模块(kuài)实現(xiàn)功能(néng)
mdyKey模块(kuài)实現(xiàn)功能(néng)
PicZoomInAndOut模块(kuài)实現(xiàn)功能(néng)
mdyLcd驅動(dòng)模块(kuài)实現(xiàn)功能(néng)
mdyGetEdge模块(kuài)实現(xiàn)功能(néng)
mdyStatic_1S模块(kuài)实現(xiàn)功能(néng)
1.1.5頂层信(xìn)号(hào)

1.1.6參考代(dài)碼
module top_mdyLcdPicZoomInAndOut(
clk ,
rst_n ,
key ,
uart_rxd ,
uart_txd ,
lcd_hs ,
lcd_vs ,
lcd_de ,
lcd_dat ,
lcd_clk
);
parameter PICTURE_W = 24 ;
parameter KEY_W = 4 ;
input clk ;//50MHz
input rst_n ;
input [KEY_W-1 :0] key ;
input uart_rxd ;
output uart_txd ;
output lcd_hs ;
output lcd_vs ;
output lcd_de ;
output [PICTURE_W-1:0] lcd_dat ;
output lcd_clk ;
wire uart_txd ;
wire lcd_hs ;
wire lcd_vs ;
wire lcd_de ;
wire [PICTURE_W-1:0] lcd_dat ;
wire lcd_clk ;
wire clk_0 ;
wire [23:0] pic_data ;
wire [10:0] req_x ;
wire [ 9:0] req_y ;
wire frame_start ;
wire [KEY_W-1:0] key_vld ;
wire frame_pos ;
wire [63:0] uart_dout ;
wire uart_dout_vld ;
wire [63:0] cfgCtrl_dout ;
wire cfgCtrl_dout_vld ;
`include "mdyCfg_wire.v"
/****************** PLL模块(kuài) *******************************/
mdyPllAltera#(.C0_M(4),.C0_D(5)) u1_pll_40m(
.areset (~rst_n ), //高(gāo)電(diàn)平有(yǒu)效
.inclk0 (clk ),
.c0 (clk_0 ),
.c1 ( ),
.c2 ( ),
.c3 ( ),
.c4 ( ),
.locked ( )
);
/****************** LCD驅動(dòng)模块(kuài) *******************************/
mdyLcd#(.D_DLY(1)) u2_lcd_driver(
.clk (clk_0 ),//40MHz
.rst_n (rst_n ),
.ack_data (pic_data ),
.req_x (req_x ),
.req_y (req_y ),
.req_en ( ),
.req_addr ( ),
.hys (lcd_hs ),
.vys (lcd_vs ),
.lcd_de (lcd_de ),
.lcd_rgb (lcd_dat ),
.lcd_dclk (lcd_clk ),
.frame_start (frame_start )
);
/****************** 功能(néng)模块(kuài) *******************************/
PicZoomInAnDout u3_PicZoomInAnDout(
.clk (clk_0 ),
.rst_n (rst_n ),
.mode (MODE_SELECT_en),
.key_en (key_vld ),
.cpu_ZoomIn (SOFTWARE_CTRL_in),
.cpu_ZoomOut (SOFTWARE_CTRL_out),
.req_h (req_x ),
.req_v (req_y ),
.pic_data (pic_data )
);
/********************* 按鍵模块(kuài) ****************************/
mdyKey#(.DATA_W(24),.TIME_20MS(8_00_000)) u4_mdykey(
.clk (clk_0 ),
.rst_n (rst_n ),
.key_in (key ),
.key_vld (key_vld )
);
/********************* 邊(biān)沿檢测模块(kuài) ****************************/
mdyGetEdge u5_GetEdge(
.clk (clk_0 ),
.rst_n (rst_n ),
.cfg_init_value (0 ),
.din (frame_start ),
.dout_pos (frame_pos),
.dout_neg ( ),
.dout_pos_reg ( ),
.dout_neg_reg ( )
);
/********************* 1s統計(jì)模块(kuài) ****************************/
mdyStatic_1S u6_Static_1S(
.clk (clk_0 ),
.rst_n (rst_n ),
.cfg_num_1s (50_000_000 ),
.cfg_add_1s (1 ),
.din_vld (frame_pos ),
.sta_1s (DATA_FRAME_data ),//32bit
.sta_rt ( )
);
/********************* 指令模块(kuài) ****************************/
top_uart_cfg#(.BPS(4167)) u7_top_uart_cfg(
.clk (clk_0 ),
.rst_n (rst_n ),
.cfg_head (16'h55d5 ),
.rx (uart_rxd ),
.tx (uart_txd ),
.din (cfgCtrl_dout ),//s2p
.din_vld (cfgCtrl_dout_vld ),
.din_rdy ( ),
.dout (uart_dout ),//p2s
.dout_vld (uart_dout_vld )
);
mdyCfgCtrl u8_mdyCfgCtrl(
`include "mdyCfg_inst.v"
.clk (clk_0 ),
.rst_n (rst_n ),
.din (uart_dout ),
.din_vld (uart_dout_vld ),
.dout (cfgCtrl_dout ),
.dout_vld (cfgCtrl_dout_vld )
);
/*************************************************/
endmodule
1.2 mdyPllAltera模块(kuài)接口(kǒu)说(shuō)明(míng)1.2.1接口(kǒu)信(xìn)号(hào)

1.2.2 使用(yòng)说(shuō)明(míng)
1.3 mdyRom模块(kuài)設計(jì)
1.3.1接口(kǒu)信(xìn)号(hào)
1.3.2設計(jì)思(sī)路(lù)
1.4 mdyCfg模块(kuài)接口(kǒu)说(shuō)明(míng)
1.4.1接口(kǒu)信(xìn)号(hào)
mdyCfgCtrl模块(kuài)的(de)接口(kǒu)信(xìn)号(hào):

1.4.2 使用(yòng)说(shuō)明(míng)

1.5 mdyKey模块(kuài)接口(kǒu)说(shuō)明(míng)
1.5.1接口(kǒu)信(xìn)号(hào)
1.5.2使用(yòng)说(shuō)明(míng)
1.6 PicZoomInAndOut模块(kuài)接口(kǒu)说(shuō)明(míng)

1.6.2參考代(dài)碼
module PicZoomInAnDout(
clk ,
rst_n ,
mode ,
key_en ,
cpu_ZoomIn ,
cpu_ZoomOut ,
req_h ,//h_cnt - THB
req_v ,//v_cnt - TVB
pic_data
);
//LCD顯示屏居中(zhōng)
parameter HDE_CENTRE = 400 ;//800/2
parameter VDE_CENTRE = 240 ;//480/2
parameter DATA_W = 8;
parameter KEY_W = 4;
//輸入(rù)信(xìn)号(hào)定(dìng)義
input clk ;
input rst_n ;
input mode ;
input cpu_ZoomIn ;
input cpu_ZoomOut ;
input [KEY_W-1 :0] key_en ;
//輸出(chū)信(xìn)号(hào)定(dìng)義
input [10:0] req_h ;
input [ 9:0] req_v ;
output [23:0] pic_data ;
//輸出(chū)信(xìn)号(hào)reg定(dìng)義
reg [23:0] pic_data ;
//中(zhōng)間(jiān)信(xìn)号(hào)
reg [15:0] logo_rom_addr ;
reg logo_rom_area ;
wire [7:0] logo_rom_data ;
reg [17:0] e_rom_addr ;
reg e_rom_area ;
reg [2:0] e_rom_addr_low ;
reg e_dataout ;
wire [7:0] e_rom_data ;
reg [ 2:0] size ;
reg [ 2:0] size_ff0 ;
wire [9:0] len_size ;
wire [9:0] wid_size ;
wire [9:0] e_x0 ;
wire [9:0] e_x1 ;
wire [9:0] e_y0 ;
wire [9:0] e_y1 ;
wire [9:0] x ;
wire [9:0] y ;
/******************************************************/
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
size <= 0;
end
else if(mode==1)begin
if(cpu_ZoomOut)begin
if(size!=3)
size <= size + 1;
end
else if(cpu_ZoomIn)begin
if(size!=0)
size <= size - 1;
end
end
else if(mode==0)begin
if(key_en==4'b0010)begin
if(size!=3)
size <= size + 1;
end
else if(key_en==4'b0001)begin
if(size!=0)
size <= size - 1;
end
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
size_ff0 <= 0;
end
else if(req_h==(HDE_CENTRE-200) && req_v==(VDE_CENTRE-150)) begin
size_ff0 <= size;
end
end
assign len_size = 400 >> size_ff0;//縮小多(duō)少(shǎo)倍
assign wid_size = 300 >> size_ff0;
assign e_x0 = (HDE_CENTRE-len_size[9:1]);
assign e_x1 = (HDE_CENTRE+len_size[9:1]);
assign e_y0 = (VDE_CENTRE-wid_size[9:1]);
assign e_y1 = (VDE_CENTRE+wid_size[9:1]);
assign x = (req_h-e_x0)<<size;
assign y = (req_v-e_y0)<<size;
always @(*)begin
e_rom_area = req_h >=(e_x0+5) && req_h < e_x1 && req_v >= e_y0 && req_v < (e_y1+5);
end
always @(*)begin
e_rom_addr = x + 400*y;
end
/******************************************************/
//120*55
always @(*)begin
logo_rom_area = req_h >=0 && req_h < 119 && req_v >= 0 && req_v < 54;
end
always @(*)begin
logo_rom_addr = req_h + 120*req_v;
end
/******************************************************/
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
e_rom_addr_low <= 0;
end
else begin
e_rom_addr_low <= e_rom_addr[2:0];
end
end
always @(*)begin
if(e_rom_area)
e_dataout = ~e_rom_data[7-e_rom_addr_low];
else
e_dataout = 1;
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
pic_data <= 0;
end
else if(e_rom_area)begin
pic_data <= {24{e_dataout}};
end
else if(logo_rom_area)begin
pic_data <= {logo_rom_data[7:5],5'b11111,logo_rom_data[4:2],5'b11111,logo_rom_data[1:0],6'b111111} ;
end
end
/******************************************************/
mdyRom#(.MIF("../src/data/logo.mif"),.DEP(8192),.D_W(8)) u_fpga_rom(
.address (logo_rom_addr ),
.clock (clk ),
.q (logo_rom_data )
);
mdyRom#(.MIF("../src/data/e.mif"),.DEP(16384),.D_W(8)) u_e_rom(
.address (e_rom_addr[16:3] ),
.clock (clk ),
.q (e_rom_data )
);
endmodule
1.7.1使用(yòng)说(shuō)明(míng)
1.8 mdyGetEdge模块(kuài)接口(kǒu)说(shuō)明(míng)
1.8.1接口(kǒu)信(xìn)号(hào)

1.8.2使用(yòng)说(shuō)明(míng)
1.9 mdyStatic_1S模块(kuài)接口(kǒu)说(shuō)明(míng)
1.9.1接口(kǒu)信(xìn)号(hào)

1.9.2使用(yòng)说(shuō)明(míng)
1.10 效果(guǒ)和(hé)總(zǒng)結
以(yǐ)下(xià)为(wèi)工程上(shàng)板後(hòu)的(de)現(xiàn)象(xiàng)效果(guǒ)图(tú):

mp801開(kāi)發(fà)板——縮小1倍

mp801開(kāi)發(fà)板——縮小2倍

mp801開(kāi)發(fà)板——縮小3倍

本(běn)案(àn)例設計(jì)教学視頻和(hé)源工程代(dài)碼,可(kě)到(dào)明(míng)德揚論壇進(jìn)行下(xià)载学習。
感(gǎn)興趣的(de)朋友也(yě)可(kě)以(yǐ)訪問(wèn)明(míng)德揚論壇(http://www.fpgabbs.cn/)進(jìn)行FPGA相關(guān)工程設計(jì)学習,也(yě)可(kě)以(yǐ)看(kàn)一(yī)下(xià)我(wǒ)们(men)往期(qī)的(de)文(wén)章(zhāng):
MP801開(kāi)發(fà)板——千(qiān)兆(zhào)网(wǎng)、ADDA、大容量(liàng)SDRAM等,学習和(hé)項目需求一(yī)步到(dào)位。网(wǎng)絡培訓班——不(bù)管(guǎn)时(shí)間(jiān)和(hé)空間(jiān),明(míng)德揚随时(shí)在(zài)你身(shēn)邊(biān),助你快(kuài)速学習FPGA。周末(mò)培訓班——明(míng)天(tiān)的(de)你会(huì)感(gǎn)激現(xiàn)在(zài)的(de)努力進(jìn)取(qǔ),升(shēng)職加薪明(míng)德揚来(lái)助你。就(jiù)業培訓班——七(qī)大企業級項目实訓,獲得豐富的(de)項目經(jīng)验(yàn),高(gāo)薪就(jiù)業。專題(tí)課程——高(gāo)手(shǒu)修煉課:提(tí)升(shēng)設計(jì)能(néng)力;实用(yòng)調試技巧課:提(tí)升(shēng)定(dìng)位和(hé)解(jiě)決問(wèn)題(tí)能(néng)力;FIFO架構設計(jì)課:助你快(kuài)速成(chéng)为(wèi)架構設計(jì)师(shī);时(shí)序約束(shù)、數字(zì)信(xìn)号(hào)处理、PCIE、綜合項目实踐課等你来(lái)選。項目承接——承接企業FPGA研發(fà)項目。人(rén)才服(fú)务——提(tí)供人(rén)才推薦、人(rén)才代(dài)培、人(rén)才派遣等服(fú)务。








