系统: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的高四位拼接起来,作为一个新的信号,注意[]表示位置