当前位置: 首页 > article >正文

Quartus + VScode 实现模块化流水灯

文章目录

  • 一、通过VScode编写Verilog代码
  • 二、模块化编程
  • 三、代码示例

一、通过VScode编写Verilog代码

1、下载Vscode
2、下载相关插件
请添加图片描述
搜索Verilog就会弹出有如图所示的插件,下载并安装
3、创建Quartus项目
4、创建完成后点击Tools,选择Options
请添加图片描述
然后在如图所示中,选择VScode.exe所在路径,并在后面添加-r -g %f:%l
5、创建新的Verilog文件,然后会自动跳转VScode
请添加图片描述
6、在你项目路径下右键新建txt文件(文件名自己命名,不必要跟我一样),再把后缀改为.v
请添加图片描述
7、在VScode中点击FIle,然后点击openfIle,然后找到这个文件,打开
请添加图片描述
8、在这个文件里面编写Verilog代码,编写完成后ctrl+s保存,然后回到Quartus
9、右键点击Files,点击三个点,然后找到刚才的文件,添加,添加的文件会显示在下面,至于这里的文件为啥突然变名字了,后文会讲到
请添加图片描述
然后就可以在Quartus里面点击
请添加图片描述
到此为止,将VScode与Quartus结合就结束了

二、模块化编程

1、如图所示,分别有三个.v文件,就是分别三个模块
请添加图片描述
看着是不是有一种熟悉感,我的理解即是类似c语言那种函数调用,又类似C++的类封装,需要用的时候就拿出来用。
2、这里的m_design就是刚才的top,代表顶层模块,就是最主要的模块,另外两个模块就是分别实现其他功能的模块,当然可以有很多个次要模块。
3、需要注意的是顶层模块的模块名需要与工程名相同,但其他模块就没有要求
4、只需要重复上述创建模块的流程即可完成多模块的创建

三、代码示例

//顶层模块
module m_design(
    input  wire       clk,     
    input  wire       rst_n,   
    input  wire       key,     
    output wire [5:0] led      
);

wire en_1hz;  

clk_divider(
    .clk   (clk),
    .rst_n (rst_n),
    .en    (en_1hz)
);

led_controller(
    .clk   (clk),
    .rst_n (rst_n),
    .en    (en_1hz),
    .key   (key),
    .led   (led)
);


endmodule

//次要模块
module led_controller(
    input  wire       clk,
    input  wire       rst_n,
    input  wire       en,      
    input  wire       key,    
    output reg  [5:0] led
);

reg [5:0] state;      
reg pause_flag;       
reg [2:0] key_sync;   
wire key_negedge;    

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) 
        key_sync <= 3'b111;
    else 
        key_sync <= {key_sync[1:0], key}; 
end


assign key_negedge = (key_sync[2:1] == 2'b10);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        pause_flag <= 0;
    else if (key_negedge)
        pause_flag <= ~pause_flag;
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        state <= 6'b000001; 
    end else if (en && !pause_flag) begin
        state <= {state[4:0], state[5]};  
    end
end

always @(posedge clk) begin
    led <= state;  
end

endmodule

//次要模块
module clk_divider(
    input  wire clk,   
    input  wire rst_n,
    output reg  en     
);

parameter CLK_FREQ = 50_000_000; 
localparam CNT_MAX = CLK_FREQ - 1; 

reg [25:0] cnt; 

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= 0;
        en  <= 0;
    end else begin
        if (cnt == CNT_MAX) begin
            cnt <= 0;
            en  <= 1;    
        end else begin
            cnt <= cnt + 1;
            en  <= 0;
        end
    end
end
endmodule

流水灯效果


http://www.kler.cn/a/592931.html

相关文章:

  • MySQL-单表查询
  • Java 大视界 -- 基于 Java 的大数据分布式存储系统的数据备份与恢复策略(139)
  • 如何在electron中注册快捷键?
  • 【机器学习】强化学习
  • securtiy_crt访问ubuntu报Key exchange failed问题
  • PostgreSQL 视图
  • AI训练如何获取海量数据,论平台的重要性
  • Python实现WYY音乐下载
  • Redis复制(replica)主从模式
  • 【CMake指南】第12篇:CMake Unity Build 详解
  • Leetcode Hot 100 79.单词搜索
  • 如何把master迁出的bug修改分支,合并、删除本地、删除远端
  • 前端小食堂 | Day17 - 前端安全の金钟罩
  • leetcode日记(100)填充每个节点的下一个右侧节点指针
  • Vue3中ts父子组件传值
  • CSGHub开源版本v1.5.0更新
  • Leetcode-100 回溯法-子集
  • 单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明
  • 【深度学习量化交易18】盘前盘后回调机制设计与实现——基于miniQMT的量化交易回测系统开发实记
  • Leetcode 刷题笔记1 单调栈part01