当前位置: 首页 > news >正文

北京网站建设方案书sem是什么显微镜

北京网站建设方案书,sem是什么显微镜,嵌入式软件开发和c++软件开发,施工合同暑期实习准备——手撕代码牛客刷题笔记Verilog快速入门VL4 移位运算与乘法VL5 位拆分与运算VL6 多功能数据处理器VL8 使用generate…for语句简化代码VL9 使用子模块实现三输入数的大小比较VL11 4位数值比较器电路VL12 4bit超前进位加法器电路VL13 优先编码器电路①VL14 用优先编…

暑期实习准备——手撕代码

  • 牛客刷题笔记
    • Verilog快速入门
      • VL4 移位运算与乘法
      • VL5 位拆分与运算
      • VL6 多功能数据处理器
      • VL8 使用generate…for语句简化代码
      • VL9 使用子模块实现三输入数的大小比较
      • VL11 4位数值比较器电路
      • VL12 4bit超前进位加法器电路
      • VL13 优先编码器电路①
      • VL14 用优先编码器①实现键盘编码电路
      • VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器
    • Verilog进阶挑战
    • Verilog企业真题
  • 常见数字IC手撕代码

牛客刷题笔记

牛客Verilog题库

Verilog快速入门

VL4 移位运算与乘法

在这里插入图片描述

  • 要点1:题目用状态机实现,经典的两段式模板。
  • 要点2:需要一个d_reg信号临时记录当前要加倍的d信号,这样才能保证d信号变化时,加倍的仍然是原本的d信号,注意d_reg<=d;赋值语句应该在11状态,即每一轮状态转换结束后,开启新一轮状态前。
  • 要点3:always @ (posedge clk or negedge rst or current_state) 第二段的敏感事件表套模板的时候误删了current_state信号,导致所有的状态机状态转换被延长了一拍,因此这里的敏感时间表一定要将记住写current_state。
  • 要点4:注意为状态机以及其他输出信号赋初始值。
  • 要点5:1、3、7、8倍数通过移位运算和加运算实现,不需要乘法运算。
`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
reg [1:0] current_state,next_state;
reg[7:0] d_reg;
//*************code***********//always @ (posedge clk or negedge rst) beginif(!rst) current_state<=2'b00;else current_state<=next_state;//非阻塞赋值
endalways @ (posedge clk or negedge rst or current_state) beginnext_state<=2'b00;if(!rst) begininput_grant<=1'b0;out<=11'b0;d_reg<=d;endelse begincase(current_state)2'b00:begininput_grant<=1'b1;out<=d_reg;next_state<=2'b01;end2'b01:begininput_grant<=1'b0;out<= d_reg + {2'b0, d_reg, 1'b0};next_state<=2'b10;end2'b10:begininput_grant<=1'b0;out<=d_reg + {2'b0, d_reg, 1'b0} + {1'b0 ,d_reg, 2'b00};next_state<=2'b11;end2'b11:begininput_grant<=1'b0;out<={d_reg, 3'b000};next_state<=2'b00;d_reg<=d;endendcaseend
end
//*************code***********//
endmodule

VL5 位拆分与运算

在这里插入图片描述

  • 要点1:仔细读题,注意题目中提到的只有在sel=0时输入才有效,因此需要reg_d把输入d锁存。
  • 要点2:仔细读题,还是要理解题目的意思。
`timescale 1ns/1nsmodule data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,output reg [4:0]out,
output reg validout
);
//*************code***********//
reg [15:0] reg_d;always @ (posedge clk or rst or d) beginif(!rst) beginout<=5'b0;validout<=0;endelse begincase(sel)2'b00:begin out<=5'b0; validout<=0; reg_d<=d ;end2'b01:begin out<=reg_d[3:0]+reg_d[7:4]; validout<=1; end2'b10:begin out<=reg_d[3:0]+reg_d[11:8]; validout<=1; end2'b11:begin out<=reg_d[3:0]+reg_d[15:12]; validout<=1; endendcaseend
end
//*************code***********//
endmodule

VL6 多功能数据处理器

