分类
verilog 数电

数电综合练习题——verilog篇

update:6.19 根据公布解答进行修改

语法类题目

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
T00-q'T0TT-e

概念类题目

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
Wave - DefaUt
74hc161芯片实现
不同模制方法1·反馈置数法

将置数D装载为计数首值4’b0001(1),当计数值达到末位4’b1011(11)时,预置信号有效为低电平,下次时钟脉冲到达时,将预置D输入

image-182.png, CR 
CET 
CEP 
CP QO 
74LVC161 
QI (22 
TC 
PE 
(03  
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
不同模制方法2·反馈清零法

当计数值为4’b1011(11),异步清零

但由于此题从1开始计数,故不满足要求,舍去

image-182.png, CR 
CET 
CEP 
CP QO 
74LVC161 
QI (22 
TC 
PE 
(03  
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
墨迹绘图
仅实现11进制计数,不满足题目要求从1计数至11

仔细阅读如下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

发表评论

电子邮件地址不会被公开。 必填项已用*标注