军用FPGA软件 Verilog语言的编码准测之三态缓冲器和运算符

军用FPGA软件 Verilog语言的编码准测之三态缓冲器和运算符

语言 :Verilg HDL
EDA工具:ISE、Vivado、Quartus II

  • 关键词: 安全子集,Verilog HDL,编码准则 ,三态缓冲器 、运算符
一、引言

本文学习军用可编程逻辑器件软件 Verilog 语言编程安全子集,标准准则分为强制准则和建议准则,强制准则在Verilog编程中应该遵循,建议准则在Verilog编程中可参考执行。本次分享 三态缓冲器和运算符的国军标verilog语言标准准则。

二、基本编程规范之三态缓冲器
强制准则1—禁止组合逻辑电路的输出作为三态缓冲器的使能端

违背示例:

module top( en1,en2,din,dout)
input en1;
input en2;
input din; 
 
 
output reg dout; 
 

always@(en1,en2,din)  begin
    if( en1 & en2)       //违背
        dout<= din ; 
     else 
        out1 <= 1'bz;  
end
 
endmodule
强制准则2—禁止使用内部三态
强制准则3—避免将双向端口直接连接输入端口或输出端口

违背示例:

module top(  din,  dout,data )
input din;
inout data;
output dout; 
wire dout ; 
wire data

assign  data = din;   //违背
 
...
endmodule
三、基本编程规范之运算符
强制准则1----关系操作符左边与右边的数据位宽必须一致

违背示例:

 wire[7:0] w_slot_a;
 wire[5:0] w_slot_b;
 wire[7:0] w_slot_c;
 wire[7:0] w_or ;
assign w_or = (w_slot_a <= w_slot_b) ? w_slot_a : w_slot_c ; //违背

遵循示例:

 wire[7:0] w_slot_a;
 wire[7:0] w_slot_b;
 wire[7:0] w_slot_c;
 wire[7:0] w_or ;
assign w_or = (w_slot_a <= w_slot_b) ? w_slot_a : w_slot_c ; //遵循
强制准则2----位操作符左边与右边的数据位宽必须一致

违背示例:

 wire[7:0] w_slot_a;
 wire[5:0] w_slot_b;
 wire[7:0] w_or ;
assign w_or = w_slot_a | w_slot_b; //违背

遵循示例:

 wire[7:0] w_slot_a;
 wire[7:0] w_slot_b;
 wire[7:0] w_or ;
assign w_or = w_slot_a | w_slot_b; //遵循
强制准则3----禁止在算术表达式中同时出现无符号数和有符号数

违背示例:

module add(din1,din2, dout1);
input signed[1:0]  din1;
input[1:0] din2;
output[2:0] dout; 
 
 
 reg[2:0] dout; 
 

