一、电路设计的语法
-
设计不用的语法
- initial:设计不用,仿真时使用
- task/function:设计不用,仿真时少用
- for/while/repeat/forever:设计不用,仿真时少用
- integer:设计不用
- 模块内部不能有X态、Z态,内部不能有三态接口
- casex/casez:设计和仿真都不用
- force/wait/fork:设计不用,仿真少用
- #5:设计不用,仿真时使用
-
设计时使用的语法
- reg/wire、paremeter
- assign(建议改名时使用)、always
- 只使用if else/case两种条件语句
- 算术运算符(+、-、*、/、%)
- 赋值运算符(=、<=时序逻辑用<=,组合逻辑用=)
- 关系运算符(>、<、=、<=)
- 逻辑运算符(&&、||、!)
- 位运算符(~、|、^、&)
- 移位运算符(<<、>>)
- 拼接运算符({})
二、电路设计的结构
-
电路设计的3种结构
- 组合逻辑
always @(*) begin 语句 end
- 同步复位时序逻辑
always @(posedge clk) begin if(rst_n == 1'b0) begin 语句 end else begin 语句 end end
- 异步复位时序逻辑
always @(posedge clk or negedge rst_n)begin if(rst_n == 1'b0) begin 语句 end else begin 语句 end end
-
电路举例
- 组合逻辑
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
- 同步复位时序电路
always @(posedge clk) begin if(rst_n == 1'b0) begin b <= 1'b0; end 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; end else begin case(a) 1'b0:b <= 1'b1; 1'b1:b <= 1'b0; default:b <= 1'b0; endcase end end
- 异步复位时序电路
always @(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin b <= 1'b0; end 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; end else begin case(a) 1'b0:b <= 1'b1; 1'b1:b <= 1'b0; default:b <= 1'b0; endcase end end
三、电路设计要点
-
一个always只产生一个信号
always @(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin b <= 1'b0; end else begin b <= 1'b1; end end always @(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin a <= 1'b0; end else begin a <= 1'b1; end end
-
一个信号只能在一个always产生
-
always是描述一个信号产生的方法,即在什么情况下,这个信号的值是多少;在其他情况下值为多少,要全面考虑
-
条件判断只允许使用if else和case,其他全部不用
-
含有posedge和negedge的,一定是D触发器,是时序电路
-
设计时,如果想立即有结果,使用组合逻辑;如果想延时一拍有结果,就用时序逻辑