标题: FPGA EDA实验指导书 Verilog语言 [打印本页]

作者: 嘎斯妇女的吗v不    时间: 2018-4-23 19:24
标题: FPGA EDA实验指导书 Verilog语言
EDA实验指导书

目录

(验证性实验)                           
(综合性实验)                             
3.  实验三  LCD显示实验
(设计性实验)                             

实验一:
LED
实验
一、实验目的二、实验内容三、实验准备四、实验步骤
图1.1
图1.2
图1.3
图1.4
图1.5
图1.6
图1.7
图1.8
图1.9
图1.10
图1.11
图1.12 鼠标左键单击“打开(O)”
图1.13 鼠标左键单击“OK”

图1.14 鼠标左键单击“led左侧+”
图1.15
CLK_IN: 管脚编号为AF12
LED_DATA[0]: 管脚编号为AD20
其余管脚在此就不一一列出了。
图1.16
图1.17
注意:图中粉红色彩条说明管脚在同一个bank中。单击每个蓝色I/O管脚,则对应着Design Object List-I/O Pins窗口相应的管脚。
图1.18
图1.19

图1.20
图1.21
图1.22
图1.23
图1.24
图1.25
图1.26
图1.27
图1.28
程序开始下载,如果下载程序成功则出现Program Succeeded,否则如果失败则出现Program Failed,需要重新查找问题(尝试重新下载或者断电后重新下载程序);
五、实验程序led.v
  1. //dot.v:程序顶层文件,对输入时钟进行分频,依次点亮相应的LED;
  2. //dot.ucf:FPGA用户约束文件。
  3. `timescale 1ns / 1ps
  4. // Company:
  5. // Engineer:
  6. //
  7. // Create Date:
  8. // Design Name:
  9. // Module Name:    dot
  10. // Project Name:
  11. // Target Devices:
  12. // Tool versions:
  13. // Description:
  14. //
  15. // Dependencies:
  16. //
  17. // Revision:
  18. // Revision 0.01 - File Created
  19. // Additional Comments:
  20. module dot(CLK_IN, nRST, CPLD_E,DOT_DATA , DOT_CON ,AD_nCS , DA_nCS ,USB_nCS,LCD_nCS );

  21. input CLK_IN;
  22. input nRST;
  23. output [1:0] CPLD_E;
  24. output [15:0] DOT_DATA;
  25. output [15:0]DOT_CON;
  26. output USB_nCS;
  27. output AD_nCS;
  28. output DA_nCS;
  29. output LCD_nCS;

  30. reg CLK_OUT = 1'b1;
  31. reg [15:0]DOT_CON =16'h0000;
  32. reg [15:0]DOT_DATA =16'h0000;            
  33.             
  34. reg [13:0] DIV_counter = 14'h000;
  35. reg [3:0] cnt= 4'h0;
  36.             
  37. parameter DIV_FACTOR = 14'h3f98;
  38.             
  39. //CPLD功能切换
  40. assign CPLD_E = 2'b11;
  41. //其他芯片功能禁止
  42. assign USB_nCS = 1'b1;
  43. assign AD_nCS = 1'b1;
  44. assign DA_nCS = 1'b1;
  45. assign LCD_nCS = 1'b1;
  46.             
  47. //时钟分频            
  48. always@(posedge CLK_IN)
  49. begin
  50.               if(!nRST)
  51.               begin
  52.                             CLK_OUT <= 1'b1;
  53.                             DIV_counter <= 10'h000;
  54.               end
  55.               else
  56.               begin
  57.                             if(DIV_counter <= DIV_FACTOR )
  58.                             begin
  59.                                           DIV_counter <= DIV_counter + 1;
  60.                             end
  61.               else
  62.                             begin
  63.                                           DIV_counter <= 12'h000;
  64.                                           CLK_OUT <= !CLK_OUT;
  65.                             end
  66.               end
  67. end
  68. //点亮点阵            
  69. always@(posedge CLK_OUT)
  70. begin
  71.               cnt = cnt+1;
  72.               if(cnt == 4'h0)
  73.               begin                           
  74.                             DOT_CON  <= 16'h8000;
  75.                                           DOT_DATA <= 16'hd800;
  76.               end
  77.               else if(cnt == 4'h1)   
  78.     begin                                         
  79.         DOT_CON   <= 16'h4000;
  80.                             DOT_DATA  <= 16'h6c00;
  81.               end
  82.     else if(cnt == 4'h2)   
  83.     begin                                         
  84.                             DOT_CON  <= 16'h2000;
  85.                             DOT_DATA <= 16'hb600;
  86.               end
  87.     else if(cnt == 4'h3)   
  88.     begin                                         
  89.         DOT_CON   <= 16'h1000;
  90.                             DOT_DATA  <= 16'hdb00;
  91.               end
  92.     else if(cnt == 4'h4)
  93.     begin                                         
  94.         DOT_CON  <= 16'h0800;
  95.                             DOT_DATA <= 16'h6d80;
  96.     end           
  97.     else if(cnt == 4'h5)  
  98.     begin                                         
  99.         DOT_CON  <= 16'h0400;
  100.                             DOT_DATA <= 16'h2480;
  101.               end
  102.     else if(cnt == 4'h6)   
  103.     begin                                         
  104.         DOT_CON  <= 16'h0200;
  105.                             DOT_DATA <= 16'h1240;
  106.               end
  107.     else if(cnt == 4'h7)
  108.     begin                                         
  109.         DOT_CON  <= 16'h0100;
  110.                             DOT_DATA <= 16'h0920;
  111.               end
  112.     else if(cnt == 4'h8)
  113.     begin                                         
  114.         DOT_CON  <= 16'h0080;
  115.                             DOT_DATA <= 16'h0490;
  116.               end
  117.     else if(cnt == 4'h9)  
  118.     begin                                         
  119.         DOT_CON  <= 16'h0040;
  120.                             DOT_DATA <= 16'h0248;
  121.               end
  122.     else if(cnt == 4'ha)
  123.     begin                                         
  124.         DOT_CON  <= 16'h0020;
  125.                             DOT_DATA <= 16'h0124;
  126.               end
  127.     else if(cnt == 4'hb)
  128.     begin                                         
  129.         DOT_CON  <= 16'h0010;
  130.                             DOT_DATA <= 16'h0092;
  131.               end
  132.     else if(cnt == 4'hc)
  133.               begin                                         
  134.                             DOT_CON  <= 16'h0008;
  135.                             DOT_DATA <= 16'h0000;   
  136.               end                                                      
  137.               else if(cnt == 4'hd)
  138.               begin                                         
  139.                             DOT_CON  <= 16'h0004;
  140.                             DOT_DATA <= 16'h0000;
  141.               end
  142.     else if(cnt == 4'he)
  143.               begin                                         
  144.                             DOT_CON  <= 16'h0002;
  145.                             DOT_DATA <= 16'h0000;
  146.               end
  147.     else if(cnt == 4'hf)  
  148.     begin                                         
  149.                             DOT_CON  <= 16'h0001;
  150.                             DOT_DATA <= 16'h0000;
  151.               end                    
  152. end                           
  153. endmodule
复制代码



六、思考题:











实验二:LED点阵实验一、实验目的二、实验内容三、实验说明
本实验的功能是将SEED-XDTK_MBOARD板上LED点阵点亮(合众达图标)。根据硬件原理,通过对FPGA的输入时钟进行分频,实现一个定时器,该定时器主要用于定时扫描控制SEED-XDTK_MBOARD板卡上的LED点阵。
SEED-XDTK_MBOARD板上LED点阵共有16*16点,既有16根控制线与16根数据线。 控制线用来选中一组LED灯,16根数据线用来点亮相应的LED灯。
四、实验准备
1. 通过USB 口下载电缆将计算机的USB 口及SEED-FEM025 板的J9 连接好;
2. 启动计算机,打开SEED-XDTK_V4 实验箱电源开关。观察SEED-FEM025 板上的+5V(D11)的电源指示灯是否均亮。若有不亮的,请断开电源,检查电源。
五、实验步骤
注意:选择器件(Device)为“XC4VSX25 FF668 -10”
其他步骤同实验一,请参考。
最后一个器件单击所要下载的dot.bit文件(此文件所在目录不可有中文),单击Open按钮,弹出“Add Virtex-/II Pro/Virtex04...”对话框,单击OK按钮后弹出一个警告信息,单击OK按钮;

六、实验程序 dot.v
//dot.v:程序顶层文件,对输入时钟进行分频,依次点亮相应的LED;
//dot.ucf:FPGA用户约束文件。
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date:
// Design Name:
// Module Name:    dot
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
module dot(CLK_IN, nRST, CPLD_E,DOT_DATA , DOT_CON ,AD_nCS , DA_nCS ,USB_nCS,LCD_nCS );

input CLK_IN;
input nRST;
output [1:0] CPLD_E;
output [15:0] DOT_DATA;
output [15:0]DOT_CON;
output USB_nCS;
output AD_nCS;
output DA_nCS;
output LCD_nCS;

reg CLK_OUT = 1'b1;
reg [15:0]DOT_CON =16'h0000;
reg [15:0]DOT_DATA =16'h0000;            

reg [13:0] DIV_counter = 14'h000;
reg [3:0] cnt= 4'h0;

parameter DIV_FACTOR = 14'h3f98;

//CPLD功能切换
assign CPLD_E = 2'b11;
//其他芯片功能禁止
assign USB_nCS = 1'b1;
assign AD_nCS = 1'b1;
assign DA_nCS = 1'b1;
assign LCD_nCS = 1'b1;

//时钟分频            
always@(posedge CLK_IN)
begin
              if(!nRST)
              begin
                            CLK_OUT <= 1'b1;
                            DIV_counter <= 10'h000;
              end
              else
              begin
                            if(DIV_counter <= DIV_FACTOR )
                            begin
                                          DIV_counter <= DIV_counter + 1;
                            end
              else
                            begin
                                          DIV_counter <= 12'h000;
                                          CLK_OUT <= !CLK_OUT;
                            end
              end
end
//点亮点阵            
always@(posedge CLK_OUT)
begin
              cnt = cnt+1;
              if(cnt == 4'h0)
              begin                           
                            DOT_CON  <= 16'h8000;
                                          DOT_DATA <= 16'hd800;
              end
              else if(cnt == 4'h1)   
    begin                                         
        DOT_CON   <= 16'h4000;
                            DOT_DATA  <= 16'h6c00;
              end
    else if(cnt == 4'h2)   
    begin                                         
                            DOT_CON  <= 16'h2000;
                            DOT_DATA <= 16'hb600;
              end
    else if(cnt == 4'h3)   
    begin                                         
        DOT_CON   <= 16'h1000;
                            DOT_DATA  <= 16'hdb00;
              end
    else if(cnt == 4'h4)
    begin                                         
        DOT_CON  <= 16'h0800;
                            DOT_DATA <= 16'h6d80;
    end           
    else if(cnt == 4'h5)  
    begin                                         
        DOT_CON  <= 16'h0400;
                            DOT_DATA <= 16'h2480;
              end
    else if(cnt == 4'h6)   
    begin                                         
        DOT_CON  <= 16'h0200;
                            DOT_DATA <= 16'h1240;
              end
    else if(cnt == 4'h7)
    begin                                         
        DOT_CON  <= 16'h0100;
                            DOT_DATA <= 16'h0920;
              end
    else if(cnt == 4'h8)
    begin                                         
        DOT_CON  <= 16'h0080;
                            DOT_DATA <= 16'h0490;
              end
    else if(cnt == 4'h9)  
    begin                                         
        DOT_CON  <= 16'h0040;
                            DOT_DATA <= 16'h0248;
              end
    else if(cnt == 4'ha)
    begin                                         
        DOT_CON  <= 16'h0020;
                            DOT_DATA <= 16'h0124;
              end
    else if(cnt == 4'hb)
    begin                                         
        DOT_CON  <= 16'h0010;
                            DOT_DATA <= 16'h0092;
              end
    else if(cnt == 4'hc)
              begin                                         
                            DOT_CON  <= 16'h0008;
                            DOT_DATA <= 16'h0000;   
              end                                                      
              else if(cnt == 4'hd)
              begin                                         
                            DOT_CON  <= 16'h0004;
                            DOT_DATA <= 16'h0000;
              end
    else if(cnt == 4'he)
              begin                                         
                            DOT_CON  <= 16'h0002;
                            DOT_DATA <= 16'h0000;
              end
    else if(cnt == 4'hf)  
    begin                                         
                            DOT_CON  <= 16'h0001;
                            DOT_DATA <= 16'h0000;
              end                    
end                           
endmodule
七、思考题
1、CLK_OUT是CLK_IN的几分频?
2、.UCF文件是做什么用的?
3、实验中的点阵LED是规格是什么?程序中用哪些引脚来控制LED?


实验三:LCD显示实验(一)一、实验目的二、实验内容三、实验例程
1LCD芯片介绍
LCD模块采用是LCM122326图形点阵模快,该模块是由2块NJU6450芯片构成,不带字库。其工作时序图如下图所示:
LCD模块行列分配:





LCD初始化如下所示
2 例程包含文件
  1. //main.v
  2. `timescale 1ns / 1ps
  3. module main(CLK, nPROCESSOR_RESET_Z, D, LCD_E, LCD_A0, LCD_R_nW, LCD_LED, LCD_nCS, CPLD_E, AD_nCS, DA_nCS, USB_nCS,);
  4.               input CLK;//100M aj15
  5.               input nPROCESSOR_RESET_Z;//ah5
  6.               inout [7:0] D;
  7.             
  8.               output [1:0] LCD_E;
  9.               output LCD_A0;
  10.               output LCD_R_nW;
  11.               output LCD_LED;
  12.               output LCD_nCS;
  13.               output [1:0] CPLD_E;
  14.               output AD_nCS;
  15.               output DA_nCS;
  16.               output USB_nCS;

  17.               wire CLK_LOCKED;
  18.               wire [7:0] DATA_OUT;
  19.               wire CLK_100K;
  20.               parameter DIV_FACTOR = 100;
  21.             
  22. //LCD功能始能
  23.               assign LCD_nCS = 1'b0;
  24. //CPLD功能切换
  25.    assign CPLD_E = 2'b11;
  26. //其他芯片功能禁止
  27.               assign AD_nCS = 1'b1;
  28.               assign DA_nCS = 1'b1;
  29.               assign USB_nCS = 1'b1;
  30.                            
  31. //系统时间分频
  32. //输入 50M  输出10M                           
  33.               v4_dcm CLK_DIV_10M (
  34.     .CLKIN_IN(CLK),
  35.     .RST_IN(!nPROCESSOR_RESET_Z),
  36.     .CLKDV_OUT(CLK_10M),
  37.     .CLKIN_IBUFG_OUT(),
  38.     .CLK0_OUT(),
  39.     .LOCKED_OUT(CLK_LOCKED)
  40.     );
  41. //模块时间分频
  42. //输入 10M  输出100K                           
  43.               CLK_DIV CLK_DIV_100K (
  44.     .CLK_IN(CLK_10M),
  45.     .nRST(CLK_LOCKED),
  46.     .CLK_OUT(CLK_100K)
  47.     );
  48.               defparam CLK_DIV_100K.DIV_FACTOR = DIV_FACTOR;

  49. /////////// LCD TEST              ///////////////
  50.               reg r_nw = 1'b1;
  51.               reg [6:0] zimo_num = 7'h00;
  52.               reg [6:0] mem_addr = 7'h00;
  53.               reg lcd_en = 1'b0;
  54.               reg [6:0] col_addr = 121;
  55.               reg [1:0] page_addr = 2'b11;
  56.               reg [4:0] disp_addr = 5'h00;
  57.             
  58.               wire [7:0] lcd_data;
  59.               wire lcd_done;
  60.               reg [16:0] tLCD_counter = 17'h00000;

  61.               LCD_DISPLAY LCD (
  62.               //输入参数
  63.     .CLK(CLK_100K),
  64.     .R_nW(r_nw),
  65.     .DISP_ADDR(disp_addr),
  66.     .PAGE(page_addr),
  67.     .COL_ADDR(col_addr),
  68.     .DISP_DATA(lcd_data),
  69.               //输出参数
  70.     .LCD_E(LCD_E),
  71.     .LCD_A0(LCD_A0),
  72.     .LCD_R_nW(LCD_R_nW),
  73.               //输入、出参数
  74.     .LCD_DB(D),
  75.               //输出参数
  76.     .LCD_LED(LCD_LED),
  77.     .DATA_OUT(),
  78.               .DONE(lcd_done)
  79.     );
  80.             
  81.               v4_lcd_ziku ZIMO(
  82.               .addr(mem_addr),
  83.               .clk(CLK_100K),
  84.               .dout(lcd_data),
  85.               .en(lcd_en));
  86.             
  87.               always@(posedge CLK_100K)
  88.               begin
  89.                             if(tLCD_counter == 17'h0c350)//0.5s
  90.                             begin
  91.                                           disp_addr <= disp_addr - 1; //显示地址
  92.                                           tLCD_counter <= 17'h00000;
  93.                             end
  94.                             else
  95.                             begin
  96.                                           tLCD_counter <= tLCD_counter + 1;
  97.                             end
  98.                            
  99.                             if(!lcd_done)
  100.                             begin
  101.                                           r_nw <= 1'b0;
  102.                                           lcd_en <= 1'b0;
  103.                             end
  104.                             else
  105.                             begin

  106.                                           r_nw <= 1'b1;
  107.                                           if(!r_nw)
  108.                                           begin
  109.                                                         lcd_en <= 1'b1;
  110.                                                         mem_addr <= zimo_num;
  111.                                                         if(zimo_num == 95)
  112.                                                                       zimo_num <= 0;
  113.                                                         else
  114.                                                                       zimo_num <= zimo_num + 1;                                                                     
  115.                                                       
  116.                                                         case(zimo_num)
  117.                                                                       0:
  118.                                                                       begin
  119.                                                                                     col_addr <= 23;
  120.                                                                                     page_addr <= 2'b00;
  121.                                                                       end
  122.                                                                       16:
  123.                                                                       begin
  124.                                                                                     col_addr <= 23;
  125.                                                                                     page_addr <= 2'b01;
  126.                                                                       end
  127.                                                                       32:
  128.                                                                       begin
  129.                                                                                     col_addr <= 68;
  130.                                                                                     page_addr <= 2'b00;
  131.                                                                       end
  132.                                                                       48:
  133.                                                                       begin
  134.                                                                                     col_addr <= 68;
  135.                                                                                     page_addr <= 2'b01;
  136.                                                                       end
  137.                                                                       64:                           
  138.                                                                       begin
  139.                                                                                     col_addr <= 113;
  140.                                                                                     page_addr <= 2'b00;
  141.                                                                       end
  142.                                                                       80:                           
  143.                                                                       begin
  144.                                                                                     col_addr <= 113;
  145.                                                                                     page_addr <= 2'b01;
  146.                                                                       end
  147.                                                                       default:              col_addr <= col_addr - 1;
  148.                                                         endcase
  149.                                           end
  150.                                           else
  151.                                           begin
  152.                                                         lcd_en <= 1'b0;
  153.                                           end
  154.                             end
  155.               end
  156. endmodule
复制代码


3 模块划分图
4 Memory 模块的建立及其例化

10、Memory模块的例化与DCM模块例化方法一致,请参考键盘实验中关于该部分的内容。下图中,黑色部分为Memory模块的例化语句。
四、实验准备五、实验步骤六、思考题
1、顶层文件main.v的功能是什么?输入输出信号各有几个?
2、顶层文件main.v调用了几个元件例化?各自的功能是什么?
3、顶层文件main.v还使用了哪些语句?其功能是什么?
实验三:LCD显示实验(二)一、实验目的二、实验内容三、实验步骤

完整的Word格式文档51黑下载地址:
EDA实验指导书.doc (1.18 MB, 下载次数: 23)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1