URL
https://opencores.org/ocsvn/openmsp430/openmsp430/trunk
Subversion Repositories openmsp430
Compare Revisions
- This comparison shows the changes necessary to convert path
/openmsp430/trunk/fpga/xilinx_diligent_s3board/rtl/verilog/openmsp430
- from Rev 84 to Rev 85
- ↔ Reverse comparison
Rev 84 → Rev 85
/omsp_frontend.v
123,6 → 123,29
|
|
//============================================================================= |
// 0) UTILITY FUNCTIONS |
//============================================================================= |
|
// 16 bits one-hot decoder |
function [15:0] one_hot16; |
input [3:0] binary; |
begin |
one_hot16 = 16'h0000; |
one_hot16[binary] = 1'b1; |
end |
endfunction |
|
// 8 bits one-hot decoder |
function [7:0] one_hot8; |
input [2:0] binary; |
begin |
one_hot8 = 8'h00; |
one_hot8[binary] = 1'b1; |
end |
endfunction |
|
|
//============================================================================= |
// 1) FRONTEND STATE MACHINE |
//============================================================================= |
|
228,7 → 251,7
wire [15:0] irq_addr = {11'h7ff, irq_num, 1'b0}; |
|
// Interrupt request accepted |
wire [15:0] irq_acc_all = (16'h0001 << irq_num) & {16{(i_state==I_IRQ_FETCH)}}; |
wire [15:0] irq_acc_all = one_hot16(irq_num) & {16{(i_state==I_IRQ_FETCH)}}; |
wire [13:0] irq_acc = irq_acc_all[13:0]; |
wire nmi_acc = irq_acc_all[14]; |
|
257,7 → 280,7
// Check if ROM has been busy in order to retry ROM access |
reg pmem_busy; |
always @(posedge mclk or posedge puc) |
if (puc) pmem_busy <= 16'h0000; |
if (puc) pmem_busy <= 1'b0; |
else pmem_busy <= fe_pmem_wait; |
|
// Memory interface |
347,7 → 370,7
// 8'b10000000: IRQ |
|
reg [7:0] inst_so; |
wire [7:0] inst_so_nxt = irq_detect ? 8'h80 : ((8'h01<<ir[9:7]) & {8{inst_type_nxt[`INST_SO]}}); |
wire [7:0] inst_so_nxt = irq_detect ? 8'h80 : (one_hot8(ir[9:7]) & {8{inst_type_nxt[`INST_SO]}}); |
|
always @(posedge mclk or posedge puc) |
if (puc) inst_so <= 8'h00; |
372,7 → 395,7
if (puc) inst_jmp_bin <= 3'h0; |
else if (decode) inst_jmp_bin <= ir[12:10]; |
|
wire [7:0] inst_jmp = (8'h01<<inst_jmp_bin) & {8{inst_type[`INST_JMP]}}; |
wire [7:0] inst_jmp = one_hot8(inst_jmp_bin) & {8{inst_type[`INST_JMP]}}; |
|
|
// |
393,7 → 416,7
// 12'b010000000000: XOR |
// 12'b100000000000: AND |
|
wire [15:0] inst_to_1hot = (16'h0001<<ir[15:12]) & {16{inst_type_nxt[`INST_TO]}}; |
wire [15:0] inst_to_1hot = one_hot16(ir[15:12]) & {16{inst_type_nxt[`INST_TO]}}; |
wire [11:0] inst_to_nxt = inst_to_1hot[15:4]; |
|
|
407,12 → 430,12
if (puc) inst_dest_bin <= 4'h0; |
else if (decode) inst_dest_bin <= ir[3:0]; |
|
wire [15:0] inst_dest = dbg_halt_st ? (16'h0001 << dbg_reg_sel) : |
inst_type[`INST_JMP] ? 16'h0001 : |
wire [15:0] inst_dest = dbg_halt_st ? one_hot16(dbg_reg_sel) : |
inst_type[`INST_JMP] ? 16'h0001 : |
inst_so[`IRQ] | |
inst_so[`PUSH] | |
inst_so[`CALL] ? 16'h0002 : |
(16'h0001 << inst_dest_bin); |
inst_so[`CALL] ? 16'h0002 : |
one_hot16(inst_dest_bin); |
|
|
// Source register |
421,10 → 444,10
if (puc) inst_src_bin <= 4'h0; |
else if (decode) inst_src_bin <= ir[11:8]; |
|
wire [15:0] inst_src = inst_type[`INST_TO] ? (16'h0001 << inst_src_bin) : |
inst_so[`RETI] ? 16'h0002 : |
inst_so[`IRQ] ? 16'h0001 : |
inst_type[`INST_SO] ? (16'h0001 << inst_dest_bin) : 16'h0000; |
wire [15:0] inst_src = inst_type[`INST_TO] ? one_hot16(inst_src_bin) : |
inst_so[`RETI] ? 16'h0002 : |
inst_so[`IRQ] ? 16'h0001 : |
inst_type[`INST_SO] ? one_hot16(inst_dest_bin) : 16'h0000; |
|
|
// |
/periph/template_periph_8b.v
173,10 → 173,10
//============================================================================ |
|
// Data output mux |
wire [15:0] cntrl1_rd = (cntrl1 & {8{reg_rd[CNTRL1/2]}}) << (8 & {4{CNTRL1[0]}}); |
wire [15:0] cntrl2_rd = (cntrl2 & {8{reg_rd[CNTRL2/2]}}) << (8 & {4{CNTRL2[0]}}); |
wire [15:0] cntrl3_rd = (cntrl3 & {8{reg_rd[CNTRL3/2]}}) << (8 & {4{CNTRL3[0]}}); |
wire [15:0] cntrl4_rd = (cntrl4 & {8{reg_rd[CNTRL4/2]}}) << (8 & {4{CNTRL4[0]}}); |
wire [15:0] cntrl1_rd = {8'h00, (cntrl1 & {8{reg_rd[CNTRL1/2]}})} << (8 & {4{CNTRL1[0]}}); |
wire [15:0] cntrl2_rd = {8'h00, (cntrl2 & {8{reg_rd[CNTRL2/2]}})} << (8 & {4{CNTRL2[0]}}); |
wire [15:0] cntrl3_rd = {8'h00, (cntrl3 & {8{reg_rd[CNTRL3/2]}})} << (8 & {4{CNTRL3[0]}}); |
wire [15:0] cntrl4_rd = {8'h00, (cntrl4 & {8{reg_rd[CNTRL4/2]}})} << (8 & {4{CNTRL4[0]}}); |
|
wire [15:0] per_dout = cntrl1_rd | |
cntrl2_rd | |
/periph/omsp_gpio.v
761,36 → 761,36
//============================================================================ |
|
// Data output mux |
wire [15:0] p1in_rd = (p1in & {8{reg_rd[P1IN/2]}}) << (8 & {4{P1IN[0]}}); |
wire [15:0] p1out_rd = (p1out & {8{reg_rd[P1OUT/2]}}) << (8 & {4{P1OUT[0]}}); |
wire [15:0] p1dir_rd = (p1dir & {8{reg_rd[P1DIR/2]}}) << (8 & {4{P1DIR[0]}}); |
wire [15:0] p1ifg_rd = (p1ifg & {8{reg_rd[P1IFG/2]}}) << (8 & {4{P1IFG[0]}}); |
wire [15:0] p1ies_rd = (p1ies & {8{reg_rd[P1IES/2]}}) << (8 & {4{P1IES[0]}}); |
wire [15:0] p1ie_rd = (p1ie & {8{reg_rd[P1IE/2]}}) << (8 & {4{P1IE[0]}}); |
wire [15:0] p1sel_rd = (p1sel & {8{reg_rd[P1SEL/2]}}) << (8 & {4{P1SEL[0]}}); |
wire [15:0] p2in_rd = (p2in & {8{reg_rd[P2IN/2]}}) << (8 & {4{P2IN[0]}}); |
wire [15:0] p2out_rd = (p2out & {8{reg_rd[P2OUT/2]}}) << (8 & {4{P2OUT[0]}}); |
wire [15:0] p2dir_rd = (p2dir & {8{reg_rd[P2DIR/2]}}) << (8 & {4{P2DIR[0]}}); |
wire [15:0] p2ifg_rd = (p2ifg & {8{reg_rd[P2IFG/2]}}) << (8 & {4{P2IFG[0]}}); |
wire [15:0] p2ies_rd = (p2ies & {8{reg_rd[P2IES/2]}}) << (8 & {4{P2IES[0]}}); |
wire [15:0] p2ie_rd = (p2ie & {8{reg_rd[P2IE/2]}}) << (8 & {4{P2IE[0]}}); |
wire [15:0] p2sel_rd = (p2sel & {8{reg_rd[P2SEL/2]}}) << (8 & {4{P2SEL[0]}}); |
wire [15:0] p3in_rd = (p3in & {8{reg_rd[P3IN/2]}}) << (8 & {4{P3IN[0]}}); |
wire [15:0] p3out_rd = (p3out & {8{reg_rd[P3OUT/2]}}) << (8 & {4{P3OUT[0]}}); |
wire [15:0] p3dir_rd = (p3dir & {8{reg_rd[P3DIR/2]}}) << (8 & {4{P3DIR[0]}}); |
wire [15:0] p3sel_rd = (p3sel & {8{reg_rd[P3SEL/2]}}) << (8 & {4{P3SEL[0]}}); |
wire [15:0] p4in_rd = (p4in & {8{reg_rd[P4IN/2]}}) << (8 & {4{P4IN[0]}}); |
wire [15:0] p4out_rd = (p4out & {8{reg_rd[P4OUT/2]}}) << (8 & {4{P4OUT[0]}}); |
wire [15:0] p4dir_rd = (p4dir & {8{reg_rd[P4DIR/2]}}) << (8 & {4{P4DIR[0]}}); |
wire [15:0] p4sel_rd = (p4sel & {8{reg_rd[P4SEL/2]}}) << (8 & {4{P4SEL[0]}}); |
wire [15:0] p5in_rd = (p5in & {8{reg_rd[P5IN/2]}}) << (8 & {4{P5IN[0]}}); |
wire [15:0] p5out_rd = (p5out & {8{reg_rd[P5OUT/2]}}) << (8 & {4{P5OUT[0]}}); |
wire [15:0] p5dir_rd = (p5dir & {8{reg_rd[P5DIR/2]}}) << (8 & {4{P5DIR[0]}}); |
wire [15:0] p5sel_rd = (p5sel & {8{reg_rd[P5SEL/2]}}) << (8 & {4{P5SEL[0]}}); |
wire [15:0] p6in_rd = (p6in & {8{reg_rd[P6IN/2]}}) << (8 & {4{P6IN[0]}}); |
wire [15:0] p6out_rd = (p6out & {8{reg_rd[P6OUT/2]}}) << (8 & {4{P6OUT[0]}}); |
wire [15:0] p6dir_rd = (p6dir & {8{reg_rd[P6DIR/2]}}) << (8 & {4{P6DIR[0]}}); |
wire [15:0] p6sel_rd = (p6sel & {8{reg_rd[P6SEL/2]}}) << (8 & {4{P6SEL[0]}}); |
wire [15:0] p1in_rd = {8'h00, (p1in & {8{reg_rd[P1IN/2]}})} << (8 & {4{P1IN[0]}}); |
wire [15:0] p1out_rd = {8'h00, (p1out & {8{reg_rd[P1OUT/2]}})} << (8 & {4{P1OUT[0]}}); |
wire [15:0] p1dir_rd = {8'h00, (p1dir & {8{reg_rd[P1DIR/2]}})} << (8 & {4{P1DIR[0]}}); |
wire [15:0] p1ifg_rd = {8'h00, (p1ifg & {8{reg_rd[P1IFG/2]}})} << (8 & {4{P1IFG[0]}}); |
wire [15:0] p1ies_rd = {8'h00, (p1ies & {8{reg_rd[P1IES/2]}})} << (8 & {4{P1IES[0]}}); |
wire [15:0] p1ie_rd = {8'h00, (p1ie & {8{reg_rd[P1IE/2]}})} << (8 & {4{P1IE[0]}}); |
wire [15:0] p1sel_rd = {8'h00, (p1sel & {8{reg_rd[P1SEL/2]}})} << (8 & {4{P1SEL[0]}}); |
wire [15:0] p2in_rd = {8'h00, (p2in & {8{reg_rd[P2IN/2]}})} << (8 & {4{P2IN[0]}}); |
wire [15:0] p2out_rd = {8'h00, (p2out & {8{reg_rd[P2OUT/2]}})} << (8 & {4{P2OUT[0]}}); |
wire [15:0] p2dir_rd = {8'h00, (p2dir & {8{reg_rd[P2DIR/2]}})} << (8 & {4{P2DIR[0]}}); |
wire [15:0] p2ifg_rd = {8'h00, (p2ifg & {8{reg_rd[P2IFG/2]}})} << (8 & {4{P2IFG[0]}}); |
wire [15:0] p2ies_rd = {8'h00, (p2ies & {8{reg_rd[P2IES/2]}})} << (8 & {4{P2IES[0]}}); |
wire [15:0] p2ie_rd = {8'h00, (p2ie & {8{reg_rd[P2IE/2]}})} << (8 & {4{P2IE[0]}}); |
wire [15:0] p2sel_rd = {8'h00, (p2sel & {8{reg_rd[P2SEL/2]}})} << (8 & {4{P2SEL[0]}}); |
wire [15:0] p3in_rd = {8'h00, (p3in & {8{reg_rd[P3IN/2]}})} << (8 & {4{P3IN[0]}}); |
wire [15:0] p3out_rd = {8'h00, (p3out & {8{reg_rd[P3OUT/2]}})} << (8 & {4{P3OUT[0]}}); |
wire [15:0] p3dir_rd = {8'h00, (p3dir & {8{reg_rd[P3DIR/2]}})} << (8 & {4{P3DIR[0]}}); |
wire [15:0] p3sel_rd = {8'h00, (p3sel & {8{reg_rd[P3SEL/2]}})} << (8 & {4{P3SEL[0]}}); |
wire [15:0] p4in_rd = {8'h00, (p4in & {8{reg_rd[P4IN/2]}})} << (8 & {4{P4IN[0]}}); |
wire [15:0] p4out_rd = {8'h00, (p4out & {8{reg_rd[P4OUT/2]}})} << (8 & {4{P4OUT[0]}}); |
wire [15:0] p4dir_rd = {8'h00, (p4dir & {8{reg_rd[P4DIR/2]}})} << (8 & {4{P4DIR[0]}}); |
wire [15:0] p4sel_rd = {8'h00, (p4sel & {8{reg_rd[P4SEL/2]}})} << (8 & {4{P4SEL[0]}}); |
wire [15:0] p5in_rd = {8'h00, (p5in & {8{reg_rd[P5IN/2]}})} << (8 & {4{P5IN[0]}}); |
wire [15:0] p5out_rd = {8'h00, (p5out & {8{reg_rd[P5OUT/2]}})} << (8 & {4{P5OUT[0]}}); |
wire [15:0] p5dir_rd = {8'h00, (p5dir & {8{reg_rd[P5DIR/2]}})} << (8 & {4{P5DIR[0]}}); |
wire [15:0] p5sel_rd = {8'h00, (p5sel & {8{reg_rd[P5SEL/2]}})} << (8 & {4{P5SEL[0]}}); |
wire [15:0] p6in_rd = {8'h00, (p6in & {8{reg_rd[P6IN/2]}})} << (8 & {4{P6IN[0]}}); |
wire [15:0] p6out_rd = {8'h00, (p6out & {8{reg_rd[P6OUT/2]}})} << (8 & {4{P6OUT[0]}}); |
wire [15:0] p6dir_rd = {8'h00, (p6dir & {8{reg_rd[P6DIR/2]}})} << (8 & {4{P6DIR[0]}}); |
wire [15:0] p6sel_rd = {8'h00, (p6sel & {8{reg_rd[P6SEL/2]}})} << (8 & {4{P6SEL[0]}}); |
|
wire [15:0] per_dout = p1in_rd | |
p1out_rd | |
/omsp_dbg_uart.v
225,7 → 225,7
wire [19:0] xfer_buf_nxt = {rxd_s, xfer_buf[19:1]}; |
|
always @ (posedge mclk or posedge por) |
if (por) xfer_buf <= 18'h00000; |
if (por) xfer_buf <= 20'h00000; |
else if (dbg_rd_rdy) xfer_buf <= {1'b1, dbg_dout[15:8], 2'b01, dbg_dout[7:0], 1'b0}; |
else if (xfer_bit_inc) xfer_buf <= xfer_buf_nxt; |
|
/omsp_sfr.v
174,8 → 174,8
//============================================================================ |
|
// Data output mux |
wire [15:0] ie1_rd = (ie1 & {8{reg_rd[IE1/2]}}) << (8 & {4{IE1[0]}}); |
wire [15:0] ifg1_rd = (ifg1 & {8{reg_rd[IFG1/2]}}) << (8 & {4{IFG1[0]}}); |
wire [15:0] ie1_rd = {8'h00, (ie1 & {8{reg_rd[IE1/2]}})} << (8 & {4{IE1[0]}}); |
wire [15:0] ifg1_rd = {8'h00, (ifg1 & {8{reg_rd[IFG1/2]}})} << (8 & {4{IFG1[0]}}); |
|
wire [15:0] per_dout = ie1_rd | |
ifg1_rd; |
/omsp_dbg.v
261,8 → 261,8
wire reg_read = 1'b1; |
|
// Read/Write vectors |
wire [511:0] reg_wr = reg_dec & {64{reg_write}}; |
wire [511:0] reg_rd = reg_dec & {64{reg_read}}; |
wire [63:0] reg_wr = reg_dec & {64{reg_write}}; |
wire [63:0] reg_rd = reg_dec & {64{reg_read}}; |
|
|
//============================================================================= |
/omsp_clock_module.v
158,8 → 158,8
//============================================================================ |
|
// Data output mux |
wire [15:0] bcsctl1_rd = (bcsctl1 & {8{reg_rd[BCSCTL1/2]}}) << (8 & {4{BCSCTL1[0]}}); |
wire [15:0] bcsctl2_rd = (bcsctl2 & {8{reg_rd[BCSCTL2/2]}}) << (8 & {4{BCSCTL2[0]}}); |
wire [15:0] bcsctl1_rd = {8'h00, (bcsctl1 & {8{reg_rd[BCSCTL1/2]}})} << (8 & {4{BCSCTL1[0]}}); |
wire [15:0] bcsctl2_rd = {8'h00, (bcsctl2 & {8{reg_rd[BCSCTL2/2]}})} << (8 & {4{BCSCTL2[0]}}); |
|
wire [15:0] per_dout = bcsctl1_rd | |
bcsctl2_rd; |
190,31 → 190,41
// Generate ACLK |
//---------------------------- |
|
reg aclk_en; |
reg [2:0] aclk_div; |
|
wire aclk_en = lfxt_clk_en & ((bcsctl1[`DIVAx]==2'b00) ? 1'b1 : |
(bcsctl1[`DIVAx]==2'b01) ? aclk_div[0] : |
(bcsctl1[`DIVAx]==2'b10) ? &aclk_div[1:0] : |
&aclk_div[2:0]); |
|
wire aclk_en_nxt = lfxt_clk_en & ((bcsctl1[`DIVAx]==2'b00) ? 1'b1 : |
(bcsctl1[`DIVAx]==2'b01) ? aclk_div[0] : |
(bcsctl1[`DIVAx]==2'b10) ? &aclk_div[1:0] : |
&aclk_div[2:0]); |
|
always @ (posedge mclk or posedge puc) |
if (puc) aclk_en <= 1'b0; |
else aclk_en <= aclk_en_nxt; |
|
always @ (posedge mclk or posedge puc) |
if (puc) aclk_div <= 3'h0; |
else if ((bcsctl1[`DIVAx]!=2'b00) & lfxt_clk_en) aclk_div <= aclk_div+3'h1; |
|
|
|
// Generate SMCLK |
//---------------------------- |
|
reg smclk_en; |
reg [2:0] smclk_div; |
|
wire smclk_in = ~scg1 & (bcsctl2[`SELS] ? lfxt_clk_en : 1'b1); |
wire smclk_in = ~scg1 & (bcsctl2[`SELS] ? lfxt_clk_en : 1'b1); |
|
wire smclk_en = smclk_in & ((bcsctl2[`DIVSx]==2'b00) ? 1'b1 : |
(bcsctl2[`DIVSx]==2'b01) ? smclk_div[0] : |
(bcsctl2[`DIVSx]==2'b10) ? &smclk_div[1:0] : |
&smclk_div[2:0]); |
wire smclk_en_nxt = smclk_in & ((bcsctl2[`DIVSx]==2'b00) ? 1'b1 : |
(bcsctl2[`DIVSx]==2'b01) ? smclk_div[0] : |
(bcsctl2[`DIVSx]==2'b10) ? &smclk_div[1:0] : |
&smclk_div[2:0]); |
|
always @ (posedge mclk or posedge puc) |
if (puc) smclk_en <= 1'b0; |
else smclk_en <= smclk_en_nxt; |
|
always @ (posedge mclk or posedge puc) |
if (puc) smclk_div <= 3'h0; |
else if ((bcsctl2[`DIVSx]!=2'b00) & smclk_in) smclk_div <= smclk_div+3'h1; |
|