前言:
今天我将介绍的是Verilog的使用用法,然后如何用Verilog编写一个简单的小项目,项目的内容如标题所示——“数显LED的亮度控制电路”,本文章大致结构如下。
- 介绍Verilog的基本语法
- 介绍Verilog的基本底层电路
- 总结归纳初学者可能犯得错误,并进行纠正
当我们对Verilog有了一定的了解后,就开始编写今天的项目了,思路如下:
- 项目任务的解析
- 设计思路
- 编写代码
- 成果展示
希望大家可以从易到难,慢慢的去理解、并熟练的运用这种语言。
那么任务开始了。
第一部分:Verilog硬件描述语言语法总结
一、摘录10条基本语法
1、module:模块的建立
module addr (a, b, cin, count, sum);
endmodule
每个模块以module开始,必须以endmodule结尾
2、input:数据的输入
input [2:0] a;
使用input函数输入一个值,且位长为2-0+1=3
3、output:数据的输出
output [2:1] sum;
使用output函数输出一个值,且位长为2-1+1=2
4、assign:数据赋值
assign {count,sum} = a +b + cin;
注意:对于assign必须为wire型,并且{ }具有连接作用
5、assign:数据选择赋值
assign equare = (a == b) ? 1:0 ;
当满足(a==b)时,equare=1,反之为0
6、always:条件触发
always@(posedge clk or negedge key)begin
end
如图为条件触发,当clk为高电平,且key为低电平时,满足条件进入always程序
7、wire ,reg:定义数据类型
wire [3:0]q;
reg [4:0]q2;
定义一个数据类型为wire且长度为4的q,和数据类型为reg长度为5的q2
8、if else:条件选择语句
if (a>b)a=0;
else a=1;
当满足括号内的条件时,则运行后面的程序,否则则运行else的程序。
9、case:多重条件选择语句
case (key) begin
1:a=1;break;
2:b=1;break;
default :c=1;break;
endcase
当key满足1,2,3的条件时,分别执行相应的语句,结尾记得用endcase结尾
10、task:与函数类似,用task进行包装
task q_sub();
begin
q=1;
end
endtask
task的作用是,可以不必把所有的代码写到一个always中去,这样的代码看起来更加美观
二、摘录10条基本底层电路
1、数据选择器
module mux2(out,a,b,sel);
input a,b,sel;
output out;
reg out;
always @(sel or a or b) begin
if (sel) out = a; else out = b;
end
endmodule;
2、数据比较器
module compare(a,b,y);
input [2:0] a,b;
output y;
reg y;
always @ (a or b) begin
if (a < b) y = 1;
else y = 0;
end
endmodule
3、二进制计数器
module Bin_count(clr,clk,q);
input clk,clr;
output [3:0]q;
reg [3:0]q;
always @(negedge clk or posedge clr) begin
if(clr) q=0;
else q=q+1;
end
endmodule
4、100分频电路
module div100_clk(clk,q);
input clk;
output q;
reg [5:0]cunt;
reg q;
always @(posedge clk) begin