always@(din1 or din2  )   begin
	 
   dout  = {din1[1],din1} + {1'b0,din2}; //违背
end
 
endmodule

遵循示例:

module add(din1,din2, dout1);
input [1:0]  din1;
input[1:0] din2;
output[2:0] dout; 
 
 
 reg[2:0] dout; 
 

always@(din1 or din2  )   begin
	 
   dout  = {1'b0,din1} + {1'b0,din2}; //违背
end
 
endmodule
强制准则4----禁止在关系表达式中使用包含“x”或者“z”的值

违背示例:

if( temp > 2'bzz)
强制准则5—禁止在算术操作时使用包含 “x” 或者“z ”的值

违背示例:

reg[1:0] data1 ; 
reg[1:0] data2 ; 

always@( posedge clk_40m) 
if( !rst_n)
  data2 <= data1 + 1'bx ; //违背
else 
  data2 <= data1 ; 

强制准则6–在数值<位宽×进制×数字>表示中,数值位宽必须与数值的实际位宽一致

违背示例:

reg[3:0] temp; 
 

always@( posedge clk_40m) 
if( !rst_n)
  temp<= 2'd10 ; //违背
 

遵循示例:

reg[3:0] temp; 
 

always@( posedge clk_40m) 
if( !rst_n)
  temp<= 4'd10 ; //遵循
 
强制准则7–禁止算术运算结果出现位宽溢出

违背示例:

wire[7:0] temp; 
wire[7:0] temp1; 
wire[7:0] temp2; 
assign  temp = temp1 + temp2 ; //违背
 

遵循示例:

wire[8:0] temp; 
wire[7:0] temp1; 
wire[7:0] temp2; 
assign  temp = {1'b0,temp1}+ {1'b0,temp2}; 
 
建议准则8–避免在向量运算中使用逻辑运算符

违背示例:

reg[7:0] data1; 
reg[7:0] data2; 
wire[7:0] out_reg; 
assign  out_reg= data1 &&  data2; //违背
 
建议准则9–建议为parameter 数据和常数指定进制('d,'b,'h,'c) 和位宽

违背示例:

reg[7:0] in11; 
reg      out1; 
 
 always@( in1)
 if( in1 == 'b101)//违背
    out1 = 'b0;//违背
 else 
    out1 = 'b1 ; //违背

遵循示例:

reg[7:0] in11; 
reg      out1; 
 
 always@( in1)
 if( in1 == 3'b101)//遵循
    out1 = 1'b0;//遵循
 else 
    out1 = 1'b1 ; //遵循
四、总结

文章详细介绍了军用FPGA软件编程中使用Verilog语言时应遵守的一系列编码规范,特别是针对三态缓冲器和运算符的设计准则。文章中提出的强制准则包括:
基本编程规范之三态缓冲器
强制准则1—禁止组合逻辑电路的输出作为三态缓冲器的使能端
强制准则2—禁止使用内部三态
强制准则3—避免将双向端口直接连接输入端口或输出端口
基本编程规范之运算符
强制准则1----关系操作符左边与右边的数据位宽必须一致
强制准则2----位操作符左边与右边的数据位宽必须一致
强制准则3----禁止在算术表达式中同时出现无符号数和有符号数
强制准则4----禁止在关系表达式中使用包含“x”或者“z”的值
强制准则5—禁止在算术操作时使用包含 “x” 或者“z ”的值
强制准则6–在数值<位宽×进制×数字>表示中,数值位宽必须与数值的实际位宽一致
强制准则7–禁止算术运算结果出现位宽溢出
建议准则8–避免在向量运算中使用逻辑运算符
建议准则9–建议为parameter 数据和常数指定进制('d,'b,'h,'c) 和位宽

文章通过具体的代码示例展示了遵循和违反这些准则的不同情况,强调了遵守这些规范对于确保军用FPGA软件的稳定性和可靠性至关重要。

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来回答你的问题。 首先,FPGA是一种可编程逻辑器件,而Verilog是一种硬件描述语言,可以用于FPGA的设计和开发。在Verilog中,我们可以使用模块化的方式来设计三位二进制累加器。 以下是一个简单的Verilog代码示例,可以实现三位二进制累加器的功能: ``` module binary_adder(input wire a, input wire b, input wire cin, output wire sum, output wire cout); assign sum = (a ^ b) ^ cin; assign cout = (a & b) | ((a ^ b) & cin); endmodule module three_bit_binary_adder(input wire [2:0] a, input wire [2:0] b, output wire [2:0] sum); wire [2:0] c; binary_adder adder1(.a(a[0]), .b(b[0]), .cin(0), .sum(sum[0]), .cout(c[0])); binary_adder adder2(.a(a[1]), .b(b[1]), .cin(c[0]), .sum(sum[1]), .cout(c[1])); binary_adder adder3(.a(a[2]), .b(b[2]), .cin(c[1]), .sum(sum[2]), .cout(0)); endmodule ``` 在上面的代码中,我们定义了一个`binary_adder`模块来实现二进制加法,然后使用这个模块来实现一个`three_bit_binary_adder`模块,它可以将两个三位二进制数相加得到一个三位二进制数。 在`three_bit_binary_adder`模块中,我们首先定义了一个`wire`类型的变量`c`,用于存储进位。然后,我们使用三个`binary_adder`模块来实现三位二进制加法器。每个`binary_adder`模块都有一个进位输入和一个进位输出,第一个和第二个`binary_adder`模块的进位输入是前一个加法器的进位输出,而第三个加法器则没有进位输入,因为它是最高位。 最后,我们将三个加法器的输出连接到一个三位的`sum`输出端口上,这个端口将显示两个输入端口的和。 希望这个例子可以帮助你了解如何使用Verilog设计一个简单的三位二进制累加输出器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾引先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值