• HDL_BITS 学习(9)


    build a circuit from waveform(依靠波形图编写电路)

    Sim/circuit2

    比较简单,4输入,1输出。4个输入相同或者有两个输入相同的时候,输出为1.

    编了个4位输入寄存器sum存储输入。然后组合电路逻辑判断寄存器,最后输出。

    module top_module (
        input a,
        input b,
        input c,
        input d,
        output q );//

        reg [4:0]sum;
        
        
        always @(*) begin
            sum[0]=d;
            sum[1]=c;
            sum[2]=b;
            sum[3]=a;
        end
        always @(*) begin
            case (sum)
                0:q=1;
                3:q=1;
                5:q=1;
                6:q=1;
                9:q=1;
                10:q=1;
                12:q=1;
                15:q=1;
                default:q=0;
            endcase
        end
    endmodule

    编译通过。

    自己写的这个程序比较长,网上找到了一些比较短的答案。

    assign q = (a ^ b) ~^ (c ^ d);

     或者

    assign q=~(a^b^c^d);

    感觉要卡诺图化简,把当年的数电忘了

    Sim/circuit3

    比较简单,4个输入量,一个输出量。做卡诺图化简,可以得到q=bd+bc+ad+ac=b(c+d)+a(c+d)=(b+a)(c+d), assign q = (a || b) && (c || d);就搞定。

    Sim/circuit4

    和上一题类似,卡诺图化简即可。略过。

    Sim/circuit5

    组合逻辑,c为片选信号。很容易用组合逻辑写出。

    module top_module (
        input [3:0] a,
        input [3:0] b,
        input [3:0] c,
        input [3:0] d,
        input [3:0] e,
        output [3:0] q );

        always@(*)begin
            case (c)
                0:q=b;
                1:q=e;
                2:q=a;
                3:q=d;
                default:q=4'b1111;
            endcase
        end
    endmodule

    sim/circuit6

    输入是4位,输出是16位。看不懂输入输出的具体关系。俺也承认自己懒得找了。用case 直接编写吧

        always @ (*) begin
            case(a)
                0: q = 16'h1232;
                1: q = 16'haee0;
                2: q = 16'h27d4;
                3: q = 16'h5a0e;
                4: q = 16'h2066;
                5: q = 16'h64ce;
                6: q = 16'hc526;
                7: q = 16'h2f19;
            endcase
        end
       

    sim/circuit7

    时序电路。因为是单输入单输出,用阻塞赋值和非阻塞赋值都正确。

    always@(posedge clk)
            begin
                q=~a;
            end

    百度百科找了下阻塞赋值和非阻塞赋值的区别

    状态变量的赋值或开关变量的赋值中,已明确建议大家使用非阻塞赋值。这不但是因为综合工具要求这样做,最根本的原因是与非阻塞赋值语句语意对应的电路结构正是我们想要实现的。这两种赋值语句对应着两种不同的电路结构。阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系。而非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。

    阻塞和非阻塞赋值的区别在阻塞是顺序执行而非阻塞是并行执行。

    以下面的语句举例

    非阻塞赋值

    always@(posedge clk)

    begin

    b<=a;

    c<=b;

    end

    阻塞赋值

    always@(posedge clk)

    begin

    b=a;

    c=b;

    end

    两种不同的赋值方式结果是不同的,非阻塞赋值b<=a;c<=b;两条语句是同时执行的,而阻塞赋值b=a;c=b;两条语句先执行b=a后执行c=b。

    所以,为了良好的习惯,最正确的答案应该是非阻塞赋值<=:

    always@(posedge clk)
            begin
                q<=~a;
            end

    sim/circuit8

    一个时钟信号,一个输入信号。两个输出信号。看波形图没看懂p和输入信号,时钟信号的关联。结果网上搜查猜发现p用的组合逻辑。

    module top_module (
        input clock,
        input a,
        output p,
        output q );
        always@(negedge clock)
            begin
                q<=p;
            end
        always@(*)begin
            if(clock)p=a;
            else p=p;
        end

    endmodule

    sim/circuit9

    module top_module (
        input clk,
        input a,
        output [3:0] q );
        always@(posedge clk)begin
            if(a)q<=4;
            else 
                if(q<6)q<=q+4'b1;
                else q<=0;    
        end

    endmodule

    sim/circuit10 

    时序电路,一个组合逻辑电路和一位存储器(flip-flop(触发器))组成,输出的q依靠state确定。

    先看波形确定state,再确定输出q和state的关系。

    always @ (posedge clk) begin
            if(a == b)
                state <= a;
            else
                state <= state;
        end
        
        assign q = (a == b) ? state : (~state)
    endmodule

  • 相关阅读:
    【Python开发】Flask开发实战:个人博客(二)
    英伟达首席科学家:深度学习硬件的过去、现在和未来
    python 并发请求,转发
    多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)
    python opencv把yuv格式转bgr
    ESP32主板-MoonESP32
    游戏本地化以拓展海外市场
    小白也会的校园网宽带拨号自动重连设置
    Replace the Numbers
    协议类型(总结为主,非详细)
  • 原文地址:https://blog.csdn.net/dok12/article/details/127563198