在这里插入图片描述

  • 要点1:有符号数以补码形式存储,可以直接进行加减运算。
  • 要点2:always @ (posedge clk or negedge rst_n) 的写法是正确的,但有点疑惑是初始状态下就是低电平会不会触发,本题既然是正确的就说明初始低电平会触发。
    always @ (posedge clk or rst_n) 的写法是错误的,会在rst_n由0变为1时触发,但此时可能并非时钟上升沿,造成异常输出。
    always @ (posedge clk)的写法会使得初始状态下输出信号处于无效状态,额外在always块前加上initial c<=9'b0;这样可以通过测试用例,但是initial语句不可综合,最好不要使用。
`timescale 1ns/1ns
module data_select(input clk,input rst_n,input signed[7:0]a,input signed[7:0]b,input [1:0]select,output reg signed [8:0]c
);always @ (posedge clk or negedge rst_n) beginif(!rst_n) beginc<=9'b0;endelse begincase(select)2'b00:begin c<=a; end2'b01:begin c<=b; end2'b10:begin c<=a+b; end2'b11:begin c<=a-b; endendcaseend
end
endmodule

VL8 使用generate…for语句简化代码

在这里插入图片描述

  • 要点1:必须使用genvar声明循环变量。
  • 要点2:begin-end之间插入赋值语句,begin后面必须声明循环实例的名称。
  • 要点3:generate-for常用来简化assign的赋值,assign data_out[i]=data_in[7-i];展开后的8条assign语句是并行赋值的。如,在6线-64线、8线-256线译码器中可以用来简化代码。
`timescale 1ns/1ns
module gen_for_module( input [7:0] data_in,output [7:0] data_out
);genvar i;generate for(i=0;i<=7;i=i+1)begin:labelassign data_out[i]=data_in[7-i];endendgenerate
endmodule

VL9 使用子模块实现三输入数的大小比较

在这里插入图片描述

  • 要点1:两个比较器会导致进入比较器的三个输入时间不同步,需要使用三个子模块才可以正确实现。
    在这里插入图片描述
    在第一个上升沿,ab进入第一个比较器,c进入第二个比较器。但是比较器输出是需要时间的,在第一个上升沿,c立刻进入第二个比较器,但ab比较器的输出会较晚的进入第二个比较器,这就造成了输入时间不同步,从而造成输出错误。
    使用三个比较器将c延迟一拍,就可以让输入子模块的时间都相等,从而不会出现进入时间不同导致的错误。
    在这里插入图片描述
    我们可以对波形进行分析来比较这两种写法的差别,testbench如下:
`timescale 1ns/1ns
module testbench();reg signed [7:0] a,b,c;reg clk,rst_n;wire [7:0]d;
main_mod dut(.clk(clk),.rst_n(rst_n),.a(a),.b(b),.c(c),.d(d)
);
always #5 clk = !clk;
initial beginclk=0;rst_n=0;#5 rst_n=1;#10 a=2;b=3;c=4;#10 a=4;b=2;c=1;#10 a=5;b=4;c=3;
end
endmodule

三个比较器的仿真波形如下。可以看到每一次比较的结果都在下一个时钟周期输出,分别为2,1,3。
在这里插入图片描述
二个比较器的仿真波形如下,此时比较结果为1,2,3,这是因为上一轮a,b的最小值实际上是与当前周期的c进行比较的,因此对于第一组输入,a和b的比较结果是2,2和下一组输入的c=1进行了比较,所以输出的最小值是1;同样第二组输出,a和b的比较结果是2,2和下一组输入的c=3进行了比较,所以输出为2;第二组输出,a和b的比较结果是4,4和下一组输入的c=3进行了比较,所以输出为3。
在这里插入图片描述

  • 要点2:子模块中c<=(a>b)?b:a;语句需要使用非阻塞赋值。
    不知道为什么非阻塞不会报错,阻塞会报错显示有用例不通过。使用vivado综合出来的电路这两个是一样的。待解决!!!
    在这里插入图片描述
    在这里插入图片描述
    但还是复习一下阻塞赋值和非阻塞赋值
    非阻塞赋值b <= a; :非阻塞赋值中赋值并不是马上执行的,也就是说"always"块内的下一条语句执行后,b并不等于a,而是保持原来的值。"always"块结束后,才进行赋值。
    阻塞赋值b=a;:方式是马上执行的。也就是说执行下一条语句时,b已等于a。
`timescale 1ns/1ns
module main_mod(input clk,input rst_n,input [7:0]a,input [7:0]b,input [7:0]c,output [7:0]d
);
wire [7:0] ab,ac;
sub_mod U1(.clk(clk),.rst_n(rst_n),.a(a),.b(b),.c(ab));
sub_mod U2(.clk(clk),.rst_n(rst_n),.a(a),.b(c),.c(ac));
sub_mod U3(.clk(clk),.rst_n(rst_n),.a(ab),.b(ac),.c(d));
endmodulemodule sub_mod(clk,rst_n,a,b,c);input clk,rst_n;input[7:0] a,b;output [7:0] c;reg[7:0]c;always@(posedge clk or negedge rst_n)beginif(~rst_n)c<=8'b0;else beginc<=(a>b)?b:a;endend
endmodule

