学习FPGA编程,学习语法是编程的第一步的,今天就侃侃硬件仿C的硬件描述语言---verilog基本语法!
1.模块化编写输入输出接口:
module cmd_ctr (//module 模块名
clk,rst_n,enable,
h2l,data_in,end_cmd);
注意: 模块名与保存文件名cmd_ctr .v必须一致,编程编一个模块除了有你需要输出管脚,输入端通常还需要添加异步复位信号rst_n,同步时钟信号clk,以及开启触发模块工作的enable信号,输出端还有模块工作完成信号end_cmd。
2.各信号类型定义:
input clk;
input rst_n;
input enable;
input h2l;
input[7:0] data_in;
output dataout;
parameter t1ms=20'd49_999;//1000000ns/20ns=50000=1024*1024
reg[19:0] count;
reg iscount;
wire clock;
input与output定义输入输出信号,parameter用于定于参数类型为常数,wire用于信号或者模块之间的连线,reg为寄存器信号,用于暂存数据,区别reg有时是不能替代wire类型的,比如用作下个模块的时钟信号。
3.简单的always编写:
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
rdata<=4'b0001;
end
else if(dataend)
begin
case(datain)
8'h1d:rdata<={rdata[2:0],rdata[3]};
8'h22:rdata<={rdata[0],rdata[3:1]};
8'h14:rdata<={rdata[0],rdata[1],rdata[2],rdata[3]};
endcase
end
跟VHDL一样,verilog也是由一个一个的进程构成,只是构成的方式不同,VHDL由多个process组成,而verilog由多个always组成,而且编写的形式还是比较固定的,当然在编写时一定要有编写C语言的思维,因此一定要会用if,case语句。而且要养成每个case或者if后面一定要紧跟一个begin...........end语句,养成良好的编写习惯。
4.verilog编程两大利器之一:计数器
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
count<=13'd0;
end
else if(count==13'd4999)
begin
count<=13'd0;
end
els