Typical Circuit Verilog Description
👨🏻‍💻

Typical Circuit Verilog Description

标签&分类
Verilog
发表时间
Jun 18, 2022 10:30 AM
描述
常见组合逻辑和时序逻辑
属性
属性 1
属性 2
日期
Property

1.组合逻辑:全加器

module fulladd(
	input  wire a,
	input  wire b,
	input  wire c,

	output wire sum,
	output wire count 
);

	assign sum   = a ^ b ^ c;
	assign count = (a & b) | (b & c) | (a & c);

endmodule
 
  • assign 中赋值的变量类型必须为wire类型;
  • always中或者initial中赋值必须为reg类型;
 

2.组合逻辑:四选一选择器

modulde mux4_1(
		input   wire  c,
    input   wire  d,
		input   wire  e,
		input   wire  f,

		input   wire [1:0] s,
		output  reg        MUX_out,
);
 
		always@(c or d or e or f or s)
		begin 
			  case(s)
						2'b00 : MUX_out = c;
						2'b01 : MUX_out = d;
						2'b10 : MUX_out = e;
						2'b11 : MUX_out = f;
						default:MUX_out = f;	
				endcase
	  end
endmodule
 

3.组合逻辑:38译码器

always@(enable or a)
		begin
				if(!enable)
						yout = 8'b0;
				else
						case(a)
								3'b000 :yout = 8'b0000_0001;
								3'b001 :yout = 8'b0000_0010;
								3'b010 :yout = 8'b0000_0100;
								3'b011 :yout = 8'b0000_1000;
								3'b100 :yout = 8'b0001_0000;
								3'b101 :yout = 8'b0010_0000;
								3'b110 :yout = 8'b0100_0000;
								3'b111 :yout = 8'b1000_0000;
		end
 

4.组合逻辑:逻辑操作

always@(a or b)

		begin 
					q1 = a >  b;
					q2 = a <  b;
					q3 = a >= b; 
		end

		//q3 = a >= b  与下面代码等价
		
if(a >= b)
		q3 = 1;
else 
		q3 = 0;
 

5.组合逻辑:移位操作

module shift(
		input  wire [3:0] data,
		output reg  [3:0] q1,
		output reg  [3:0] q2,
);
	parameter a = 2;
	always@(data)
		begin
				q1 = data << a;//左移a位
				q2 = data >> a;//右移a位
		end


endmodule

6.时序逻辑:计数器

module count_en(
		input  wire  clk,
		input  wire  reset,
		input  wire  enable,

		output reg [WIDTH-1 : 0] out
);
		parameter WIDTH = 8;
		parameter U_DLY  = 1;
		
		always@(posedge clk or negedge clk )
		begin
				if(!reset)
						out <= 8'b0;
				else if(enable)
						out <= #U_DLY out + 1//模仿器件延迟,一般不提倡
		end

endmodule
时序逻辑赋值使用非阻塞赋值<=
 

7.时序逻辑:异步复位D触发器

module dff_async_pre(
		input  wire data,
		input  wire clk,
		input  wire preset,

		output reg  q,
);
		parameter U_DLY = 1;
		always@(posedge clk or negedge preset) //异步复位
		begin
				if(~preset)
						q <= #U_DLY 1'b1;
				else
						q <= #U_DLY data;
		end
endmodule
if/else存在优先级

8.时序逻辑:同步复位D触发器

module dff_sync_rst(
		input  wire data,
		input  wire clk,
		input  wire reset,

		output reg  q,
);

		parameter U_DLY = 1;

		always@(posedge clk )//同步复位
				begin
						if(!reset)
								q <= #U_DLY 1'b0;
						else
								q <= #U_DLY data;
				end
endmodule
 

9.时序逻辑电路:复杂D触发器

module dff_sync(
		input  wire data,
		input  wire clk,
		input  wire reset,
		input  wire preset,

		output reg  q, 
);

		parameter U_DLY = 1;

		always@(posedge clk or negedge reset or negedge preset)//同步复位+异步复位
		begin
				if(!reset)
						q <= 1'b0;
				else if(~preset)
						q <= 1'b1;
				else
						q <= #U_DLY data;
		end
endmodule