變數名 = 延遲 運算式;
ex wire [2:0] a,b;
wire [2:0] sum;
wire c;
{c,sum}= a+b;
使用"="號指定方式為阻斷式(blocking)
always@(posedge clk or negedge rst)//錯誤的寫法藍色圖形
if(rst_) begin
Q0 = 0;
Q1 = 0;
Q2 = 0;
end
else begin ///阻斷式 當 Q0 = Din;執行時,會等其執行完才會執行下個Q1 = Q0;
Q0 = Din;
Q1 = Q0;
Q2 = Q1;
end
非阻斷式指定(non-blocking assignment)用於彼此之間有關係
變數名 <= 延遲 運算式;
ex: always@(posedge clk or negedge rst_)//正確的寫法黑色的圖
if(rst_) begin
Q0 <= 0;
Q1 <= 0;
Q2 <= 0;
end
else begin ///非阻斷式當Q0 <= Din;還沒執行完即會執行 Q1 <= Q0;
Q0 <= Din;
Q1 <= Q0;
Q2 <= Q1;
end
使用非阻斷式指定可以將彼此有相關之變數指定寫在區塊內
也可以用下列方式結果相同
always@(posedge clk or negedge rst)
if(~rst_) Q0=0;
else Q0=Din;
always@(posedge clk or negedge rst)
if(~rst_) Q1=0;
else Q1=Q0;
always@(posedge clk or negedge rst)
if(~rst_) Q2=0;
else Q2=Q1;
課本p.6-10
1. if 敘述
if(判斷式) begin
運算式1;
.
.
運算式2;
end
2. if(判斷式) begin
運算式1; ............... 運算式n;
end
else begin 運算式1; ............... 運算式n; end
3. if(判斷式1) begin
運算式1; ............... 運算式n;
end
else if (判斷式2) begin
運算式1; ............... 運算式n;
end
.
.
else begin
運算式1; ............... 運算式n;
end
閂鎖 latch
always@(load)
if(load) s=Din;
四位元比較器p.6-22module comp4(a,b,eq,gt,lt);
input [3:0] a,b;
output eq,gt,lt;
always@(a or b)
if(a==b) begin
eq=1;gt=0;lt=0;
end
else if(a>b) begin
eq=0;gt=1;lt=0;
end
else begin eq=0;gt=0;lt=1; end
always@(a or b)
begin
eq=0;gt=0;lt=0;
if(a==b) eq=1;
else if(a>b) gt=1;
else lt=1;
end
4對1多工器
modulle mux4_1(I[3:0],sel[1:0],y);
input [3:0] I;
input [1:0] sel;
output y;
reg y;
always@(I or sel)
if(sel==0) y=I[0];
else if(sel==1) y=I[1];
else if(sel==2) y=I[2];
else y=I[3];
endmodule
1對4解多工(demultiplexer)
module 1_4demux(I,sel,y0,y1,y2,y3);
input [3:0] I;
input [1:0] sel;
output [3:0] y0,y1,y2,y3;
reg [3:0] y0,y1,y2,y3;
always@(I or sel)
if(sel==0) begin
y0=I;y1=0;y2=0;y3=0;
end
else if(sel==1) begin
y0=0;y1=I;y2=0;y3=0;
end
else if(sel==2) begin
y0=0;y1=0;y2=I;y3=0;
end
else begin
y0=0;y1=0;y2=0;y3=I;
end
endmodule
**case無優先順序
if 有優先順序
case(變數)
數值1; begin
運算式1;...;運算式n;
end
數值2; begin
運算式1;...;運算式n;
end
.
.
.
default: begin
運算式1;...;運算式n;
end
endcase
if、case須寫在always內?
4對1多工器
module (I[3:0],sel,y);
input [3:0]I;
input [1:0]sel;
output y;
reg y;
always@(I or sel)
case(sel)
2'd0: y=I[0];
2'd1: y=I[1];
2'd2: y=I[2];
2'd3: y=I[3];
endcase
endmodule
g f e d c b a
p.6-35
module seg7encoder(val[3:0],seg7[6:0]);
input [3:0] val;
output [6:0] seg7;
reg [6:0] seg7;
always@(val)
case(val)
4'h0:seg7=7'h40;
4'h1:seg7=7'h79;
4'h2:seg7=7'h24;
4'h3:seg7=7'h30;
4'h4:seg7=7'h19;
4'h5:seg7=7'h12;
4'h6:seg7=7'h02;
4'h7:seg7=7'h78;
4'h8:seg7=7'h0;
4'h9:seg7=7'h10;
4'ha:seg7=7'h08;
4'hb:seg7=7'h03;
4'hc:seg7=7'h46;
4'hd:seg7=7'h21;
4'he:seg7=7'h06;
4'hf:seg7=7'h0e;
default:seg7=7'h7f;
endcase
endmodule
`timescale 1ns/100ps
`include "test.v"
module test;
reg [3:0] val;
wire [6:0] seg7;
seg7encoder U1 (val[3:0],seg7[6:0]);
integer i;
initial
begin
for(i=0;i<=15;i=i+1)
begin
val=i;
#20;
end
end
initial
begin
$dumpfile("test.vcd");
$dumpvars;
end
endmodule
沒有留言:
張貼留言
文章有誤或有問題麻煩您留言告知! 謝謝您~~