语法类题目
OA=4’b1101, B=3’b001, C=4’b1001,则
A^ B= 4’b1100
^{A,C}=^(8’b11011001)=1’b0
//filename:operator.v
`timescale 1ns/1ns
module operator;
parameter a=4'b1101,b=3'b001,c=4'b1001;
initial begin
$monitor("a=%b,b=%b\n",a,b);
#1
$monitor("(a^b)=%b\n",(a^b));
#1
$monitor("^(a^b)=%b\n",^(a^b));
#1
$monitor("{a,c}=%b\n",{a,c});
#1
$monitor("^{a,c}=%b\n",^{a,c});
end
endmodule

概念类题目
Verilog HDL语言可以进行开关级建模、行为级建模和数据流级建模
传统电路系统设计采用自下而上(bottom up)设计方法,现代EDA(Electronic Design Automation)设计采用自上而下(top down)设计方法。
程序
阅读如下Verilog HDL程序,画出rst=1时的状态图,并分析其功能
//filename:SM1.v
module SM1(clk,ina,rst,out);
input clk,ina,rst;
output out;
reg out;
parameter s0 = 3'b00,s1 =3'b01,s2 =3'b10,s3=3'b11;
reg[0:1]state;
always @ (posedge clk or negedge rst)begin
if (~rst) begin
state<=s0; out=0;
end
else
case(state)
s0:begin state<=(ina)?s1:s3;out=0; end
s1:begin state<=(ina)?s2:s0;out=0; end
s2:begin state<=(ina)?s3:s1;out=0; end
s3:begin state<=(ina)?s0:s2;out=1; end
endcase
end
endmodule
状态图

功能
模4可逆计数器
仿真验证
//filename:tb_SM1.v
`timescale 1ns/1ns
module tb_SM1;
reg clk,ina,rst;
wire out;
//实例化SM1
SM1 SM1_inst(clk,ina,rst,out);
//产生时钟脉冲
initial begin
clk=0;
rst=1;
end
always
#1 clk=~clk;
//测试
initial begin
#1
rst=0;ina=1;
#1
rst=1;ina=1;
#8
ina=0;
#8
ina=1;
#2
ina=0;
#2
ina=1;
#2
$stop;
end
endmodule

用Verilog. HDL语言实现-一个模为11的计数器(同步置数),计数顺序为1>2>3>…..>10>11>1…写出实现代码。如果用74161芯片实现该计数器,写出设计过程,并画出电路图
代码
//filename:counter11.v
module counter11(
input CP,EN,CR_n,
output reg[3:0]D,
output TC
);
/*电路功能*/
//11进制同步计数器,1,2...11,1
/*端口说明*/
//CP:时钟脉冲信号
//EN:使能端,当异步清零无效时,为有效高电平则计数
//CR_n:异步清零
//D:当前计数值
//TC:计数到最大值进位
assign TC=(D==4'hb);
always@(posedge CP,negedge CR_n)begin
if(~CR_n)
D<=4'h1;
else if(CP&&EN)begin
if(D==4'hb)
D<=4'h1;
else
D<=D+1;
end
end
endmodule
仿真测试
//filename:tb_counter11.v
`timescale 1ns/1ns
module tb_counter11;
reg CP,EN, CR_n;
wire [3:0]D;
wire TC;
//实例化11进制计数器
counter11 counter11_inst(
.CP(CP),
.CR_n(CR_n),
.EN(EN),
.D(D),
.TC(TC));
//产生时钟脉冲
initial
CP=1'b0;
always begin
#1 CP=~CP;
end
//测试
initial begin
CR_n=0;EN=1;
#4
CR_n=1;EN=1;
#26
CR_n=1;EN=0;
#10
CR_n=0;EN=0;
#4
$stop;
end
endmodule

74hc161芯片实现
不同模制方法1·反馈置数法
将置数D装载为计数首值4’b0001(1),当计数值达到末位4’b1011(11)时,预置信号有效为低电平,下次时钟脉冲到达时,将预置D输入

不同模制方法2·反馈清零法
当计数值为4’b1011(11),异步清零
但由于此题从1开始计数,故不满足要求,舍去

仔细阅读如下Verilog HDL程序,在//后面写出注释,并分析该module的功能
//filename:seq102.v
module seq102(CP,D,Z) ;
input CP;
input [3:0]D;
output Z;
wire CP,nCR,nLD; // 内部节点声明,wire类型变量
wire [3:0]Q;
Ctx U1(CP,nCR,nLD,D,Q); //实例化计数器Ctx
assign nCR = 1;
assign nLD = ~(Q[3]&&Q[2]) ; //当输出Q[3]Q[2]高电平时, nLD为低电平
assign Z = ^Q; //输出Z为Q缩位异或运算
endmodule
//filename:Ctx.v
module Ctx(CP,nCR,nLD,D,Q);
input CP , nCR, nLD;
input [3:0] D;
output [3:0]Q;
reg [3:0]Q; //输出变量Q为寄存器类型,可在过程语句中被赋值
initial
Q = 4'b0000;
always@(posedge CP) //对信号cp上升沿敏感
begin
if (nCR==0)
Q = 4'b0000; //当nCR低电平时,清零输出Q
else if (nLD==0)
Q=D; //nLD低电平时,将预置输入D送至输出Q
else
Q=Q+1;//Q计数加1
end
endmodule
功能
- 输出Z为Q缩位运算取或结果
- 当Q=4’b11xx时,将Q预置为输入D
仿真验证
直接使用原题程序,输出Z为高阻态,经检查发现Q未赋初值所致,故在Ctx增加语句,解决问题:
initial
Q = 4'b0000;
为方便观察,将Q也一同输出查看
//filename:tb_seq102.v
`timescale 1ns/1ns
module tb_seq102;
reg CP;
reg [3:0]D;
wire Z;
wire [3:0]Q;
//实例化seq102
seq102 seq102_inst(CP,D,Z,Q);
//产生时钟脉冲
initial
CP=0;
always
#1 CP=~CP;
//测试
initial begin
D=4'b0011;
#40
D=4'b1101;
#10
$stop;
end
endmodule
