CUMT学习日记——Verilog课程学习全记录
系列第十篇 Verilog复习
文章目录
一、Verilog复习回忆
Verilog复习得很早,因为疫情,考试前一个月就复习完了,等真正考试要复习的时候相当于又重新学了一遍,在有VHDL的基础后学得很快,而且课程内容不多,只有20个课时,主要还是领着大家入门而已。刚考完试,但考题没有什么参考意义,因为做了比较全面的复习,考试的内容或多或少复习过,虽然也有一些遗憾,有些知识点不是很深刻,不过已经考完就不重要了。
考前复习编程题的时候是直接在QuartusII上编程的,这样复习很有效。
二、笔记
练习代码
八位二进制加法器
module kaoshi (input[7:0] a,input [7:0] b,input cin,output[7:0] dout,output cout);
wire[8:0]data;
assign data=a+b+cin;
assign dout=data[7:0];
assign cout=data[8];
endmodule
两位BCD码加法器
module kaoshi (input[7:0]a,input[7:0]b,output reg[8:0]d);
wire[4:0]DT0,DT1;
reg s;
assign DT0=a[3:0]+b[3:0];
always@(DT0)begin
if(DT0>=5'b01010) begin d[3:0]=DT0+'b0110;s=1'b1;end
else begin d[3:0]=DT0; s=1'b0;end
end
assign DT1=a[7:4]+b[7:4]+s;
always@(DT1)begin
if(DT1>=5'b01010) begin d[8:4]=DT1+'b0110;end
else begin d[8:4]=DT1; end
end
endmodule
parameter传参乘法器
module MUL #(parameter s)(output reg[2*s:1]R,input[s:1]A,input[s:1]B);
reg [2*s:1]AT;
reg [s:1]BT,CT;
always@(A,B)begin
R=0;
AT={{s{1'b0}},A};
BT=B;
CT=s;
for(CT=s;CT>0;CT=CT-1)begin
if(BT[1]) R=R+AT;
AT=AT<<1;
BT=BT>>1;
end
end
endmodule
module kaoshi(output[15:0]dout,input[7:0]in1,input[7:0]in2);
MUL #(.s(8)) U1(.R(dout),.A(in1),.B(in2));
endmodule
异步清零同步使能、置数带进位位十进制计数器
module kaoshi(input clk,input rst,input en,input load,output reg cout,output[3:0]dout,input[3:0]data);
reg[3:0]Q1;
always@(posedge clk,negedge rst)begin
if(!rst)Q1<=0;
else if(en)begin
if(load)Q1<=data;
else if(Q1<9) Q1<=Q1+1;
else Q1<=4'b0000;
end
end
assign dout=Q1;
always@(Q1)begin
if(Q1==4'b1001)cout=1'b1;
else cout=1'b0;
end
endmodule
十分频器
module kaoshi(input clk,output reg div);
reg[3:0]cnt;
always@(posedge clk)begin
if(cnt==4)begin div<=~div;cnt<=1'b0;end
else cnt<=cnt+1;
end
endmodule
五分频50%占空比
module kaoshi(input clk,output div);
reg[3:0]cnt1,cnt2;
reg div1,div2;
always@(posedge clk)begin
if(cnt1==1)begin div1<=1'b1;cnt1<=cnt1+1'b1;end
else if(cnt1==4)begin div1<=1'b0;cnt1<='b0;end
else cnt1<=cnt1+1'b1;
end
always@(negedge clk)begin
if(cnt2==1)begin div2<=1'b1;cnt2<=cnt2+1'b1;end
else if(cnt2==4)begin div2<=1'b0;cnt2<='b0;end
else cnt2<=cnt2+1'b1;
end
assign div=div1&div2;
endmodule
异步置数异步清零右移移位寄存器
module kaoshi (input clk,input load,input rst,input [7:0]data,output cout,output [7:0]dout);
reg [7:0]Q;
always@(posedge clk,negedge load,posedge rst)begin
if(!load) Q<=data;
else if(rst) Q<='b0;
else begin Q<=(Q>>1);end
end
assign cout=Q[0];
assign dout=Q;
endmodule
写在最后
感觉fpga这条路很复杂啊,就现在这点东西实际上门都没入,不知道未来会干什么。