7/16 병입병출

정유석·2024년 7월 16일

교육 - 베릴로그

목록 보기
9/28

병입병출


AND게이트가 아니라 mux가 붙어야 한다, AND값에 0이 들어가면 이전값을 유지못하고 모두 0으로됨


D플립플롭 겹쳐놓은 상태(병렬)
디코더(사용할 메모리의 주소선택), mux(데이터버스, 출력값유지) 사용


AND게이트가 아니라 mux를 사용한 회로, wr이 1이면 입력값 받고 0이면 이전값 유지, rd값이 0이면 데이터 출력 1이면 차단

N비트 병입병출

코드

module register_Nbit_n #(parameter N=8)(
    input [N-1:0] in_data,
    input clk, reset_p, wr_en, rd_en,    //기존 enable을 wr_en로 사용
    output [N-1:0] out_data);
    
    reg [N-1:0] register;
    
    always @(negedge clk or posedge reset_p)begin
        if(reset_p) register = 0;
        else if(wr_en) register = in_data;
    end
    assign out_data = rd_en ? register : 'bz; //rd_en이 1일때 출력, 0일때 임피던스
endmodule

테스트벤치

module tb_register_Nbit_n();

    parameter TEST_DATA_0 = 46;
    parameter TEST_DATA_1 = 8'b00110101;
    parameter TEST_DATA_2 = 8'hf7;
    parameter TEST_DATA_3 = 7;
    reg [7:0] in_data;
    reg clk, reset_p, wr_en, rd_en;    //기존 enable을 wr_en로 사용
    wire [7:0] out_data;
    
    //parameter data = 8'b10101001;
    
    register_Nbit_n #(.N(8)) DUT(in_data, clk, reset_p, wr_en, rd_en, out_data);
    
    initial begin       //첫 이니셜문에는 레지스터값 초기화
        in_data = 0;
        clk = 0;
        reset_p = 1;
        wr_en = 0;
        rd_en = 0;
    end
    
    always #5 clk = ~clk;
    
    initial begin
        #10;
        reset_p = 0; #10;
        in_data = TEST_DATA_0; #10;
        wr_en = 1; #10;
        wr_en = 0; rd_en = 1; #10
        rd_en = 0; in_data = TEST_DATA_1; #10;
        wr_en = 1; #10;
        wr_en = 0; rd_en = 1; #10
        rd_en = 0; in_data = TEST_DATA_2; #10;
        wr_en = 1; #10;
        wr_en = 0; rd_en = 1; #10
        rd_en = 0; in_data = TEST_DATA_3; #10;
        wr_en = 1; #10;
        wr_en = 0; rd_en = 1; #10
        $finish;
    end
endmodule

결과

초기화후 TEST_DATA가 in_data에 들어감 다음 클락때 wr_en=1되면서 register에 들어감 다음 클락때 wr_en=0, rd_en=1이 되면서 출력값에 데이터 나오고 다음 클락때 rd_en=0->다른 레지스터들의 데이터버스 사용을 위해 임피던스값으로 끊음

입출력데이터 버스를 묶어서 하나로 사용할수있다, 제어비트(mux, 3상버퍼)로 제어하며 임피던스 일때 입력 또는 출력 사용가능하고 하나로 묶여있으면 출력값을 다시 다른곳의 입력값으로 넣어 복사 가능

sram

module sram_8bit_1024(  //메모리 이기때문에 리셋 없음
    input clk,
    input wr_en, rd_en, 
    input [9:0] addr, 
    inout [7:0] data);  //inout input으로도 쓰고 out으로도 사용 
                        //input으로 사용할때는 임피던스로 외부입력 끊어야한다
    reg [7:0] mem[0:1023];  //verilog의 배열 선언 1024개
    
    always @(posedge clk)begin
        if(wr_en) mem[addr] = data; //wr_en이 1이면 mem[인덱스]에 data 저장
    end
    
    assign data = rd_en ? mem[addr] : 'bz; //rd_en이 1일때만 출력
                                           //복사를 위해선 임시 저장할 버퍼필요     
endmodule

단위


클락 연결

basys 3사용시 XDC파일의

  • set_property PACKAGE_PIN W5 [get_ports clk]
    물리적 연결
  • set_property IOSTANDARD LVCMOS33 [get_ports clk]
    전기적 특성
  • create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]
    듀티사이클
    이 세가지를 clk(코드에서 클락으로 만들 변수명)로 변경해 사용해야 한다. 이러면 시스템 클락(basys3는 10ns)을 clk로 전달해 사용할 수 있다.

