【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计

这篇具有很好参考价值的文章主要介绍了【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计

学习新语法,争做新青年

计数器实验升级,让8个LED灯每个0.5s的速率循环闪烁,流水灯ahh好久不见~ 去年光这个就把我折磨够呛。。我肉眼可见的脱发就是从那时候开始的。。在那两个月我直接掉了10斤啊喂~ (没节食、没运动、没失恋哈哈哈

  • 产生0.5s周期的计数器

1. version 1 - 移位法

1.1 设计输入

module led_run(
    Clk,
    Reset_n,
    Led
);
    input Clk;
    input Reset_n;
    output reg[7:0]  Led;
    
    reg[24:0] counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter <= 0;
    else if(counter == 24999999)
        counter <= 0;
    else
        counter <= counter + 1'b1; 
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led <= 8'b0000_0001;
    else if(counter == 24999999) begin
        if(Led == 8'b1000_0000)
            Led <= 8'b0000_0001;
        else
            Led <= Led << 1;
    end
    else 
        Led <= Led; //当然了,时序逻辑中不加这句话默认保持状态
endmodule

1.2 功能仿真

为了避免仿真跑的时间太长,我们ba0.5s替换为0.05s,所以我们姑且把24999999999替换为24999,也就是500ms→500ums。

`timescale 1ns/1ns

module led_run_tb();
    //激励信号
    reg Clk;
    reg Reset_n;
    wire[7:0] Led;
    
 led_run led_run_inst(  //例化
    //连线
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
);
    initial Clk = 1;
    always #10 Clk = ~Clk; //一个周期20ns
    
    initial begin
        Reset_n = 0;
        #201;
        Reset_n = 1;
        #4000000; //8*500us = 40000000ns
        $stop;
    end
    
endmodule

1.3 板子调试

别忘了把时间调回来啊喂!不然可看不出流水了~

是的,我写完这句话就忘调了。。不愧是我

2. version 2 - 循环移位

改进移位

module led_run1(
    Clk,
    Reset_n,
    Led
);
    input Clk;
    input Reset_n;
    output reg[7:0]  Led;
    
    reg[24:0] counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter <= 0;
    else if(counter == 25'd24999999)
    //else if(counter == 25'd24999) 
        counter <= 0;
    else
        counter <= counter + 1'b1; 
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led <= 8'b0000_0001;
    else if(counter == 25'd24999999) 
    //else if(counter == 25'd24999) 
        Led <= {Led[6:0], Led[7]};
    else 
        Led <= Led; //当然了,时序逻辑中不加这句话默认保持状态
endmodule
  • Led <= {Led[6:0], Led[7]};
    • {}:位拼接
    • 循环移位

虽然。。这种写法用的也不多~

那我们来仿真一下,test bench把例化时名称改一下就ok

没问题~~

3. version 3 - 3-8译码器

引入3-8译码器的逻辑

模块中调用模块:把文件拷贝过来 → Add files即可

这里例化模块和test bench中是一模一样的方法~ 我我我悟了!

`timescale 1ns/1ns

module led_flash_tb();
    //激励信号
    reg Clk;
    reg Reset_n;
    wire[7:0] Led;
    
 led_run2 led_run_inst(  //例化
    //连线
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
);
    initial Clk = 1;
    always #10 Clk = ~Clk; //一个周期20ns
    
    initial begin
        Reset_n = 0;
        #201;
        Reset_n = 1;
        #4000000; //8*500ms = 40000000ns
        $stop;
    end
    
endmodule
  • 由于现在Led是由底层模块驱动的,我们在底层已经定义为reg型了,所以顶层要去掉

4. 参数化设计

是的,你看到了,我转头就忘了把时间改回来了~

啊这就相当于C语言中的**#define定义常量**

我们在led_run中添加 ——

    parameter MCNT = 25'd24999;

并在led_run_tb中这样写:

     led_run led_run_inst(  //例化
        //连线
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led)
    );    
    defparam led_run_inst.MCNT = 24999;

或者在led_run_tb中这样来写

    led_run2
    #(
        .MCNT(24999)
    )
	led_run_inst(  //例化
        //连线
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led)
    );

让4个LED灯以不同的频率进行闪烁

0.1s, 0.2s, 0.3s, 0.4s…

led_flash.v

module led_flash (
    //端口
    Clk,
    Reset_n, //复位
    Led
);
    //端口定义
    input Clk;
    input Reset_n;
    output reg Led;
    
    parameter MCNT = 24999999;
    reg[24:0] counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        counter <= 0;
	else if(counter == MCNT) 
        counter <= 0;
    else     
        counter <= counter + 1'd1;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        Led <=0;
    else if(counter == MCNT) 
        Led <= !Led;

endmodule

led_run_8_test.v

