使用verilog hdl實現具有同步RESET和SET的觸發器,具有異步RESET和SET的觸發器。
異步reset和setalways@(posedge clk or negedge reset or posedge set)
begin
if(set)
Q<=1;
else if(!reset)
Q<=0;
else
Q<=D;
end
always@(posedge clk)
begin
if(set)
Q<=1;
else if(!reset)
Q<=0;
else
Q<=D;
end
使用verilog hdl通過異步RESET和SET實現鎖存器。
always @(clk or reset or set)
begin
if(set)
Q=1;
else if(!reset)
Q=0;
else
Q=D;
end
使用Verilog hdl實現2對1多路復用器。
assign Y=(SEL==1'b0)?A:B;
使用AND門,OR門和反相器實現2對1多路復用器。
module MUX21(A, B, SEL, Y);
input A,B,SEL;
output Y;
net SEL_NOT, A_AND, B_AND;
not u0(SEL_NOT, SEL);
and u1(A_AND, SEL_NOT, A);
and u2(B_AND, SEL, B);
or u3(Y, A_AND, B_AND);
endmodule
使用2對1多路復用器實現兩個輸入「或」門。
module or2(A, B, Y);
input A, B;
output Y;
MUX21 u0(Y, A, B, B );
endmodule
module MUX21(Y, A ,B, SEL)
input A,B,SEL;
output Y;
assign Y=(SEL==1』b0):A:B;
endmodule
assign Y=A?A:B;
使用三態緩衝器來實現漏極開路緩衝器。
assign Y=EN?DataIn:1'bz;
將一個輸入時鐘除以3,由verilog hdl編寫。
module clk_div_3(clk, reset, clk_out);
input reset,clk;
output clk_out;
reg clk_out;
reg [1:0] cnt;
always@(posedge clk or negedge reset)
begin
if(!reset)
begin cnt<=2'b00;
clk_out<=0;
end
else if(cnt==2'b01) begin clk_out<=~clk_out;
cnt<=cnt+1'b1; end
else if(cnt==2'b10) begin clk_out<=~clk_out;
cnt<=2'b00;end
else cnt<=cnt+1'b1;
end
endmodule
佔空比1/3
要將一個輸入時鐘除以3,需要50%的佔空比,由verilog hdl編寫。
module clk_div_3(clk, reset, clk_out);
input reset,clk;
output clk_out;
reg clk_out1, clk_out2;
reg [1:0] cnt1,cnt2;
assign clk_out = clk_out1 | clk_out2;
always@(posedge clk or negedge reset)
begin
if(!reset)
begin cnt1<=2'b00;
clk_out1<=0;end
else if(cnt1==2'b01) begin clk_out1<=~clk_out1;
cnt1<=cnt1+1'b1; end
else if(cnt1==2'b10) begin clk_out1<=~clk_out1;
cnt1<=2'b00;end
else cnt1<=cnt1+1'b1;
end
always@(negedge clk or negedge reset)
begin
if(!reset)
begin cnt2<=2'b00;
clk_out2<=0;
end
else if(cnt2==2'b01) begin clk_out2<=~clk_out2;
cnt2<=cnt2+1'b1; end
else if(cnt2==2'b10) begin clk_out2<=~clk_out2;
cnt2<=2'b00;end
else cnt2<=cnt2+1'b1;
end
endmodule
module clk_div_3(clk, reset, clk_out);
input reset,clk;
output clk_out;
reg [1:0] cnt;
reg clk_out1, clk_out2;
always@(posedge clk)
begin
if(!reset)
cnt<='d0;
else if(cnt=='d2)
cnt<='d0;
else
cnt<=cnt+1;
end
always @(posedge clk or negedge reset)
begin
if(!reset)
clk_out1<='d0;
else if(cnt=='d2)
clk_out1<=~clk_out1;
else if(cnt == 'd1)
clk_out1<=~clk_out1;
end
always @(negedge clk or negedge reset)
begin
if(!reset)
clk_out2<='d0;
else if(cnt=='d2)
clk_out2<=~clk_out2;
else if(cnt == 'd1)
clk_out2<=~clk_out2;
end
assign clk_out = clk_out1 | clk_out2;
endmodule