采用Verilog语言,语法与C语言比较像。根据我自己的理解,尽量每一步都给注释;
前沿知识:
变量:
变量是指程序运行时可以改变其值的量,下面主要介绍常用的两种。
Wire型:Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储 存值,用连续赋值语句 assign 赋值,定义为 wire [n-1:0] a ; 其中 n 代表位宽,如定义 wire a ; assign a = b ; 是将 b 的结点连接到连线 a 上。
Reg型:Reg 类型变量,也称为寄存器变量,可用来储存值,必须在 always 语句里使用。其定义为 reg [n-1:0] a ; 表示 n 位位宽的寄存器,如 reg [7:0] a; 表示定义 8 位位宽的寄存器 a。
赋值:“=”阻塞赋值,”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为 顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句 执行完成后,才进行赋值。
下图代码LED0为亮,1为灭。流水灯每次移动1位
module test //采用Quartus II 13.0sp1 (64-bit),不能用中文名,文件名要设置为test,文件夹名字一样 ( input clk, // 系统时钟50Mhz,即为1s input rst_n, // 复位开关 output reg[5:0] led // 从LED_0到LED_5 ); //前面都是定义输入和输出,提醒只有output多个时需要用reg,input不用 //下面定义时钟 reg [31:0] timer; always@(posedge clk or negedge rst_n)//posedge上升沿和negedge下降沿 begin if (rst_n == 1'b0) timer <= 32'd0; //如果复位开关状态为0,则计数器赋值为0 else if (timer == 32'd199_999_999) //(50M*6-1=299_999_999)下划线不影响表达 timer <= 32'd0; //计数完毕,清除计时器,重新计数,把这里else if删除后可以让流水灯不循环 else timer <= timer + 32'd1; //timer counter = timer counter + 1 end // LED control always@(posedge clk or negedge rst_n) begin if (rst_n == 1'b0)//判断复位开关状态 led <= 6'b000000;//初始状态,灯全灭 //when the reset signal active else if (timer == 32'd49_999_999) //第1个状态6位2进制,12个灯0表示亮1表示灭 led <= 6'b011111; else if (timer == 32'd99_999_999) //第2个状态6位2进制,12个灯0表示亮1表示灭 led <= 6'b101111; else if (timer == 32'd149_999_999) //第3个状态6位2进制,12个灯0表示亮1表示灭 led <= 6'b110111; else if (timer == 32'd199_999_999) //第4个状态6位2进制,12个灯0表示亮1表示灭 led <= 6'b111011; else if (timer == 32'd249_999_999) //第5个状态6位2进制,12个灯0表示亮1表示灭 led <= 6'b11101; else if (timer == 32'd299_999_999) //第6个状态6位2进制,12个灯0表示亮1表示灭 led <= 6'b111110; end endmodule