文章目录
一、通过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、只需要重复上述创建模块的流程即可完成多模块的创建
三、代码示例
bash
//顶层模块
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
流水灯效果