100분주 기

인스턴스로 엣지 디텍터 n 사용

인스턴스의 input, output연결의 이해

//100분주 기
module clock_div_100(
    input clk, reset_p,
    output clk_div_100,
    output clk_div_100_nedge);
    
    reg [6:0] cnt_sysclk;   //100까지 세는 카운터,7비트 필요
    
    always @(negedge clk or posedge reset_p)begin //clk는 10ns 주기
        if(reset_p)cnt_sysclk = 0;
        else begin						//0~99까지 세기때문에 100을 세는 카운터
                if(cnt_sysclk >= 99) cnt_sysclk = 0; //99가되면 다시 0으로
                else cnt_sysclk = cnt_sysclk + 1; //클럭clk의 하강엣지마다 1씩 증가
        end
    end
    
    assign clk_div_100 = (cnt_sysclk < 50) ? 0 : 1;
    
    edge_detector_n ed(
        .clk(clk), .reset_p(reset_p), .cp(clk_div_100),
        .n_edge(clk_div_100_nedge));
    
endmodule

따라서 clk(10ns)가 100번 뛸때마다 clk_div_100는 1주기 이다, 1주기 1us (clk_div_100_nedge는 clk_div_100의 1주기의 하강엣지때마다 나타내는 펄스)
결과

1000분주 기

//1000분주기
module clock_div_1000(
    input clk, reset_p,
    input clk_source, //1us
    output clk_div_1000,
    output clk_div_1000_nedge);
    
    reg [9:0] cnt_clksource;   //1000까지 세는 카운터,10비트 필요
    
    wire clk_source_nedge;
    edge_detector_n ed_source(
        .clk(clk), .reset_p(reset_p), .cp(clk_source),
        .n_edge(clk_source_nedge));
    
    always @(negedge clk or posedge reset_p)begin
        if(reset_p)cnt_clksource = 0;
        else if(clk_source_nedge)begin
                if(cnt_clksource >= 999) cnt_clksource = 0;
                else cnt_clksource = cnt_clksource + 1;
        end
    end
    
    assign clk_div_1000 = (cnt_clksource < 500) ? 0 : 1;
    
    edge_detector_n ed(
        .clk(clk), .reset_p(reset_p), .cp(clk_div_1000),
        .n_edge(clk_div_1000_nedge));
    
endmodule

결과

basys 3

basys 3 검색->digilent ->(reference manual = datasheet), Master XDC Files->git hub->basys-3-master.xdc-download
vivado +버튼(add source)-다운로드한 파일 추가->Copy constraints files into project 체크 필수!!(체크하지않으면 다운로드한 원본파일을 가지고 편집하게됨)->constraints(design과 simulation 카테고리 사이)에서 basys 3 master.xdc 열기->필요한곳 주석 해제, 변수 변경->Run Synthesis->Run Implementation->Generate Bitstream(Run Synthesis에서 부터 그냥 Generate Bitstream을 눌러도 된다)


상단에 생김


프로그램 디바이스

------------------------------------------------------------------


비트수 올라갈수록 2분주

basys count led

스위치로 led on/off

module board_test_top(
    input [15:0] switch, 
    output [15:0] led);
    
    assign led = switch;
    
endmodule

led 쉬프트

