Problem 64 (3.1.2.5)————Problem 114 (3.2.3.9 3-input LUT)

(Problem 105 12-hour clock)也可以做一做,好像挺不错的

Problem 64 (3.1.2.5)256-to-1 4bit multiplexer(Mux256to1v)


module top_module( 
    input [1023:0] in,
    input [7:0] sel,
    output [3:0] out );
    
    assign out = in[sel * 4 +: 4];
    
    //second way
    //assign out = {in[sel * 4 + 3], in[sel * 4 + 2], in[sel * 4 + 1], in[sel * 4]};


    //third way
    //assign out = in[sel*4+3 -: 4];	
    // 从 sel*4+3 开始,选择比特序号小于 sel*4+3 的 4 位比特,相当于[sel*4+3:sel*4]
endmodule


方法1和方法3本质上是同一种写法,这种写法是verilog 2001标准中新增加的,是向量部分选择的意思,

如果sel等于0,in[sel * 4 +: 4]代表从0开始向上(方法3中是向下)数4位,即in[3:0],建议大家学习使用这种方法,在sel位宽较大是可以有效减小工作量。

problem 69 3.1.3.5 Signed addition overflow(Exams/ece241 2014 q1c)

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
    
    assign s = a + b;
    assign overflow = a[7] & b[7] & ~s[7] | ~a[7] & ~b[7] & s[7];
 
endmodule


大家注意,这道题的溢出判断需要想一想,其实原理就是如果两个数都为负数,那个相加一定为负数,但是最终s的最高位不是1,那就证明溢出了,两个数都是正数同理。

(好像这道题跟补码计算有关,看看笔记吧)
 

da

Problem 102 Counter 1-12

//题目提供的4-bit计数器代码
module count4(
    input clk,
    input enable,
    input load,
    input [3:0] d,
    output reg [3:0] Q
);


  答案:

    assign c_enable = enable;
    //带复位和置位,
    assign c_load   = reset | (Q == 4'd12 & enable == 1'b1);
    assign c_d      = c_load?4'b1:4'b1010;

    count4 Inst_count4
    (.clk(clk),
     .enable(c_enable),
     .load(c_load),
     .d(c_d),
     .Q(Q));

其中第三次赋值的    c_d = c_load?4'b1:4'b1010;

在程序中的意思是,在复位后计数器从1开始计数(迎合题意),不复位c_d =10(这里无意义,因为不复位,就不把c_d赋值给计数器)

Problem 114   3.2.3.9 3-input LUT

module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output reg Z ); 

    reg[7:0] shift_reg;
    always@(posedge clk)begin
        if(enable)begin
            shift_reg	<=	{S,shift_reg[7:1]};
        end
    end
    
    wire[2:0] output_index = {A,B,C};
    always@(*) begin
        case(output_index)
            3'd0:Z=shift_reg[7];
            3'd1:Z=shift_reg[6];
            3'd2:Z=shift_reg[5];
            3'd3:Z=shift_reg[4];
            3'd4:Z=shift_reg[3];
            3'd5:Z=shift_reg[2];
            3'd6:Z=shift_reg[1];
            3'd7:Z=shift_reg[0];
            endcase
    end
endmodule

本题中实现的是一个和 8x1 结构的存储体相关的电路。存储的输入通过移入比特进行,存储的读取类似于传统 RAM 中的随机读取,即可以指定读出比特的位置,通过 3 个输入端口指定读取位置。

首先通过 8 个触发器实现一个 8bit 深的移位寄存器。8个寄存器的输出依次为 Q[0]...Q[7]。移位寄存器的输入为 S,输入首先会填充到 MSB(最高位),Q[0]。当 enable 信号控制移位,当其有效时输入数据并移位。此外,该电路有三个输入端口 A,B,C 以及输出端口 Z。工作的功能如下:当 ABC = 000 时,Z = Q[0],当 ABC = 001 时,Z = Q[1],以此类推。你的电路中只能包括一个 8bit 移位寄存器以及一个多路选择器。(这就是个三输入查找表 LUT 电路)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值