`timescale 1ns / 1ps

module led_run_8_test(
        //端口
        Clk,
        Reset_n, //复位
        Led
    );
    
     //端口定义
     input Clk;
     input Reset_n;
     output[3:0] Led;    
     
    led_flash led_flash_inst0(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[0])
    );
    defparam led_flash_inst0.MCNT = 2499999;//0.1s
    
     led_flash led_flash_inst1(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[1])
    );
    defparam led_flash_inst1.MCNT = 4999999;//0.2s

    
    led_flash led_flash_inst2(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[2])
    );
    defparam led_flash_inst2.MCNT = 7499999; //0.3s 150ms = 150000000ns/20ns = 7500000

    
     led_flash led_flash_inst3(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[3])
    );
    defparam led_flash_inst3.MCNT = 9999999; //0.4s 200ms = 200000000/20ns = 10000000

   
endmodule

添加约束文件

右击,手动设置为target

复制之前自动生成的代码,并稍作改动,然后下载到板子上就okk啦~ 就是为了巩固一下参数化设计~~文章来源地址https://www.toymoban.com/news/detail-674086.html

到了这里,关于【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA设计——verilog实现乒乓操作并modelsim仿真

    乒乓操作是FPGA设计中常用的一种技巧,它通过数据流控制实现按节拍相互配合的切换,来提高数据处理效率,达到无缝缓冲和处理的效果。本文针对乒乓操作进行学习总结。 完整工程 一、原理图如下 : 1、二选一控制器来对缓冲模块1和2进行选择。 2、数据缓冲模块一般就是

    2023年04月08日
    浏览(48)
  • 【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

    1.1 索引目的 本篇索引旨在 收藏CSDN全站中有关数字IC领域高价值文章 ,在数字芯片领域中,就算将架构,设计,验证,DFT,后端诸多岗位加在一起的数量,都不及软件类一个细分方向的岗位数量多,反映在社区氛围或是开源资料的丰富度而言,数字IC领域相较于软件/互联网领

    2024年02月03日
    浏览(120)
  • 基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

    慢时钟到快时钟一般都不需要处理,关键需要解决从快时钟到慢时钟的问题,因为可能会漏信号或者失真,比如: 第一种办法是开环解决方案,也就是人为设置目标信号脉宽大于1.5倍的周期。但是容易和设计要求冲突 所以第二个大方法是闭环解决方案,也就是从改善同步方

    2024年02月03日
    浏览(49)
  • FPGA | Verilog基础语法

    菜鸟教程连接 举例(\\\"//\\\"符号后的内容为注释文字): initial $dumpfile (“myfile.dump”); //指定VCD文件的名字为myfile.dump,仿真信息将记录到此文件 可以指定某一模块层次上的所有信号,也可以单独指定某一个信号。 典型语法为$dumpvar(level, module_name); 参数level为一个整数,用于指

    2024年02月05日
    浏览(52)
  • 【FPGA/verilog -入门学习11】verilogTestbench中的文本文件写入,读出,打印等操作

    本文参考:Verilog中的系统任务(显示/打印类)--$display, $write,$strobe,$monitor-CSDN博客 Verilog:parameter、localparam的区别和用法-CSDN博客 Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor_verilog fopen-CSDN博客 Verilog的系统任务----$readmemh和$readmemb-CSDN博客 $display可以

    2024年02月03日
    浏览(45)
  • 基于vivado(语言Verilog)的FPGA学习(2)——zedboard开机测试和程序烧写

    终于找到之前写的部分了,在OneNote上,以后还是专注写在一个地方 ZedBoard 可以通过四个不同的方法烧写,这些方法是: USB-JTAG 这是默认的并且是最直接的烧写 ZedBoard 的方法 , 这只要通过 ZedBoard 工具包的 USB 到 micro-USB 连接线就可以直接完成。 传统 JTAG 板卡上有一个可用的

    2024年02月16日
    浏览(56)
  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(45)
  • [从零开始学习FPGA编程-32]:进阶篇 - 基本时序电路-D触发器(Verilog语言)

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:  目录 第1章 什么是时序电路 1.1 时序电路 1.2 什么是触发器

    2023年04月08日
    浏览(52)
  • 【FPGA入门】第一篇、Verilog基本语法常识

    目录 第一部分、不同的变量类型 1、wire和reg的区别  2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模块之间例化,不定义变量直接用的方式 5、常

    2024年02月04日
    浏览(52)
  • 【FPGA教程案例95】机器学习2——基于FPGA的SVM支持向量机二分类系统实现之Verilog编程设计

    FPGA教程目录 ​​​​​​MATLAB教程目录 本课程成果预览(o_check=0表示分类1,o_check=1表示分类2,识别率为98.7%) 目录 1.软件版本

    2023年04月08日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包