module ring_counter_led(
    input clk, reset_p,
    output reg [15:0] led);
    
    reg [20:0] clk_div;
    always @(posedge clk)clk_div = clk_div + 1; //2의 비트수의 제곱만큼 분주 됨
                                                //2^21*10ns 주기
    wire clk_div_nedge;
    edge_detector_p ed(.clk(clk), .reset_p(reset_p), .cp(clk_div[20]), .n_edge(clk_div_nedge));                                            
                                                
    always @(posedge clk or posedge reset_p)begin
        if(reset_p)led=16'b0000_0000_0000_0001;
        else if(clk_div_nedge)begin
            if(led == 16'b1000_0000_0000_0000)led=16'b1;
            else led = {led[14:0], 1'b0};
        end
    end
endmodule

보드에 전원이 들어가면 파워리셋으로 처음에 리셋을 한번 실행한다

basys3master.xdc의 변수의 해당하는 인덱스 크기만큼의 벡터가 선언되어야 한다(모자르면 안됨)
basys3master.xdc의 led

## LEDs
#set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {led[0]}]
#set_property -dict { PACKAGE_PIN E19   IOSTANDARD LVCMOS33 } [get_ports {led[1]}]
#set_property -dict { PACKAGE_PIN U19   IOSTANDARD LVCMOS33 } [get_ports {led[2]}]
#set_property -dict { PACKAGE_PIN V19   IOSTANDARD LVCMOS33 } [get_ports {led[3]}]
#set_property -dict { PACKAGE_PIN W18   IOSTANDARD LVCMOS33 } [get_ports {led[4]}]
#set_property -dict { PACKAGE_PIN U15   IOSTANDARD LVCMOS33 } [get_ports {led[5]}]
#set_property -dict { PACKAGE_PIN U14   IOSTANDARD LVCMOS33 } [get_ports {led[6]}]
#set_property -dict { PACKAGE_PIN V14   IOSTANDARD LVCMOS33 } [get_ports {led[7]}]
#set_property -dict { PACKAGE_PIN V13   IOSTANDARD LVCMOS33 } [get_ports {led[8]}]
#set_property -dict { PACKAGE_PIN V3    IOSTANDARD LVCMOS33 } [get_ports {led[9]}]
#set_property -dict { PACKAGE_PIN W3    IOSTANDARD LVCMOS33 } [get_ports {led[10]}]
#set_property -dict { PACKAGE_PIN U3    IOSTANDARD LVCMOS33 } [get_ports {led[11]}]
#set_property -dict { PACKAGE_PIN P3    IOSTANDARD LVCMOS33 } [get_ports {led[12]}]
#set_property -dict { PACKAGE_PIN N3    IOSTANDARD LVCMOS33 } [get_ports {led[13]}]
#set_property -dict { PACKAGE_PIN P1    IOSTANDARD LVCMOS33 } [get_ports {led[14]}]
#set_property -dict { PACKAGE_PIN L1    IOSTANDARD LVCMOS33 } [get_ports {led[15]}]

FND TEST

module fnd_test_top(
    input [15:0] switch,
    output [3:0] com,
    output [7:0] seg_7);
    
    assign com = switch[3:0];
    assign seg_7 = switch[15:8];    
    
endmodule  

Basys3master.xcd
스위치

# Switches
set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports {switch[0]}]
set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {switch[1]}]
set_property -dict { PACKAGE_PIN W16   IOSTANDARD LVCMOS33 } [get_ports {switch[2]}]
set_property -dict { PACKAGE_PIN W17   IOSTANDARD LVCMOS33 } [get_ports {switch[3]}]
set_property -dict { PACKAGE_PIN W15   IOSTANDARD LVCMOS33 } [get_ports {switch[4]}]
set_property -dict { PACKAGE_PIN V15   IOSTANDARD LVCMOS33 } [get_ports {switch[5]}]
set_property -dict { PACKAGE_PIN W14   IOSTANDARD LVCMOS33 } [get_ports {switch[6]}]
set_property -dict { PACKAGE_PIN W13   IOSTANDARD LVCMOS33 } [get_ports {switch[7]}]
set_property -dict { PACKAGE_PIN V2    IOSTANDARD LVCMOS33 } [get_ports {switch[8]}]
set_property -dict { PACKAGE_PIN T3    IOSTANDARD LVCMOS33 } [get_ports {switch[9]}]
set_property -dict { PACKAGE_PIN T2    IOSTANDARD LVCMOS33 } [get_ports {switch[10]}]
set_property -dict { PACKAGE_PIN R3    IOSTANDARD LVCMOS33 } [get_ports {switch[11]}]
set_property -dict { PACKAGE_PIN W2    IOSTANDARD LVCMOS33 } [get_ports {switch[12]}]
set_property -dict { PACKAGE_PIN U1    IOSTANDARD LVCMOS33 } [get_ports {switch[13]}]
set_property -dict { PACKAGE_PIN T1    IOSTANDARD LVCMOS33 } [get_ports {switch[14]}]
set_property -dict { PACKAGE_PIN R2    IOSTANDARD LVCMOS33 } [get_ports {switch[15]}]

7세그먼트, com은 공통 애노드 FND의 각각의 7세그먼트에 해당

