当前位置:文档之家› 基于DE2-115开发板的FPGA入门设计实验

基于DE2-115开发板的FPGA入门设计实验

. ;. 基于DE2-115开发板的FPGA入门设计实验

1、Lab1: 4位加法器、减法器的设计 1.1 摘要 在文件add_sub里面的工程文件operation_4.v为顶层文件,该顶层文件包含了三个子模块,分别为数码管显示模块,4位带进位的二进制加法器模块和4位带借位的二进制减法器模块,最后通过DE2-115开发板显示实验结果。 1.2 程序 1)add_4bits.v 加法器 module adder_4bits ( input clk, input rst_n, input [3:0] x, input [3:0] y, output reg [3:0] sum, output reg carry_out //溢出位 ); always@(posedge clk or negedge rst_n) begin if(!rst_n) . ;. {carry_out, sum} <= 0; else {carry_out, sum} = x + y; end endmodule 2)substractor_4bits.v减法器 module subtractor_4bits ( input clk, input rst_n,

input [3:0] x, input [3:0] y, output reg [3:0] sub, output reg borrow_out ); always@(posedge clk or negedge rst_n) begin if(!rst_n) {borrow_out, sub} <= 0; else begin . ;. if(x >= y) {borrow_out, sub} = {1'b0, x - y}; else {borrow_out, sub} = {1'b1, x - y}; end end endmodule 3)seg7_lut.v 数码管显示译码模块 module Seg7_lut ( input [3:0] iDIG, output reg [6:0] oSEG ); always @(iDIG) begin case(iDIG) 4'h1: oSEG = 7'b1111001; // ---t---- 4'h2: oSEG = 7'b0100100; // | | 4'h3: oSEG = 7'b0110000; // lt rt 4'h4: oSEG = 7'b0011001; // | | 4'h5: oSEG = 7'b0010010; // ---m---- 4'h6: oSEG = 7'b0000010; // | | . ;. 4'h7: oSEG = 7'b1111000; // lb rb 4'h8: oSEG = 7'b0000000; // | | 4'h9: oSEG = 7'b0011000; // ---b---- 4'ha: oSEG = 7'b0001000; 4'hb: oSEG = 7'b0000011; 4'hc: oSEG = 7'b1000110; 4'hd: oSEG = 7'b0100001; 4'he: oSEG = 7'b0000110; 4'hf: oSEG = 7'b0001110; 4'h0: oSEG = 7'b1000000; endcase end endmodule 1.3 结果 本设计通过Verilog HDL硬件描述语言。描述加法、减法算法,包括了进位以及借位,最终可以在实验板上观察结果,验证了算法的正确性。拨码开关SW[7:0]输入两位计算值,SW[17]为复位按键,如下图所示:

该实验结果显示的是7+b=02,进位位在LEDG[0]显示,.

;. 7-b=12,借位位在LEDR[0]显示。计算过程如下: .

;. 2、Lab2: 三位二进制乘法器的设计 2.1 摘要 在文件mult_3bits里面的工程文件operation_4.v为顶层文件,该顶层文件包含了两个子模块,分别为数码管显示模块和三位二进制乘法器模块,最后通过DE2-115开发板显示实验结果。 2.2 程序 1)mult_3bits.v 乘法器 module mult_3bits ( input [2:0] x, input [2:0] y, output [5:0] mult_out ); wire [2:0] temp0 = y[0] ? x : 3'd0; wire [2:0] temp1 = y[1] ? x : 3'd0; wire [2:0] temp2 = y[2] ? x : 3'd0; assign mult_out = temp0 + (temp1 << 1) + (temp2 << 2); endmodule 2)seg7_lut.v文件与Lab1中的相同 2.3 结果 本设计通过Verilog HDL硬件描述语言,通过移位以及. ;. 加法,实现三位二进制乘法功能,最终可以在实验板上观察结果,验证了算法的正确性。拨码开关SW[6:0]输入两位计算值,SW[17]为复位按键,如下图所示: .

;. 3、Lab3: 序列检测器的设计 3.1 摘要 通过Verilog HDL硬件描述语言,按照要求,设计一个序列检测器,在检测到4’b1111序列后输出高电平标志位,反之输出低电平。电路在Quartus II中设计,最后通过波形图仿真和开发板得出实验结果。 3.2 程序 sequence_detect.v 序列检测器 module sequence_detect ( input clk, input rst_n, input din_en, //H vaild input din, output reg dout ); //capture the posedge of din_en for data receive reg din_en_r0,din_en_r1; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin . ;. din_en_r0 <= 0; din_en_r1 <= 0; end else begin din_en_r0 <= din_en; din_en_r1 <= din_en_r0; end end wire din_flag = (~din_en_r1 & din_en_r0) ? 1'b1 : 1'b0; //din_en的值由0变1时,din_flag的值变为高电平维持一个时钟周期(脉冲边沿检测) //din_en作为数据输入的标志 //-------------------------------------------- reg [3:0] sequence_data;//序列数据寄存器 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin sequence_data <= 0;//初始化时寄存器状态 dout <= 0; //寄存器输出为0 end . ;. else if(din_flag)//din_en上升沿,din_flag=1 begin sequence_data <= {sequence_data[2:0], din}; //串行输入 dout <= (sequence_data == 4'b1111) ? 1'b1 : 1'b0; end end endmodule 3.3 结果 该程序中定义可串行输入接口:din,串行输出接口dout,同时添加了数据输入标志信号din_en,以指示数据的输入。 串行数据输入序列通过移位操作,存入与sequence_data中,同时检测sequence_data,当出现4’b1111时,dout输出1表示检测到了要求的序列。其中仿真结果如下: .

;. 4、Lab4: 变模计数器的设计 4.1 摘要 在设计一个计数器的前提下,要求模值可变,即计算器最大值可变。因此,这要求能动态改变计数器的模值,同时在数码管上实时显示输出结果。在文件variable_counter里面的工程文件variable_counter.v为顶层文件,该顶层文件包含了一个数码管显示子模块,最后通过DE2-115开发板显示实验结果。 4.2 内容 1)变模的实现 模值可以通过选择,也可以通过输入,来动态改变。在该实验中,通过一个拨码开关SW[0]来选择模值“16”或者“64”,实现选择通过一个选择语句即可实现。如下语句: wire [7:0] max_vaule = SW[0] ? 8'd64 : 8'd16; 2) 输出显示 本实验通过2个7段数码管来显示数据。同时为了肉眼能看到数据的变化,通过计数,实现0.25S的使能标志定点时间,以此标志位来作为计数器的计数周期,保证肉眼可以看得到数据的变化。 4.3 程序 1) variable_counter.v 变模计数器顶层模块 module variable_counter

相关主题