VL11 4位数值比较器电路

要点1:题目中说要用门级描述完成,对于1bit数的比较对应的门运算如下,A>B对应~A&B,A<B对应A&~B,A=B对应~(A^B)。

`timescale 1ns/1nsmodule comparator_4(input		[3:0]       A   	,input	   [3:0]		B   	,output	 wire		Y2    , //A>Boutput   wire        Y1    , //A=Boutput   wire        Y0      //A<B
);assign Y2=(A[3]>B[3])|((A[3]==B[3])&(A[2]>B[2]))|((A[3]==B[3])&(A[2]==B[2])&(A[1]>B[1]))|((A[3]==B[3])&(A[2]==B[2])&(A[1]==B[1])&(A[0]>B[0]));
assign Y1=(A==B);
assign Y0=(A[3]<B[3])|((A[3]==B[3])&(A[2]<B[2]))|((A[3]==B[3])&(A[2]==B[2])&(A[1]<B[1]))|((A[3]==B[3])&(A[2]==B[2])&(A[1]==B[1])&(A[0]<B[0]));
endmodule

要点2:抽象描述可以写到直接比较A和B。

`timescale 1ns/1ns
module comparator_4(input		[3:0]       A   	,input	   [3:0]		B   	,output	 wire		Y2    , //A>Boutput   wire        Y1    , //A=Boutput   wire        Y0      //A<B
);
assign Y2=(A>B)?1:0;
assign Y1=(A==B)?1:0;
assign Y0=(A<B)?1:0;
endmodule

VL12 4bit超前进位加法器电路

在这里插入图片描述

加法器与半加器
超前进位加法器

1比特进位加法器的两种实现:

//实现1:逻辑代数
assign sum=a^b^cin;
assign cout=a&b|(cin&(a^b));或者assign cout=(a&b)|(a&cin)|(b&cin);
//实现2:抽象描述
assign {cout,sum}=a+b+cin;

assign cout=(a&b)|(a&cin)|(b&cin);很容易理解,即a,b,cin中任意两个或以上为1就进位。
assign cout=a&b|(cin&(a^b));可以理解为除了a,b为1的情况外,还有c为1同时 a和b中任意一个为1(a^b)。

多位数进位加法器
多位数进位加法器的实现有两种方式:串行进位加法器、超前进位加法器。
串行进位加法器就是将1比特加法器级联。
超前进位加法器是对串行全加器进行改良设计的并行加法器,以解决普通全加器串联互相进位产生的延迟。
一位全加器的进位的运算逻辑(前面的式子是(A^B)这里是(A|B),对结果没有影响,|包含了^):
在这里插入图片描述
其中,令进位函数Gi = AiBi, 令进位传送函数Pi = Ai + Bi
在这里插入图片描述
对于4比特超前进位加法器来说,进位输出如下:
在这里插入图片描述

Si=Ai^Bi^(CI)i,对应的(CI)i=(CO)i-1,即Si=Ai^Bi^(CO)i-1。通过前面的推导已经得出了,可得:
在这里插入图片描述

  • 要点1:需要明确4bit超前进位加法器的原理与推导过程,上一位运算的输出CO是下一位运算的输入CI,COi=(Ai&Bi)|(CIi&(Ai|Bi))。
  • 要点2:仿真自测时定义了一个8bit数num每个时钟周期累加1,将低4比特和高4比特赋值给A和B,需要注意的是给num赋初值!!!要不然仿真波形一片红!!!
