系统:win10
平台:Quartus II
FPGA:EP4CE6
Verilog和C的区别
Verilog是硬件描述语言,在编译下载到FPGA之后,会生成电路,所以Verilog全部是并行
处理与运行的;C语言是软件语言,编译下载到单片机/CPU之后,还是软件指令,而不会根据
你的代码生成相应的硬件电路,而单片机/CPU处理软件指令需要取址、译码、执行,是串行执
行的。
1 信号类型声明:
reg cout; //定义cout为数据类型reg
reg [3:0] out; //四位reg型号
wire a,b,c,d,f; //定义为wire(连线)型
一般定义个声明放到一起
output reg f;
output reg [3:0] out;
或者将端口声明和定义放到一起
module aoi(input wire a,b,c,d, output wire f);
endmodule
2 逻辑功能定义
assig 持续赋值语句定义
例1 assign f=~((a&b)|(~(c&d))); //逻辑功能描述
例2 always @(a or b or c or d)
begin
f=~((a&b)|(~(c&d)));
end
endmodule
3 调用元件
内置门元件调用
and a3(out,a,b,c); //调用三输入与门
and c2(out,in1, in2); //二输入与门
4 逻辑值
逻辑0 GND
逻辑1 VCC
逻辑x 未知
逻辑z 高组态,外部没有激励信号是一个悬空状态
5 进制
二进制表示如下:4’b0101表示4位二进制数字0101;
十进制表示如下:4’d2表示4位十进制数字2(二进制0010);
十六进制表示如下:4’ha表示4位十六进制数字a(二进制1010),十六进制的计数方式
为0,1,2…9,a,b,c,d,e,f,最大计数为f(f:十进制表示为15)。
默认32位位宽, 10进制数
16’b1001_1010_1010_1001 = 16’h9AA9 //前面的下划线为增加可读性,编译时会忽略
5 标识符
字母数字$下划线 第一个字符必须是字母或下划线
区分大小写
不建议大小写混合使用
内部信号建议全部小写
信号命名体现信号的含义
推荐写法: 使用下划线进行区分
有意义的:sum cpu_addr
clk_50, clk_cpu
6 数据类型
1 寄存器类型:
reg [31:0]delay_cnt; //延时计数 [31:0]寄存器位宽,32位寄存器
reg key_reg; // 默认位宽1, 不定值x
reg只能在always和initial语句被赋值
时序逻辑: always有时钟信号,对应的是寄存器
组合逻辑: always不带时钟信号,硬件连线
2 线网类型:
wire key_flag; 不能存储值,值由驱动他的元件所决定
门 连续赋值语句,assign能够给wire变量赋值
默认高组态z
3 参数类型:(常亮)跟define 提高代码可读性和修改方便
//parameter define
parameter Hagsg = 11'd41;
常用语表示状态机,数据位宽, 延迟大小
7 运算符
算数运算符:加减乘除 %
关系运算符:
逻辑运算符: ! && ||
条件运算符:
a?b:c (如果a为真,则选择b,否则选择c)
位运算符:
~a 将a每一位取反
a^b 异或
移位运算符:
a<<b 将a左移b位,这里注意左移会增加b位,低位补0,高位直接增加
a>>b 右移b位,注意:高位补0, 低位直接干掉
拼接运算符:{a,b}
{a,b[7:3]} 将a和b的高四位拼接起来,作为一个新的信号,注意[]表示位置