:[例]
例7.1
`timescale 10 ns/1 ns
module test ;
reg set ;
parameter p = 1.6 ;
initial
begin
$monitor ($time , , "set = " , set) ;
#p set = 0 ;
#p set = 1 ;
end
endmodule
输出结果:
0 set = x
2 set = 0
3 set = 1
用上述例子熟悉时间度量函数$time(整型)$realtime(实型)。
例7.3 初始化存储器
module test ;
reg [7:0] memory [7:0] ;
//8个8位的存储单元
integer i ;
initial
begin
$readmemb ("init.dat",memory) ;
//读取存储器init.dat到存储器给定地址
for (i = 0; i < 8; i = i + 1)
$display ("Memory [%d] = %b",i,memory[i]) ;
end
endmodule
init.dat文件内容:
@002
11111111 01010101
00000000 10101010
@006
1111zzzz 00001111
输出结果:
Memory [0] = xxxxxxxx
Memory [1] = xxxxxxxx
Memory [2] = 11111111
Memory [3] = 01010101
Memory [4] = 00000000
Memory [5] = 10101010
Memory [6] = 1111zzzz
Memory [7] = 00001111
通过上面的例子,熟悉任务$readmemb(二进制),$readmemh(十六进制)。
例7.4
`timescale 1 ns/1 ns
module random_pules(dout) ;
output [9:0] dout ;
reg [9:0] dout ;
integer delay1 , delay2 , k ;
initial
begin
#10 dout = 0 ;
for (k = 0; k < 100; k = k + 1)
begin
delay1 = 20 * ({$random} % 6) ;
delay2 = 20 * ({$random} % 3) ;
#delay1 dout = 1 << ({$random} % 10) ;
#delay2 dout = 0 ;
end
end
endmodule
用上述例子熟悉随机数任务{$random}((-b+1)到(b-1)中随机数),$random((b-1)到0中随机数)。
例7.9 预处理命令
//文件的包含预处理
(1)文件aaa.v
module aaa(a,b,out) ;
input a , b ;
output out ;
wire out ;
assign out = a ^ b ;
endmodule
(2)文件bbb.v
`include "aaa.v"
module bbb(c , d , e ,out) ;
input c , d , e ;
output out ;
wire out_a ;
wire out ;
aaa aaa(.a(c),.b(d),.out(out_a)) ;
assign out = e & out_a ;
endmodule
用上述例子熟悉预处理命令:`include , `define , `timescale , `ifdef , `else , `endif。
:总复习练习:
设计电路
module AOI (A,B,C,D,F) ;
input A,B,C,D ;
output F ;
assign F = ((A&b)&(C&D)) ;
endmodule
设连接线为W1,W2,W3,W4,W5,连入已知全加器模块FullAdder。
//已知:
module FullAdder (A,B,Cin,Sum,Cout) ;
input A,B,Cin ;
output Sum,Cout ;
endmodule
//接口电路:
module Top ;
FullAdderFA (.sum(W1),.Cout(W2),.Cin(W3),.A(W4),.B(W5)) ;
endmodule
某测试模块语句排序。
答案:
module TestFixture ;
reg A,B,SSEL ;
wire F ;
MUX2M(SEL,A,B,F) ;
initial
begin
SEL = 0 ;
A = 0 ;
B = 0 ;
#10 A = 1 ;
#10 SEL = 1 ;
#10 B = 1 ;
end
initial
$monitor (SEL,A,B,,F) ;//两个逗号中间空的,表示空格一个。
endmodule
指出下面信号的最高位和最低位。
reg [1:0] SEL ;
input [0:2] IP ;
wire [16:23] A ;
答案:
最高位:SEL[1] , IP[0] , A[16] ;
最低位:SEL[0] , IP[2] , A[23] ;
P,Q,R都是4bit的输入矢量,下面哪一种是正确的表达形式?
XXXXput P[3:0] , Q , R ;
XXXXput P , Q , R[3:0] ;
XXXXput P[3:0] , Q[3:0] , R[3:0] ;
XXXXput [3:0] P , [3:0] Q , [3:0] R ;
XXXXput [3:0] P,Q,R;
答案:5.
请将正确答案填入方括号。
1.(0:2)
2.(P:0)
3.(Op1:Op2)
4.(7:7)
5.(2:0)
6.(7:0)
reg [7:0] A ;
reg [2:0] Sum , Op1 , Op2 ;
reg P , OneBit ;
initial
begin
Sum = Op1 + Op2 ;
P = 1 ;
A[] = Sum ;
end
答案:5.
选择:
XXXXg [7:0] A ;
A = 1'hFF ;
A.8'b0000_0011
B.8'h03
C.8'b1111_1111
D.8'b11111111
答:A和B.
XXXXg [7:0] B ;
B = 8'bZ0 ;
A.8'0000_00Z0
B.8'bZZZZ_0000
C.8'b0000_ZZZ0
D.8'bZZZZ_ZZZ0
答:D.
指出变量类型:
XXXXsign A = B ;
XXXXways #1
Count = C + 1 ;
答案:A(wire) , B(wire/reg) , Count(reg) , C(wire/reg)
这第九题我特么的也不会。。。。。。
设ADDRESS为5’b0X000下列程序结束后A和B值为多少?
A = 0 ;
B = 0 ;
casex(ADDRESS)
5'b00???: A = 1 ;
5'b01???: B = 1 ;
5'b10?00,
5'b11?00: begin
A = 1 ;
B = 1 ;
end
endcase
答案:A = 1 , B = 0。
假设事件A分别在10,20,30发生。B一直是X。问50时,Count的值为多少?
reg [7:0] Count ;
initial
Count = 0 ;
always
begin
@(A) Count = Count + 1 ;
@(B) Count = Count + 1 ;
end
答案:Count = 1。是个顺序块,两条必须都执行完才always重复执行。因为B一直是X,所以执行到@(B) Count = Count + 1 ;就不往下进行了。
结束后I , J , A , B值为多少?
reg [2:0] A ;
reg [3:0] B ;
integer I , J ;
initial
begin
I = 0 ;
A = 0 ;
I = I - 1 ;
J = I ;
A = A - 1 ;
B = A ;
J = J + 1 ;
B = B + 1 ;
end
答案:
I = -1
J = 0
A = 7
B = 8
假设V的值变化成-1时,执行always块后,Count值为多少?
reg [7:0] V ;
reg [2:0] Count ;
always @(V)
begin
Count = 0 ;
while(~V[Count])
Count = Count + 1 ;
end
答案:Count = 0 ;8位数据-1就是1111_1111,按位取反就是0000_0000,结果while就没有执行。还是初始化时候的Count = 0。
V的值是多少?
reg [3:0] A ;
reg V , W ;
integer K ;
...
A = 4'b1010 ;
for(K = 2; K >= 0; K = K - 1)
begin
C = V ^ A[K] ;
W = A[K] ^ A[K + 1] ;
end
答案:第二位和第四位取反,别的不变。因为按位异或运算,与0不变,与1取反。A = 4'b1010。
给出片段代码,问它可能是什么电路的部分代码?
always @(posedge Clock)
if (A)
C = B ;
1.不能综合。
2.一个上升沿触发器和一个多路器。
3.一个输入时A,B,Clock的三输入与门。
4.一个透明锁存器。
5.一个带clock有使能引脚的上升沿触发器。
答案:2和5。
下列程序中,always状态将描述一个带异步Nreset和Nset输入端的上升沿触发器。括号内应填入什么?
always @()
if (! Nreset)
Q <= 0 ;
else if (! Nset)
Q <= 1 ;
else
Q <= D ;
XXXXgedge Nset or posedge Clock
2.posedge Clock
XXXXgedge Nreset or posedge Clock
XXXXgedge Nreset or negedge Nset or posedge Clock
XXXXgedge Nreset or negedge Nset
答案:4。上升沿触发器说的是时钟Clock。由代码知Nreset和Nset低电平有效。
综合后结果。
1.
always @(posedge Clock)
begin
A <= B ;
if (C)
A <= 1'b0 ;
end
答案:带同步复位端的触发器。
2.
always @(A or B)
case (A)
1'b0: F = B ;
1'b1: G = B ;
endcase
答案:不能综合或与预想不一致。
3.
always @(posedge A or posedge B)
if (A)
C <= 1'b0 ;
else
C <= D ;
答案:带异步复位端的触发器。
4.
always @(posedge Clk or negedge Rst)
if (Rst)
A <= 1'b0 ;
else
A <= B ;
答案:不能综合或与预想不一致。
会产生几个触发器?
always @(posedge Clk)
begin: Blk
reg B , C ;
C = B ;
D <= C ;
B = A ;
end
答案:两个寄存器,B和C。
程序语句排序。
reg FF1 , FF2 , FF3;
always @(posedge Clock)
begin
FF1 <= Input ;
FF2 <= FF1 ;
FF3 <= FF2 ;
Output <= FF3 ;
end
根据SEL与OP的关系,补全程序:
关系:
SEL:OP
000:1
001:3
010:1
011:3
100:0
101:3
110:0
111:3
答案:
casex(SEL)
3'bXX1: OP = 3 ;
3'b0X0: OP = 1 ;
3'b1X0: OP = 0 ;
endcase
选出正确的表达式:
3.! 4'b1011 || ! 4'b0000 = 1'b1
5.1'b0 || 1'b1 = 1b'1
9.4'b0001 || 4'b0000 = 1'b1
填入display的正确值。
integer I ;
reg [3:0] A ;
reg [7:0] B ;
initial
begin
I = -1 ;
A = I ;
B = A ;
$display ("%b",B) ; //(00001111)
A = A / 2 ;
$display ("%b",A) ; //(0111)
B = A + 14 ;
$display ("%d",B) ; //(21)
A = A + 14 ;
$display ("%d",A) ; //(5)
A = -2 ;
I = A / 2 ;
$display ("%d",I) ; //(7)
end
{1,0}和下面那个值相等?
答案:5. 64’H0000_0001_0000_0000
不写位宽默认为32位位宽。
补全代码:
//file defs.v
module defs ;
parameter Reset = 8'b10100101 ;
endmodule
//file M.v
module M;
`include "defs.v"
if (OP == <XXXXXXXset>)
Bus = 0 ;
endmodule
调用Pipe模块时,想把Depth的值更改为8,怎么做。
module Pipe(IP , OP)
parameter Option = 1 ;
parameter Depth = 1 ;
...
endmodule
Pipe #(1,8) P1(IP1 , OP1) ;
解答:#(1,8)中1对应参数Option,8对应参数Depth。
若想将P1中Depth值变为16,怎么做?
module Pipe (IP , OP) ;
parameter Option = 1 ;
parameter Depth = 1 ;
...
endmodule
module
Pipe P1(IP1 , OP1) ;
defparam XXXXXpth = 16 ;
endmodule
我特么的又不会了。。。。。。
下面代码,每次赋值都赋的什么值。
reg [7:0] V
initial
begin
V = 8'b0 ; //8'b0000_0000
V = 8'b1 ; //8'b0000_0001
V = 8'bX ; //8'bXXXX_XXXX
V = 8'BZX ; //8'bZZZZ_ZZZX
V = 8'BXXZZ ; //8'bXXXX_XXZZ
V = 8'b1x ; //8'b0000_001X
end