`timescale 1ns/1nsmodule lca_4(input		[3:0]       A_in  ,input	    [3:0]		B_in  ,input                   C_1   ,output	 wire			CO    ,output   wire [3:0]	    S
);
wire[3:0] g,p,c;
assign p=A_in|B_in;
assign g=A_in&B_in;
assign c[0]=g[0]|(p[0]&C_1);
assign c[1]=g[1]|(p[1]&(g[0]|(p[0]&C_1)));
assign c[2]=g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&C_1)))));
assign c[3]=g[3]|(p[3]&(g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&C_1))))))); 
assign CO=c[3];assign S=A_in^B_in^{c[2:0],C_1};
endmodule

测试代码:

`timescale 1ns/1ns
module testbench();
reg[3:0] A_in,B_in;
reg C_1;
wire CO;
wire[3:0] S;
reg[7:0] num;lca_4 U1(.A_in(A_in),.B_in(B_in),.C_1(C_1),.CO(CO),.S(S));
initial beginC_1=0;num=0;
end
always #10 begin num=num+1;A_in<=num[3:0];B_in<=num[7:4];
end
endmodule

VL13 优先编码器电路①

在这里插入图片描述

要点1:题目给的是I1-I9,注意顺序。
要点2:casecasezcasex三者都是可以综合的。case进行全等匹配,casez忽略?z对应的位进行匹配,casex忽略x?z对应的位进行匹配。

`timescale 1ns/1ns
module encoder_0(input      [8:0]         I_n,output reg [3:0]         Y_n   
);
always@(I_n)begincasez(I_n)9'b111111111:Y_n<=4'b1111;9'b0????????:Y_n<=4'b0110;9'b10???????:Y_n<=4'b0111;9'b110??????:Y_n<=4'b1000;9'b1110?????:Y_n<=4'b1001;9'b11110????:Y_n<=4'b1010;9'b111110???:Y_n<=4'b1011;9'b1111110??:Y_n<=4'b1100;9'b11111110?:Y_n<=4'b1101;9'b111111110:Y_n<=4'b1110;endcase
end
endmodule

要点3:《CPU设计实战》这本书中提到在CPU设计中必须遵守的硬性规定是代码中禁止出现casezcasex,因此可以采用如下写法,看Y9~Y0中出现的第一个0的位置。

`timescale 1ns/1ns
module encoder_0(input      [8:0]         I_n,output     [3:0]         Y_n   
);
assign Y_n=(~I_n[8])?4'b0110:(~I_n[7])?4'b0111:(~I_n[6])?4'b1000:(~I_n[5])?4'b1001:(~I_n[4])?4'b1010:(~I_n[3])?4'b1011:(~I_n[2])?4'b1100:(~I_n[1])?4'b1101:(~I_n[0])?4'b1110:4'b1111;
endmodule

VL14 用优先编码器①实现键盘编码电路

