概述
HDLbits基础知识点与部分题目解析(2)
小知识点
-
if语句中常用添加begin-end来减少书写上的歧义,以避免if-else配对歧义
-
case 语句中的 x 或 z 的比较逻辑是不可综合的,所以一般不建议在 case 语句中使用 x 或 z 作为比较值
-
casex、casez 一般是不可综合的,多用于仿真
-
模块例化时,一般input 端口不能删除,否则编译报错,output 端口可以删除、悬空。
-
RHS(right hand side)LHS(left hand side)
-
非阻塞赋值只能应用在寄存器型变量之中,也只能出现在块程序内
一些疑难杂题
Dualedge
module top_module (
input clk,
input reg d,
output reg q
);
reg q1,q2;
always@(posedge clk)
q1<=d;
always@(negedge clk)
q2<=d;
assign q=clk?q1:q2;
//对于双沿检测,一定不能使用always@(posedge clk or negedge clk)
//这种方式是不可综合的!
//虽然这道题是正确的,但是在modelsim和vivado中仿真会产生毛刺,不建议使用!
endmodule
//****************完美写法*******************
module top_module (
input clk,
input d,
output q
);
reg q_d1;
reg q_d2;
always@(posedge clk)begin
q_d1 <= d ^ q_d2;
end
always@(negedge clk)begin
q_d2 <= d ^ q_d1;
end
assign q = q_d1 ^ q_d2;
//可通过化简理解这部分代码
//posedge时q = d ^ qd_2 ^ qd_2 = d;
//negedge时q = q_d1 ^ d ^ q_d2 = d;
//《巧妙》
endmodule
一个双边沿检测电路
Edgecapture
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg[31:0] in0,out0;
always@(posedge clk)
in0<=in;
always@(posedge clk)
if(reset)
out <= 0;
else
out <= (in0&(~in))|out;
//锁存器
endmodule
边沿捕获电路,捕获到存储在寄存器中
Countbcd
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
reg ena0;
assign ena0=1'b1;
always@(*)
if(reset&&clk)//强行同步复位,不过这样写时序也很清晰
ena<=3'b000;
else begin
if(q[3:0]==4'b1001)ena[1]<=1'b1;
else ena[1]<=1'b0;
if(q[7:0]==8'b1001_1001)ena[2]<=1'b1;
else ena[2]<=1'b0;
if(q[11:0]==12'b1001_1001_1001)ena[3]<=1'b1;
else ena[3]<=1'b0;
end
decade dec0(ena0,clk,reset,q[3:0]);
decade dec1(ena[1],clk,reset,q[7:4]);
decade dec2(ena[2],clk,reset,q[11:8]);
decade dec3(ena[3],clk,reset,q[15:12]);
endmodule
module decade (
input ena,
input clk,
input reset, // Synchronous active-high reset
output [3:0] q);
always@(posedge clk)
if(reset)q<=0;
else if(ena==1'b1)
if(q<9)
q<=q+1;
else q<=0;
endmodule
Exams/ece241 2014 q7b
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
reg [3:0] q0,q1,q2;
always@(*)
if(reset)
c_enable <= 3'b000;
else begin
c_enable[0] <= 1'b1;
if(q0==9)c_enable[1]<=1'b1;
else c_enable[1]<=1'b0;
if((q1==9)&&(q0==9))c_enable[2]<=1'b1;
else c_enable[2]<=0;
end
assign OneHertz=(q0==9)&&(q1==9)&&(q2==9);
bcdcount counter0 (clk, reset, c_enable[0],q0);
bcdcount counter1 (clk, reset, c_enable[1],q1);
bcdcount counter2 (clk, reset, c_enable[2],q2);
endmodule
用这个方法做千分频太复杂了。。但谁让这是题目要求呢T.T
最后
以上就是标致西牛为你收集整理的HDLbits基础知识点与部分题目解析(2)HDLbits基础知识点与部分题目解析(2)的全部内容,希望文章能够帮你解决HDLbits基础知识点与部分题目解析(2)HDLbits基础知识点与部分题目解析(2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复