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

D플립플롭 겹쳐놓은 상태(병렬)
디코더(사용할 메모리의 주소선택), mux(데이터버스, 출력값유지) 사용
AND게이트가 아니라 mux를 사용한 회로, wr이 1이면 입력값 받고 0이면 이전값 유지, rd값이 0이면 데이터 출력 1이면 차단

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상버퍼)로 제어하며 임피던스 일때 입력 또는 출력 사용가능하고 하나로 묶여있으면 출력값을 다시 다른곳의 입력값으로 넣어 복사 가능
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파일의
인스턴스로 엣지 디텍터 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분주기
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 검색->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분주
스위치로 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]}]
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]}]
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
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]}]