在这里插入图片描述
题目描述的不是很清楚。
要点1:GS:按下为1,不按为0,需要注意的是最后assign GS=(S_n==10'b1111111111)?1'b0:1'b1;并不能只判断S_n[0]==1,因为其他按键(9~1)被按下时S_n[0]也为0
要点2:最终的输出需要对译码结果取反assign L=~Y_n;

`timescale 1ns/1nsmodule encoder_0(input      [8:0]         I_n   ,output     [3:0]         Y_n   
);
assign Y_n=(~I_n[8])?4'b0110:(~I_n[7])?4'b0111:(~I_n[6])?4'b1000:(~I_n[5])?4'b1001:(~I_n[4])?4'b1010:(~I_n[3])?4'b1011:(~I_n[2])?4'b1100:(~I_n[1])?4'b1101:(~I_n[0])?4'b1110:4'b1111;     
endmodulemodule key_encoder(input      [9:0]         S_n   ,         output wire[3:0]         L     ,output wire              GS
);wire[3:0] Y_n;encoder_0 U1(.I_n(S_n[9:1]),.Y_n(Y_n));//GS:按下为1,不按为0assign GS=(S_n==10'b1111111111)?1'b0:1'b1;assign L=~Y_n;
endmodule

VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

要点1:编码的结果为000时,可能有三种情况,(1)译码器没有使能,不工作,此时GS=0;EO=0;(2)译码器再工作,但无输入,GS=0;EO=1;;(3)译码器在工作,且有输入,输入为0000_0001,GS=1;EO=0;;
要点2:参考SNx4HC148 8-Line to 3-Line Priority Encoders理解如何使用两个8-3译码器得到一个16-4译码器。实际就是将两个8-3译码器的EO与EI连接,输出取或运算作为译码结果的低3位I[2:0],高位译码器的GS作为译码结果I[3](1表示高位译码器在译码15~8,0表示在译码0~7)。最终的GS为GS1|GS2

在这里插入图片描述
真值表如下:
在这里插入图片描述

`timescale 1ns/1ns
module encoder_83(input      [7:0]       I   ,input                  EI  ,output wire [2:0]      Y   ,output wire            GS  ,output wire            EO    
);
assign {Y,GS,EO}=(~EI)?5'b00000:I[7]?5'b11110:I[6]?5'b11010:I[5]?5'b10110:I[4]?5'b10010:I[3]?5'b01110:I[2]?5'b01010:I[1]?5'b00110:I[0]?5'b00010:5'b00001;
endmodulemodule encoder_164(input      [15:0]      A   ,input                  EI  ,output wire [3:0]      L   ,output wire            GS  ,output wire            EO    
);
wire GS1,GS2,EO1;
wire[2:0] L1,L2;
encoder_83 U1(.I(A[15:8]),.EI(EI),.Y(L1[2:0]),.GS(GS1),.EO(EO1));
encoder_83 U2(.I(A[7:0]),.EI(EO1),.Y(L2[2:0]),.GS(GS2),.EO(EO));
assign L={GS1,L1|L2};
assign GS=GS1|GS2;
endmodule

Verilog进阶挑战

Verilog企业真题

常见数字IC手撕代码

数字IC笔试面试题汇总

  1. 异步fifo。格雷码的镜像对称。格雷码和二进制的互相转换。
  2. 同步fifo。
  3. 除法器。
  4. Wallace乘法器。
  5. Booth乘法器。
  6. Booth+Wallace乘法器。
  7. 超前进位加法器。
  8. 边沿检测,输入消抖,毛刺消除。
  9. 异步复位同步释放。
  10. 三种计数器。二进制,移位,移位+反向。
  11. 无毛刺时钟切换。
  12. 串行-并行CRC。(ARM)。
  13. 线性反馈移位寄存器。
  14. 握手实现CDC。
  15. AXI-S接口,2T一次传输,1T一次传输,1T一次传输还要寄存器寄存。(Nvidia考题)Xilinx有例程。
  16. 其他简单功能的HDL实现以及状态转换图。(序列检测 ,回文序列检测(NVIDIA),奇、偶、半分频,小数分频,自动售货机)。

文章转载自:
http://astrocytoma.kjawz.cn
http://chanterelle.kjawz.cn
http://annunciator.kjawz.cn
http://backbreaker.kjawz.cn
http://aetna.kjawz.cn
http://bikeway.kjawz.cn
http://billhead.kjawz.cn
http://bafflement.kjawz.cn
http://bumpily.kjawz.cn
http://annuity.kjawz.cn
http://authentic.kjawz.cn
http://antennae.kjawz.cn
http://carob.kjawz.cn
http://carrefour.kjawz.cn
http://arbor.kjawz.cn
http://buckler.kjawz.cn
http://apophyllite.kjawz.cn
http://afterburner.kjawz.cn
http://acryl.kjawz.cn
http://cataphracted.kjawz.cn
http://assumption.kjawz.cn
http://aquatint.kjawz.cn
http://antilitter.kjawz.cn
http://astonishment.kjawz.cn
http://chokey.kjawz.cn
http://brickmaker.kjawz.cn
http://albarrello.kjawz.cn
http://canterbury.kjawz.cn
http://brugge.kjawz.cn
http://bicyclist.kjawz.cn
http://backwater.kjawz.cn
http://bigwig.kjawz.cn
http://bismuth.kjawz.cn
http://adpersonin.kjawz.cn
http://adenectomy.kjawz.cn
http://bead.kjawz.cn
http://borosilicate.kjawz.cn
http://basophilic.kjawz.cn
http://biostrome.kjawz.cn
http://appellee.kjawz.cn
http://bataan.kjawz.cn
http://azotise.kjawz.cn
http://chresard.kjawz.cn
http://anacoluthon.kjawz.cn
http://cachalot.kjawz.cn
http://ast.kjawz.cn
http://aspirer.kjawz.cn
http://abirritate.kjawz.cn
http://atlantic.kjawz.cn
http://bison.kjawz.cn
http://attractive.kjawz.cn
http://campanulate.kjawz.cn
http://benzaldehyde.kjawz.cn
http://ahorse.kjawz.cn
http://arrowhead.kjawz.cn
http://carnapper.kjawz.cn
http://achlorhydria.kjawz.cn
http://carbonado.kjawz.cn
http://betting.kjawz.cn
http://augmented.kjawz.cn
http://abscessed.kjawz.cn
http://android.kjawz.cn
http://chlorosis.kjawz.cn
http://auramine.kjawz.cn
http://bye.kjawz.cn
http://accolade.kjawz.cn
http://auberge.kjawz.cn
http://chequers.kjawz.cn
http://alphorn.kjawz.cn
http://bordure.kjawz.cn
http://calvous.kjawz.cn
http://adventurously.kjawz.cn
http://cambogia.kjawz.cn
http://bondwoman.kjawz.cn
http://bowhunt.kjawz.cn
http://caduceus.kjawz.cn
http://barney.kjawz.cn
http://academgorodok.kjawz.cn
http://algesimeter.kjawz.cn
http://blow.kjawz.cn
http://barycentre.kjawz.cn
http://biogeny.kjawz.cn
http://artificer.kjawz.cn
http://apennines.kjawz.cn
http://antichristianism.kjawz.cn
http://appertaining.kjawz.cn
http://bouzoukia.kjawz.cn
http://causerie.kjawz.cn
http://beluga.kjawz.cn
http://bise.kjawz.cn
http://algorism.kjawz.cn
http://bactericidal.kjawz.cn
http://assumedly.kjawz.cn
http://amethyst.kjawz.cn
http://anglomania.kjawz.cn
http://chiz.kjawz.cn
http://ambulance.kjawz.cn
http://benzedrine.kjawz.cn
http://anicut.kjawz.cn
http://academicism.kjawz.cn
http://www.tj-hxxt.cn/news/36902.html

相关文章:

  • 网站建设企业咨询市场营销策划书范文5篇精选
  • 怎么做网站banner网络优化报告
  • 电影网站建设之苹果cms桂平seo关键词优化
  • 15年做那个网站致富太原首页推广
  • 深圳网站设计与开发西安seo托管
  • 西安网站制作多少钱网络营销名词解释答案
  • wordpress相同的cmsseo课程总结怎么写
  • 去年做那个网站致富流量平台排名
  • 官方在家做兼职的网站百度商城官网
  • 什么是微网站seo资源网站排名
  • 自己可以做类似拓者的网站吗企业网络推广平台
  • 网站建设好后为什么要维护电商平台排名
  • 网站宽屏图片怎么做手机如何制作网页链接
  • wordpress foxpayseo的方式包括
  • 做商城网站如何寻找货源关键词seo公司真实推荐
  • 网站客服漂浮广告代码新闻小学生摘抄
  • 信得过的网站开发推广免费推广引流软件
  • 合肥在线官网我赢seo
  • 做一回最好的网站网站建站方式有哪些
  • 免费生成ppt的网站微信怎么推广找客源
  • 软件开发技术培训课程成都自然排名优化
  • 公司网站维护怎么做互联网营销软件
  • 响应式自助建站平台谷歌seo网站建设
  • 淄博做网站电话微信附近人推广引流
  • 建站源码下载徐州网页关键词优化
  • 程序员除了做软件是不是就做网站衡阳网站优化公司
  • wordpress主题转换seo职业技能培训班
  • 外贸网站建设szjijie下载百度app
  • 域名的申请流程seo优化排名
  • wifi办理一个月多少钱网站优化排名易下拉系统