#7 Segment Display
set_property -dict { PACKAGE_PIN W7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[0]}]
set_property -dict { PACKAGE_PIN W6   IOSTANDARD LVCMOS33 } [get_ports {seg_7[1]}]
set_property -dict { PACKAGE_PIN U8   IOSTANDARD LVCMOS33 } [get_ports {seg_7[2]}]
set_property -dict { PACKAGE_PIN V8   IOSTANDARD LVCMOS33 } [get_ports {seg_7[3]}]
set_property -dict { PACKAGE_PIN U5   IOSTANDARD LVCMOS33 } [get_ports {seg_7[4]}]
set_property -dict { PACKAGE_PIN V5   IOSTANDARD LVCMOS33 } [get_ports {seg_7[5]}]
set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[6]}]

set_property -dict { PACKAGE_PIN V7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[7]}]

set_property -dict { PACKAGE_PIN U2   IOSTANDARD LVCMOS33 } [get_ports {com[0]}]
set_property -dict { PACKAGE_PIN U4   IOSTANDARD LVCMOS33 } [get_ports {com[1]}]
set_property -dict { PACKAGE_PIN V4   IOSTANDARD LVCMOS33 } [get_ports {com[2]}]
set_property -dict { PACKAGE_PIN W4   IOSTANDARD LVCMOS33 } [get_ports {com[3]}]

decoder 7seg

module decoder_7seg(
    input [3:0] hex_value,
    output reg [7:0] seg_7);

    always @(hex_value)begin
        case(hex_value)
                          //abcd_efgp
            0  : seg_7 = 8'b0000_0011; //common anode, 0이 켜지는거임 
            1  : seg_7 = 8'b1001_1111;  // 1
            2  : seg_7 = 8'b0010_0101;  // 2
            3  : seg_7 = 8'b0000_1101;  // 3
            4  : seg_7 = 8'b1001_1001;  // 4
            5  : seg_7 = 8'b0100_1001;  // 5
            6  : seg_7 = 8'b0100_0001;  // 6
            7  : seg_7 = 8'b0001_1111;  // 7
            8  : seg_7 = 8'b0000_0001;  // 8
            9  : seg_7 = 8'b0000_1001;  // 9
            10 : seg_7 = 8'b0001_0001;  // A
            11 : seg_7 = 8'b1100_0001;  // b
            12 : seg_7 = 8'b0110_0011;  // C
            13 : seg_7 = 8'b1000_0101;  // d
            14 : seg_7 = 8'b0110_0001;  // E
            15 : seg_7 = 8'b0111_0001;  // F
            endcase
    end

endmodule

decoder 7seg->FND

module fnd_test_top(
    input [15:0] switch,
    output [3:0] com,
    output [7:0] seg_7);
    
    decoder_7seg(.hex_value(switch[15:12]), .seg_7(seg_7));
    assign com = switch[3:0];
    
endmodule  

msb-lsb 순서 변경
코드로 짠 case문에 맞춰(최상위비트부터 a시작) seg-7의 인덱스 순서 변경

#7 Segment Display
set_property -dict { PACKAGE_PIN W7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[7]}]
set_property -dict { PACKAGE_PIN W6   IOSTANDARD LVCMOS33 } [get_ports {seg_7[6]}]
set_property -dict { PACKAGE_PIN U8   IOSTANDARD LVCMOS33 } [get_ports {seg_7[5]}]
set_property -dict { PACKAGE_PIN V8   IOSTANDARD LVCMOS33 } [get_ports {seg_7[4]}]
set_property -dict { PACKAGE_PIN U5   IOSTANDARD LVCMOS33 } [get_ports {seg_7[3]}]
set_property -dict { PACKAGE_PIN V5   IOSTANDARD LVCMOS33 } [get_ports {seg_7[2]}]
set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[1]}]

set_property -dict { PACKAGE_PIN V7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[0]}]

set_property -dict { PACKAGE_PIN U2   IOSTANDARD LVCMOS33 } [get_ports {com[0]}]
set_property -dict { PACKAGE_PIN U4   IOSTANDARD LVCMOS33 } [get_ports {com[1]}]
set_property -dict { PACKAGE_PIN V4   IOSTANDARD LVCMOS33 } [get_ports {com[2]}]
set_property -dict { PACKAGE_PIN W4   IOSTANDARD LVCMOS33 } [get_ports {com[3]}]
profile
개인 기록공간

0개의 댓글