FPGA项目一:1位闪烁灯设计(下 )

简介: FPGA项目一:1位闪烁灯设计

3.3 信号定义


下面需要将 module 补充完整,首先要做的是定义信号的类型。在判断信号类型时会感到很困惑,搞不清楚如何确定 reg 和 wire。其实大多数的困惑是因为联想的太多,例如认为 reg 就是寄存器,wire 是线,或者认为 reg 类型会综合成寄存器,wire 类型不会综合成寄存器,然而实际上这些与信号是reg 型还是 wire 型都并无关系。至简设计法建议不要进行任何联想,只遵从一个规则“用 always 实

现的是 reg 型,其他都是 wire 型”。进行信号定义时,除了信号的类型,还需要确定信号的位宽。至简设计法在这里分享一个非常实

用的获取信号位宽的技巧:打开计算器,点击“查看”,选择“程序员”模式,在“十进制”下输入数字后就会获得对应的信号位宽。

cnt0 是用 always 产生的信号,因此类型为 reg。根据前文计算可知 cnt0 计数的最大值为 500_000_000,根据至简设计法的实用技巧,打开计算器后在程序员模式十进制下输入 500_000_000,如下图所示。可以看出,信号的位宽为 29。

1670845838788.jpg

综上所述 cnt0 的定义代码如下:

1670845846774.jpg

同样的,cnt1 也是用 always 产生的信号,因此类型为 reg。cnt1 计数的最大值为 8,需要用 4根线表示,即位宽是 4 位。编辑模式下输入“Reg4”调用至简设计法模板,补充完整后得到代码表示如下:

1670845857877.jpg

add_cnt0 和 end_cnt0 都是用 assign 方式设计的,因此类型为 wire。其值是 0 或者 1,用 1 根线表示即可,即位宽为 1。编辑模式下输入“Wire1”调用至简设计法模板,补充完整后得到代码表示如下:

1670845867062.jpg

同样的,add_cnt1 和 end_cnt1 也是用 assign 方式设计的,类型为 wire。其值是 0 或者 1,位宽为 1。编辑模式下输入“Wire1”调用至简设计法模板,补充完整后得到代码表示如下:

1670845874095.jpg

led 是用 always 方式设计的,因此类型为 reg。led 信号值是 0 或者 1,1 根线表示即可。编辑模式下输入“Reg1”调用至简设计法模板,补充完整后得到代码表示如下:

1670845881478.jpg

x 是用 always 方式设计的,因此类型为 reg。其最大值为 500_000_000,需要用 29 根线表示,即位宽为 29。需要注意的是:这里的 x 是使用组合逻辑设计的,综合结果也不会有寄存器,但是遵循刚刚提到的信号判断原则,x 是用 always 设计出来的,所以依旧使用 reg 型来进行定义。代码表示如下:

1670845888668.jpg

至此,整个代码的设计工作已经完成。完整版的工程代码如下:

module mdyBookMyLed(
    clk,
    rst_n,
    led
    );
input   clk;
input   rst_n;
output  led;
reg [28:0] cnt0;
reg [3:0]  cnt1;
wire add_cnt0;
wire end_cnt0;
wire add_cnt1;
wire end_cnt1;
reg  led;
reg [28:0]x;
/***计数器cnt0计算时间***/
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt0<=0;
    end
    else if(add_cnt0)begin
        if(end_cnt0)
            cnt<=0;
        else
            cnt0<=cnt0+1;
    end
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0&&cnt0==x-1;
/***第二个计数器计数次数***/
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt1<=0;
    end
    else if(add_cnt1)begin
        if(end_cnt1)
            cnt1<=0;
        else
            cnt1<=cnt1+1;
    end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1==9-1;
/***led亮灭信号控制****/
always @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        led<=1;
    end
    else if(add_cnt0&&cnt0==50_000_000-1)begin
        led<=0;
    end
    else if(end_cnt0)begin
        led<=1;
    end
 end
