FPGA学习笔记(一)——Verilog语法

  • 设计中不用的语法
    initial(设计时不用,仿真时使用)
    task/function(设计不用,仿真时很少用)
    for/while/repeat/forever(设计不用,仿真很少用)
    integer(设计不用)
    模块内部不能有X态、Z态,内部不能有三态接口
    casex/casez(设计不用,仿真也不用)
    force/wait/fork(设计不用,仿真很少用)
    #5,延时语句(设计不用,仿真时使用)
  • 设计时使用的语法
    reg/wire/parameter
    assign(建议改名时使用)、always
    只允许使用if else和case两种条件语句

    算术运算符(+,-,*,/,%)
    赋值运算符(=,<=)(时序逻辑用<=,组合逻辑用=;其他情况不存在)
    关系运算符(>,<,>=,<=)
    逻辑运算符(&&,||,!)
    位运算符(~,|,^,&)
    移位运算符(<<,>>)
    拼接运算符({})
  • 电路设计的3种结构
    1.组合逻辑
always@(*)begin
	语句
end

2.时序逻辑
(a)同步复位的时序电路

always@(posedge clk)begin
	if(rst_n==1'b0)begin
		语句
	else begin
		语句
	end
end

(b)异步复位的时序电路

always@(posedge clk or negedge rst_n)begin
	if(rst_n==1'b0)begin
		语句
	else begin
		语句
	end
end
  • 电路举例
    1.组合逻辑
always@(*)begin
	if(a==1'b1)
		b=1'b0;
	else
		b=1'b1;
end
always@(*)begin
	case(a)
		1'b0:b=1'b1;
		1'b1:b=1'b0;
		default:b=1'b0;
	endcase
end

2.时序逻辑——同步复位的时序电路

always@(posedge clk)begin
	if(rst_n==1'b0)begin
		b<=1'b0;
	else begin
		if(a==1'b0)
			b<=1'b1;
		else
			b<=1'b0;
	end
end
always@(posedge clk)begin
	if(rst_n==1'b0)begin
		b<=1'b0;
	else begin
		case(a)
			1'b0:b<=1'b1;
			1'b1:b<=1'b0;
			default:b<=1'b0;
		endcase
	end
end

3.异步复位的时序电路

always@(posedge clk or negedge rst_n)begin
	if(rst_n==1'b0)begin
		b<=1'b0;
	else begin
		if(a==1'b0)
			b<=1'b1;
		else
			b<=1'b0;
	end
end
always@(posedge clk or negedge rst_n)begin
	if(rst_n==1'b0)begin
		b<=1'b0;
	else begin
		case(a)
			1'b0:b<=1'b1;
			1'b1:b<=1'b0;
			default:b<=1'b0;
		endcase
	end
end
  • 电路设计的要点
    1.一个always只产生一个信号
always@(posedge clk or negedge rst_n)begin
	if(rst_n==1'b0)begin
		b <= 1'b0;
	else begin
		b <= 1'b1;
	end
end

2.一个信号只能在一个always产生
3.always是描述一个信号的产生的方法。即在什么情况下,这个信号的值为多少;在其他情况下,值为多少(要考虑全部情况)
错误示范:

b<=b+1;
if(b==8)
	b<=0;

正确:

if(b==8)
	b<=0;
else
	b<=b+1;

4.条件判断只允许使用if else和case,其他全部不用(包括casex)
5含有posedge或negedge的,一定是D触发器,是时序电路。
6.设计时,如果想立即有结果,就用组合逻辑。如果想延时一拍有结果,就用时序逻辑。

你可能感兴趣的:(学习,2019暑假学习,FPGA)