我是靠谱客的博主 标致西牛,最近开发中收集的这篇文章主要介绍HDLbits基础知识点与部分题目解析(2)HDLbits基础知识点与部分题目解析(2),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部