/****变量x控制*****/
always @(*)begin
    if(cnt1==0)begin
        x=100_000_000;
    end
    else if(cnt1==1)begin
        x=150_000_000;
    end
    else if(cnt1==2)begin
        x=200_000_000;
    end
     else if(cnt1==3)begin
        x=250_000_000;
    end
     else if(cnt1==4)begin
        x=300_000_000;
    end
     else if(cnt1==5)begin
        x=350_000_000;
    end
     else if(cnt1==6)begin
        x=400_000_000;
    end
     else if(cnt1==7)begin
        x=450_000_000;
    end
     else begin
        x=500_000_000;
    end
end
/******至此程序已经结束****/


第四节 综合和上板


上一节完成了代码的设计,接下来需要对其进行综合以及上板调试。


4.1 新建工程


打开软件 Quartus Ⅱ,点击 File 下拉列表中的 New Project Wzard…新建工程选项,如图 3.1- 57 所示。

1670845925894.jpg

随后如下图所示的 Quartus 新建工程介绍,直接点击“Next”。

1670845936560.jpg

此时会出现工程文件夹、工程名、顶层模块名设置界面,如错误!未找到引用源。11 所示。


注意目录为:D:/mdy_book/mdyBookMyLed,工程名和顶层名为 mdyBookMyLed。


这里再次进行强调,为了避免初学者使用过程中出现报错情况,强烈建议按照本书的工程名和文件名进行设置,设置完成后点击 Next。

1670845946691.jpg

新建工程类型设置选择“Empty project”,如下图所示,然后点击“Next”。

1670845961354.jpg

1670845970706.jpg

文件添加界面如图 3.1-61 所示,此时添加之前写的“mdyBookMyLed.v”文件,点击右侧的“Add”按钮后文件会在下方显示出来,随后点击“Next”。

文件添加界面如图 3.1-61 所示,此时添加之前写的“mdyBookMyLed.v”文件,点击右侧的“Add”按钮后文件会在下方显示出来,随后点击“Next”。

1670845980177.jpg

芯片型号选择界面如图 3.1-62 所示,选择“Cyclone ⅣE”,在芯片型号选择处选择“EP4CE15F23C8”,然后点击“Next”。

1670845990781.jpg

QUARTUS 设置工具界面如图 3.1-63 所示,不必要修改,直接点击“Next”。

1670845999227.jpg

图 3.1-65 中可以看到新建工程的汇总情况,点击“Finish”,完成新建工程。


4.2 综合


新建工程步骤完成后,QUARTUS 界面如下图所示。

1670846013472.jpg

点击编译按钮,可以对整个工程进行编译,编译成功后的界面如图 3.1-66 所示。

1670846020840.jpg


4.3 配置管脚


下面需要对相应管脚进行配置。如图 3.1-67 所示,在菜单栏中选中 Assignments 后选择 Pin Planner,随后配置管脚的窗口就会弹出。

1670846030554.jpg

在配置窗口最下方中的 location 一列,按照表 3.1-2 中最右两列进行 FPGA 管脚的配置。此处配置管理来源的选择在最开始的管脚配置设计环节中有进行讲解,最终配置的结果见图 3.1-68。

1670846037903.jpg

1670846045823.jpg

配置完成后关闭“Pin Planner”,软件自动会保存管脚配置信息。


4.4 再次综合


再次打开“QUARTUS”软件,在菜单栏中选中“Processing”,然后选择“Start Compilation”,再次对整个工程进行编译和综合,如图 3.1-69 所示。

1670846060517.jpg

1670846069242.jpg

当出现图 3.1-70 时说明编译综合成功。


4.5 连接开发板


完成编译后开始进行上板调试操作,首先进行开发板的连接。按照图 3.1-71 中的方式将下载器接入电脑 USB 接口,接上开发板电源后按下开发板下方蓝色开关。

