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) beginif (!rst_n) key_sync <= 3'b111;else key_sync <= {key_sync[1:0], key};
endassign key_negedge = (key_sync[2:1] == 2'b10);always @(posedge clk or negedge rst_n) beginif (!rst_n)pause_flag <= 0;else if (key_negedge)pause_flag <= ~pause_flag;
endalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginstate <= 6'b000001; end else if (en && !pause_flag) beginstate <= {state[4:0], state[5]}; end
endalways @(posedge clk) beginled <= state;
endendmodule//次要模块
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) beginif (!rst_n) begincnt <= 0;en <= 0;end else beginif (cnt == CNT_MAX) begincnt <= 0;en <= 1; end else begincnt <= cnt + 1;en <= 0;endend
end
endmodule
流水灯效果