军用FPGA软件 Verilog语言的编码准测之触发器、锁存器
语言 :Verilg HDL
EDA工具:ISE、Vivado、Quartus II
-
-
- [军用FPGA软件 Verilog语言的编码准测之触发器、锁存器](#军用FPGA软件 Verilog语言的编码准测之触发器、锁存器)
-
- 一、引言
- 二、基本编程规范之触发器
-
- [强制准则1---禁止在同一个 always 语句中混合使用有复位和无复位的触发器。](#强制准则1---禁止在同一个 always 语句中混合使用有复位和无复位的触发器。)
- 强制准则2---在复位或者初始化时,必须对触发器赋初值
- 强制准则3----复位信号的触发条件与进入条件必须一致
- 三、基本编程规范之锁存器
- 四、总结
-
-
关键词: 安全子集,Verilog HDL,编码准则 ,触发器、锁存器
一、引言
本文学习军用可编程逻辑器件软件 Verilog 语言编程安全子集,标准准则分为强制准则和建议准则,强制准则在Verilog编程中应该遵循,建议准则在Verilog编程中可参考执行。本次分享 触发器、锁存器 的国军标verilog语言标准准则。
二、基本编程规范之触发器
强制准则1---禁止在同一个 always 语句中混合使用有复位和无复位的触发器。
违背示例:
bash
module top( clk_40m, rst_n, in1 ,in2, out1,out2)
input clk_40m;
input rst_n;
input in1 ;
input in2 ;
output reg out1 ;
output reg out2 ;
reg temp1;
always@(posedge clk_40m or negedge rst_n) begin
if( !rst_n)
out1 <= 1'b0 ;
else begin
out1 <= in1;
out2 <= in2; //违背
end
end
temp1 <= in1 ;
。。。
endmodule
遵循示例:
bash
module top( clk_40m, rst_n, in1 ,in2, out1,out2)
input clk_40m;
input rst_n;
input in1 ;
input in2 ;
output reg out1 ;
output reg out2 ;
reg temp1;
always@(posedge clk_40m or negedge rst_n) begin
if( !rst_n) begin
out1 <= 1'b0 ; //遵循
out2 <= 1'b0 ;
end
else begin
out1 <= in1;
out2 <= in2;
end
end
temp1 <= in1 ;
。。。
endmodule
遵循示例:
强制准则2---在复位或者初始化时,必须对触发器赋初值
注:如不能连接到数据端口或者复位端口等。
违背示例:
bash
module top( clk_40m, out1 )
input clk_40m;
output out2 ;
reg[3:0] counter;
always@(posedge clk_40m)
counter <=counter +1'b1 ; //违背
...
endmodule
遵循示例:
bash
module top( clk_40m, rst_n, x)
input clk_40m;
input rst_n ;
output[3:0] out2 ;
reg[3:0] counter;
always@(posedge clk_40m)
begin
if( !rst_n)
counter <= 4'b0;
else
counter <=counter +1'b1 ; //违背
end
assign out2 =counter ;
...
endmodule
强制准则3----复位信号的触发条件与进入条件必须一致
违背示例:
bash
always@(posedge clk_40m or negedge rst_n)
begin
if( rst_n) //违背
qout <= 1'b0;
else
qout <=data;
end
遵循示例:
bash
always@(posedge clk_40m or negedge rst_n)
begin
if( !rst_n) //违背
qout <= 1'b0;
else
qout <=data;
end
三、基本编程规范之锁存器
强制准则1----禁止出现含有锁存器的组合逻辑环路
违背示例:
bash
module top(in1,in2,en,ou1);
input in1;
input in2;
input en;
output reg out1 ;
wire temp ;
assign temp = !(in1 & in2 & out1);
always @(en or temp) //违背
if(en)
out1 = temp ;
else
out1 = out1 ;
endmodule
强制准则2----禁止使用基本逻辑门来描述锁存器
注:基本逻辑门包括与门、非门和或门等
建议准则3----建议将锁存器与其他组合逻辑电路分开描述
违背示例:
bash
module top(data,start, en,dout1, dout2);
input data;
input start;
input en;
output reg dout1;
output reg dout2;
always@(data,start, en ) begin
if( en )
dout1 = data ;
else
dout1 = dout1 ;
dout2 = data| start ; //违背
end
endmodule
遵循示例:
bash
module top(data,start, en,dout1, dout2);
input data;
input start;
input en;
output reg dout1;
output reg dout2;
always@(data, en ) begin
if( en )
dout1 = data ;
else
dout1 = dout1 ;
end
always@(data, start ) begin //遵循
dout2 = data| start ;
end
endmodule
四、总结
文章详细介绍了军用FPGA软件编程中使用Verilog语言时应遵守的一系列编码规范,特别是针对触发器和锁存器的设计准则。文章中提出的强制准则包括:
触发器准则
强制准则1:禁止在同一个always语句中混合使用有复位和无复位的触发器。
强制准则2:在复位或初始化时,必须对触发器赋初值。
强制准则3:复位信号的触发条件与进入条件必须一致。
锁存器准则
强制准则1:禁止出现含有锁存器的组合逻辑环路。
强制准则2:禁止使用基本逻辑门来描述锁存器。
文章通过具体的代码示例展示了遵循和违反这些准则的不同情况,强调了遵守这些规范对于确保军用FPGA软件的稳定性和可靠性至关重要。