1670846091847.jpg


4.6上板


单击图 3.1-72QUARTUS 界面中的

1670846104485.jpg

按钮,弹出配置界面。

1670846114645.jpg

随后点击 add file 后添加.sof 文件,之后点击“Start”,在“Progress”会显示出进度。

1670846121871.jpg

如图 3.1-73 所示,“Progress”进度条中提示成功后即可在开发板上观察到相应的现象。可以看到开发板上的 LED 灯开始闪烁,并且按照亮一秒灭一秒,亮两秒灭一秒的规律进行循环闪烁。当观察到开发板上的 LED 灯可以照常闪烁,并且在亮九秒灭一秒后又回到亮一秒灭一秒的循环时就可以判断此次实验成功。如果出现 LED 灯不亮或者不能按照规律进行闪烁等情况时,需要回头思考检查问题的出现点,建议可以多进行几遍操作,不要粗心,找到错误点后进行改正。


第五节 modelsim仿真


编写测试代码如下:

module tb_my_led;
parameter CYCLE = 20;
reg clk;
reg rst_n;
wire  led; 
my_led uut(
 . clk      (clk),
 . rst_n    (rst_n),
 . led      (led)
);
initial begin
    clk = 0;
    forever#(CYCLE/2)begin
        clk=~clk;
    end
end
initial begin
    #1;
    rst_n = 0;
    #(10*CYCLE);
    rst_n = 1;
end
endmodule


用Modelsim去添加文件仿真得结果:

1670846257922.jpg

找到编写文件的并加载。

1670846265581.jpg

1670846275223.jpg

1670846282478.jpg

1670846288408.jpg

1670846297090.jpg

1670846303965.jpg

1670846309823.jpg


相关文章
|
异构计算
FPGA项目二:4位闪烁灯设计(下)
FPGA项目二:4位闪烁灯设计
156 1
FPGA项目二:4位闪烁灯设计(下)
|
程序员 异构计算
FPGA项目二:4位闪烁灯设计(中)
FPGA项目二:4位闪烁灯设计
192 0
FPGA项目二:4位闪烁灯设计(中)
|
异构计算
FPGA项目二:4位闪烁灯设计(上)
FPGA项目二:4位闪烁灯设计
248 0
FPGA项目二:4位闪烁灯设计(上)
|
机器学习/深度学习 芯片 异构计算
FPGA项目一:1位闪烁灯设计(上)
FPGA项目一:1位闪烁灯设计
206 0
FPGA项目一:1位闪烁灯设计(上)
|
6天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
19 1
|
27天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
42 4
|
27天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
存储 算法 数据处理
基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本系统在原有的8PSK调制解调基础上,新增了高斯信道与误码率统计模块,验证了不同SNR条件下的8PSK性能。VIVADO2019.2仿真结果显示,在SNR分别为30dB、15dB和10dB时,系统表现出不同的误码率和星座图分布。8PSK作为一种高效的相位调制技术,广泛应用于无线通信中。FPGA凭借其高度灵活性和并行处理能力,成为实现此类复杂算法的理想平台。系统RTL结构展示了各模块间的连接与协同工作。
49 16
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现16QAM调制解调通信系统,使用Verilog语言编写,包括信道模块、误码率统计模块。通过设置不同SNR值(如8dB、12dB、16dB),仿真测试系统的误码性能。项目提供了完整的RTL结构图及操作视频,便于理解和操作。核心程序实现了信号的生成、调制、信道传输、解调及误码统计等功能。
40 3
|
8天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了256QAM调制解调算法的仿真效果及理论基础。使用Vivado 2019.2进行仿真,分别在SNR为40dB、32dB和24dB下生成星座图,并导入Matlab进行分析。256QAM通过将8比特数据映射到复平面上的256个点,实现高效的数据传输。Verilog核心程序包括调制、信道噪声添加和解调模块,最终统计误码率。
15 0

热门文章

最新文章